{"_id":"ugly-app","_rev":"1037-1008b9bc4ec900a7df675157ea397260","name":"ugly-app","dist-tags":{"latest":"0.1.1061"},"versions":{"0.1.0":{"name":"ugly-app","version":"0.1.0","_id":"ugly-app@0.1.0","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dcf21b9757e9c79088dcdf54bf94051c892c6543","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.0.tgz","fileCount":554,"integrity":"sha512-2Nb6SQIAVpb6Ys0m/ZUZqaF33THZlBnN61knMn4TgjBOviRbizs+Z5ppq4Z9np+gT6pw39E73ApexVtWvhEZ/A==","signatures":[{"sig":"MEQCIDalel3otXF2TtPwPEHZyeNoOaQ1/z7l+/1F4YdijmogAiBscfU98WZXg4nVAhnwQCiVWlKdjQ/Xxln/1EFw2ce7Sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":971208},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"3162de8bd270dda9e54bc54af4b56ae8ee3d5bdb","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","openai":"^6.32.0","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","groq-sdk":"^1.1.1","commander":"^12.0.0","lru-cache":"^11.0.0","elevenlabs":"^1.59.0","handlebars":"^4.7.8","together-ai":"^0.13.0","concurrently":"^9.0.0","@deepgram/sdk":"^5.0.0","cookie-parser":"^1.4.7","@fal-ai/client":"^1.9.4","onnxruntime-node":"^1.23.0","@anthropic-ai/sdk":"^0.80.0","@aws-sdk/client-s3":"^3.700.0","@google/generative-ai":"^0.24.1","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^7.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","html2canvas":">=1.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"html2canvas":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.0_1774409172131_0.6563405019585808","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"ugly-app","version":"0.1.1","_id":"ugly-app@0.1.1","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"241168064587689e9fd02f8467b3cd595dfc7324","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1.tgz","fileCount":538,"integrity":"sha512-3DzinsODWyN03fA5SDxZQuXsS2HNt1RY1fvtd2F738Oy9RXtqVjvLGBds7dpwa+2acV6yDO8J7gr8fAKRTtOfg==","signatures":[{"sig":"MEYCIQCKWxbzShTP5A6efgeEs+3ljrBoeeDwNatM08G4vET2ZgIhAKzJtsn/72u2g9PKT3uFmN5qarccUYHZThEZaaLshNzG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":942639},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a3c76dcb8e0cb538b7c820293a0f978a342c8b6d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","openai":"^6.32.0","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","groq-sdk":"^1.1.1","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","together-ai":"^0.13.0","concurrently":"^9.0.0","@deepgram/sdk":"^5.0.0","cookie-parser":"^1.4.7","@fal-ai/client":"^1.9.4","onnxruntime-node":"^1.23.0","@anthropic-ai/sdk":"^0.80.0","@aws-sdk/client-s3":"^3.700.0","@google/generative-ai":"^0.24.1","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","html2canvas":">=1.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"html2canvas":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1_1774409801445_0.774027941536628","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"ugly-app","version":"0.1.2","_id":"ugly-app@0.1.2","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"05c6a358182e905bb229dda6bd442af7f4b0b5be","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.2.tgz","fileCount":538,"integrity":"sha512-y6Hu74oR3AWIvLAxdEnSNTCPHdxy/2DjR3/GyUs6iOmF8ODwhrYD3EvZBN/+Q5lSm92A4J5M/VVmNJ2B6clNYQ==","signatures":[{"sig":"MEQCIFvF/LBKDPPcpRnh98BQNVr7uyDE+kI4xEsd+YPE40kIAiBpnrOMR9QcTZAAzwhx+LkDG6Yyk4wUARt8wxUZjFjy2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":957536},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"93b14dd997487e5328d9d74965c88fa930532d81","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.2_1774410433826_0.49846193921392357","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"ugly-app","version":"0.1.3","_id":"ugly-app@0.1.3","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"71212c4756fb514471e7ac55df8cadc7dfa6e297","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.3.tgz","fileCount":538,"integrity":"sha512-0j/vZB224da6YcwVOZg0DbbJlQNawy01cp2nCvzueVVz5cuS28SfiMmUgi3oZn71MXt6I+jVqGFJF+vfPjm8jg==","signatures":[{"sig":"MEYCIQDtP7gU3/dSBp9ODcwPQ0sYF6/EGm2RjD+GmKp++roH+AIhAKgU9WFuAj/ETYh0HxNZqYqoGuayauzgCjif4GgAk+z/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":957536},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5d7656306827589b6670c487d7a7edf077959c9d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.3_1774410550475_0.5657542668199567","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"ugly-app","version":"0.1.4","_id":"ugly-app@0.1.4","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ab924cedaf426fd912a369973c6d6d413f9f2564","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.4.tgz","fileCount":570,"integrity":"sha512-hhKon8QdsQ8d4eRCzqEx73feik190k9rSaV16VaP5Pz0Kp3J5lR8sW7zilm2MdLEw+xuoVirSCDeQfvU8kuF/Q==","signatures":[{"sig":"MEUCIQDB+krr+CFLx0QcAh9S3Q85JI24Xa33FFoHD2h3SN8YnQIgLRNJBh5h57o1nkj3I8xyazXqbMcagI1MwD809ETekjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1039991},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6189e5035efa057f092142e871b628889bda35c3","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.4_1774415873776_0.7946194967193296","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"ugly-app","version":"0.1.5","_id":"ugly-app@0.1.5","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c80d5ebade432fda057aab14952fb98e0e0a4aab","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.5.tgz","fileCount":583,"integrity":"sha512-3CRFy+YIu+VWrD2AGLXsVqr4oie++4z7tA1RlZ0z6lmKZLYy2DSYwxm/aFCGv1J5d0eH5BkZmQ4Z5+wFsHP90g==","signatures":[{"sig":"MEUCIQDqEH4zkUaCeyVMl0qibEHJYtrxBV2dy927CuVd3nHB0gIgZnWspj/44SAIWrLR+/5JwPvVpDAr7zCdZiL1xtr6Fd0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051301},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5ccaddf216ec3e754866b89d295d76c54fc05e64","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.5_1774416045913_0.16384440557871938","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"ugly-app","version":"0.1.6","_id":"ugly-app@0.1.6","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0e53921e1211c0adda873f60ff48455a29d472f6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.6.tgz","fileCount":583,"integrity":"sha512-lqznWYFcAobOtgQBeQniHOepAdoDlSTFuuXLmggEDn01ZLGzeLIzFwiGkUB5J7P01GpOUgBgczjYi/vKqQ7Y5g==","signatures":[{"sig":"MEYCIQCTE1Jrp9SUlzC7JgDpEwJud/xn1xCan+keuNyfImCEPwIhAPi+OQDuRCwjQbu4USbD1rH/ajdPsco0PosDJ1lJh4Fz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051330},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ed848d8a2c483eeadc66912c7f4d0ab94efc7218","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.6_1774416207445_0.09204784590973447","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"ugly-app","version":"0.1.7","_id":"ugly-app@0.1.7","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5ba2b49fa5059aa0910784815c943e5e6dd4a93b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.7.tgz","fileCount":583,"integrity":"sha512-fyaXcSLYGPM7aIvLu0rARvGk2mVYfeKBFN1ot77RLMH9Mcsg7WvHEnezYyjPzztM2RHEFAQkmUXei1r5DWNSXA==","signatures":[{"sig":"MEUCIFupqI7QoSUM4p2TkBVbfN+Q3T/FMLZA/9v/iRXXnWMuAiEAnNfsFpeNKeN0Q0V5kj5QGKzr156IhI8jCzpmsLsPETk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051286},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"29048661b109cb1bb675539de426b475bb092ff5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.7_1774416344403_0.10047946145646103","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"ugly-app","version":"0.1.8","_id":"ugly-app@0.1.8","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b50115dbc7d794745def87f676f1e2ebc914eb43","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.8.tgz","fileCount":583,"integrity":"sha512-mGYLAwXp5BLlHy0tW9zFnxcMdb2rytoopZcJLprm5mRhyHDxbI0kbcJV8Q20qtKVlh3LIz8KD4davrri+qaGjA==","signatures":[{"sig":"MEQCIF8sVc0hZVJxd3D4/qNnWHbzs/cSvCZ47ma1A6Umg4XrAiBVabiUFHt29LNZY3Lv7IZKOQsLy2ltWWMEBygnoM5XrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051469},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"19ab8def8a631e6de9002b046232f81911fdbec8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.8_1774416548925_0.5536720286410792","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"ugly-app","version":"0.1.9","_id":"ugly-app@0.1.9","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7a3ac1fd03eb3ea413d75165afb23d70b7f99ad5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.9.tgz","fileCount":583,"integrity":"sha512-eGI86oIvSpkyWy/IDhbXX6dhBYU5M5a30bWmHh7nVc97MDpJ4aGdzvqQNFw0M31zpNlKM1bRFdPSKabEAs4CQw==","signatures":[{"sig":"MEUCIGKBmZmf9Wqngd4u7edFGyHpqOs2FL17e7dgFWIkvD+MAiEAwR16Mwo3Sa+TBPM33EknZcbAg0csViKOZniWVz/lfrw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1052509},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"15bfc4adc3fc363087d5dba0fcae764fdac49729","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.9_1774419438400_0.8285652154931518","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"ugly-app","version":"0.1.10","_id":"ugly-app@0.1.10","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2806a24d44ce73b0c884ac46a6b6df46b3aa8ce3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.10.tgz","fileCount":583,"integrity":"sha512-1oMeen/OFtwSM0PKTGY8UJyKRdZEXDQiE4tiHPHJashhtvz9ox3Us/PLuyaSGf0p/gnkNJvTzjdKukTS1VSygg==","signatures":[{"sig":"MEQCIEvXiuwnqs2BQyE+g6MvNc7EWRsnyeRaYkep8qalKuYEAiALbbnIcdWkdkqHJjWSL96zow4lvW7mn3HkWhAs3faOow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1053132},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"97165adc2a5a6a294a909a19b3b8597d88c0084a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.10_1774420794182_0.9525224419487333","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"ugly-app","version":"0.1.11","_id":"ugly-app@0.1.11","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f375f4cf7263952b0a315367718d7e1750b7d828","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.11.tgz","fileCount":584,"integrity":"sha512-ntmFk2HjZXNg++FvdMfRvv1zupIAuuI71w31oy+N32iDtBuftvAZWKwFmzhmQqe3FaAKKtphjBQnRd2lbG6mTg==","signatures":[{"sig":"MEUCIF097KL9cOp9tgNeCaoRQn/s40ovgU28X+7R42vDVoUQAiEA9QB33Q5RgSkHstlP7CAEbH/lk1l+R1vdC5UL2qCHL18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1053746},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a63fa53848dad7c53d994eae75987ec52d877980","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.11_1774421078293_0.2611228336149449","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"ugly-app","version":"0.1.12","_id":"ugly-app@0.1.12","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ebb317ea2870b9561973d424751a1210bc6a3079","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.12.tgz","fileCount":584,"integrity":"sha512-a5HEQldjYrxNqZXgY16eJiX3QaQkx61LmeM9BfCauR/RwVteYOzyqD8QHF995EnEidU+MgllsuSRQTCjGkusIg==","signatures":[{"sig":"MEYCIQCFvrQm8BDBmljRVsVDL+tVgtbQc4VOoC/M8nzjqwjUqQIhAO7cIAkl4IsjlJqoIDQk9OQBam5KnDZ0i6czAHRG4KXg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1054344},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"15e918633651551179dd486a0b2ee829c9c2420a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.12_1774450837207_0.43645402251141285","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"ugly-app","version":"0.1.13","_id":"ugly-app@0.1.13","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a6a33be967c547ec2af417e7cc629633ab8bab77","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.13.tgz","fileCount":586,"integrity":"sha512-TCEO6HfnvbzBZ1D4Xi+CD2JIxzZZocOK3Ds/NYjuoCOAQVyZ4MFFjhooCIglz4mVrFDGEBR99AqF016Vryc22w==","signatures":[{"sig":"MEQCIGL+wsEuGV39IYIpvY9WVcvTBk+MiZqiKXQbrBCCtTUbAiAzSzjegXoqjIJqoYIWy0yyGc/w6DV/lRkGAryJwmR7jg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1055294},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a03cf2e1a724db0c72306fee7942105d5f632996","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.13_1774451258037_0.7123727377719411","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"ugly-app","version":"0.1.14","_id":"ugly-app@0.1.14","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7beee517aa6e67554e19763d766d5cadbc83ac27","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.14.tgz","fileCount":586,"integrity":"sha512-UaqQ2znjX+0usDDqCaIp6ndh09/baNOgKyaUET9QlsIRlrPDmpHOr1SHRr21E4JXaRMSMT+Mv2vnhTHd4CxAtA==","signatures":[{"sig":"MEYCIQCjiDrzkAl4sMnUl00USje8ux4Vz+tT1oPSm3tPCcbJzwIhAJXs8ByAiT65Py7aIL53KjYQ7tPSRQiEAZpjcusW0Ntf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1055394},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5803307d7b6dd91e7cf73c6bb2b23b471bcfce2c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.14_1774453301225_0.6700113396029115","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"ugly-app","version":"0.1.15","_id":"ugly-app@0.1.15","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a99364be6e628d6fc61101e17faefff2503a9d2a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.15.tgz","fileCount":586,"integrity":"sha512-jvcvtYCMdLW5sbLwJhows3LbdaxSZW2GOcMsLGXiTX55LK4aiahA1//E6GaBSuSPEBiZxmpWrtTIhAyrecILhA==","signatures":[{"sig":"MEUCIBM9hCSCzT0MvGdxpWKpVXGpbfAieLRlsVqix2XJhju7AiEAzMOKuPb/kl6wP1bw2dza5jIjt+i+3P/hJra13w4Lab4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1056222},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f0f26f0d424899c69e063ae0af677d23f8b8d3a0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.15_1774453924629_0.8466082942581399","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"ugly-app","version":"0.1.16","_id":"ugly-app@0.1.16","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9d0a0c7de45d516f6a464a9ae58451aa0674b408","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.16.tgz","fileCount":585,"integrity":"sha512-ygVC9zr255umwFgo5k3gh5nWthz5dcwMQj8elCHOfu/fSa7KnFZFb04fmWp8qpISA86LvTOvnEE3kzshszq3+A==","signatures":[{"sig":"MEUCICLUdoQYjNcIwTuJZC0pW+iAvBhXiXCnogvtV5EaWYOEAiEAq4gDmHcR9kYJKCw3BJmmkAybUQhj8UklG0znTv5nics=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1054995},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"cbd9592494d3e369c1c6b0803a0e1722999e3788","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.16_1774454172599_0.1484487237760055","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"ugly-app","version":"0.1.19","_id":"ugly-app@0.1.19","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1428beb0b2b432768b657404adbeb28fbdef1fd7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.19.tgz","fileCount":633,"integrity":"sha512-Sviqs1NTktJV4NqK4GLRm3rPerL5veoM6bq39GLVvMpTZPIWAXX5juwF2XjkgGejV1di2P23wQ9sxfibIqlvJg==","signatures":[{"sig":"MEQCIBv9pCFk+Ao1XE5aGJtwyMAnah9ihvL+mdoEcv1K6KKZAiAYf7eSMglPgq8xsIgFlbktTPfxlVgkVsLibDWDLSojiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1208670},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"3042806f1e0dfab4b737e14b22002d5723dd64fa","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.19_1774493913668_0.6977377679108578","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"ugly-app","version":"0.1.20","_id":"ugly-app@0.1.20","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b79fdf6ddee39e081c9074804d4344f18b81a802","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.20.tgz","fileCount":634,"integrity":"sha512-dYq8BNJp+6yLEXNCirbK++w5fpnd1Mp2dj0Oltjm7NHp2DSOXNRjPwOE9ECc0bCSXenOVVEE05cvMoi95XHhkQ==","signatures":[{"sig":"MEUCIQCCacE5A/hE30Ol1PnIWgXU2tpB22aQN6olepwzDORMgwIgNFQUpkzHFJCtgoWeC8iXNkKL+dylYFhKN1u38GkTvYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1212573},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"52f69d57ad9103dfc7d93da68bae2980f3e761c7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.20_1774494053075_0.18374796775992652","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"ugly-app","version":"0.1.22","_id":"ugly-app@0.1.22","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1c3ad67ae5bbf7e6ec042134dd9d5c7d08987ca2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.22.tgz","fileCount":638,"integrity":"sha512-Yt/8cQmkrpeLlWhiJanScIF60gPiPbc5bbfgfwAAQFm0/R7cav79rKum+zRhU+n+xWSv4y6LDyRB3XpqxYM6vA==","signatures":[{"sig":"MEQCIBemMwEXYAclypIaodDhvR7YGjP2MdJF8wJticwIpOOrAiBVWyfwIA5v59zUp5Hj9e/6Sc14npKQDfinH2sskf3owQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1274453},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"604eba3cfab57691b26a73c0aede68fadd88090d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.22_1774500007972_0.1530796997804662","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"ugly-app","version":"0.1.23","_id":"ugly-app@0.1.23","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"618260495575b1207d2c75c1115757b09868b762","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.23.tgz","fileCount":638,"integrity":"sha512-l2GWOZKtEcYnISNlrxuRUBMVSG0A3mMKTGAyJOXQEIgAvXvfIsfCMW4bB6j/ZOqxGTKFCkTjqSE2/yciGzvW1g==","signatures":[{"sig":"MEQCID6nRF4ydJ0J+AL9teyelVnJQKezLoIlaJsa91tL1C+EAiBvSZ3ed0c3tzwCqDaIMHxwJNh2x+62+uZboGySc4OMpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1274453},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c837827c837aa0227bc2550ff27f8e92115be653","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.23_1774500081040_0.6135356200042805","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"ugly-app","version":"0.1.24","_id":"ugly-app@0.1.24","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"41bbcc57e51bd186f57ce7ace3ee75e42ff32ac3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.24.tgz","fileCount":638,"integrity":"sha512-tOtNNGUZIg8zBrY0jVF2qqAgDmg09IXcMJPJ+EnV3Ibxi1+x2Vz9G3iksvwRL9uZ4n1l1J7h0fhDA6EyR/272g==","signatures":[{"sig":"MEQCIHe2IBSB6BdpQBm1rdcUrdJT2TyZ0x4gdHWnkvgp1jnhAiBrgtR9EIjcboHLSi0XBul/AfMBMUgQygTPNTCyD6KLZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1274571},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"4bf1e6ac5a283af28abbe20c23344667acc4d4e6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.24_1774500478696_0.30430102094789513","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"ugly-app","version":"0.1.25","_id":"ugly-app@0.1.25","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e728778a28a253cd7b9e1223529e448ad07e4b80","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.25.tgz","fileCount":638,"integrity":"sha512-KD36pQASd99rht08NgbaiFoJ3c+W788iqxW6ydsV6odEAAIdKLYUkZ4OY60luvhrEwjPCfEzeo1e8Dk+SZ3yXQ==","signatures":[{"sig":"MEQCIDsf4lsj4KYMoINUoUthgJuJ2M4BNUQfYz7ZCZYFsPT9AiAgP3HmCyHnR+g9CLkZ9BxDarBTlL+K/qdi8fCQidvZTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1274573},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7359d40eb7b05f771eb1eb6fb3bce02bb020295b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.25_1774501927347_0.6553767369587902","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"ugly-app","version":"0.1.26","_id":"ugly-app@0.1.26","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"782c25c391a6d6181b35a6693593823f183df49f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.26.tgz","fileCount":638,"integrity":"sha512-Y3mp8bY2JSxhPUTiq8OPxZ4Od9YFWQl2pv43JtjKx7DSlJUvsEpja3hDkgosmLKydk2fB3UHxFa/raWJ7/bSpw==","signatures":[{"sig":"MEQCIGs+qm9RIMwZdipDhusg/51kCLNBXkRvOUXckKiKIhNfAiAUFEls5WcCHCTadIk/9EPDTMjC4g7jvTMs5j3Si0334w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1275048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"26ab5475c5753e98b779d582d8403159e22d9234","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.26_1774502069249_0.03578436856722256","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"ugly-app","version":"0.1.27","_id":"ugly-app@0.1.27","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"51836b44412d06134a389c6bad462f41e2cd6e2d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.27.tgz","fileCount":638,"integrity":"sha512-Ht1Ye/YQ0Eii7xFarwvIo54Xn4tiUg461bpbfTMaB1fhNahxwhc3f7hq2t69UC4qGkXk62ZWgzcL/o2FP1cIWA==","signatures":[{"sig":"MEUCIFF2aXPKIYCiAkGnLOx3qS6nHQSBuw4kAfhNep/wnLzOAiEAtAzyrnivG8YH7XVVnbOxkZqGfAV4sC5SiGFdL/NGkBw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1275048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"82698c8962ce60110e7f49b27a0abbf4c1d5aa63","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.27_1774502700099_0.9117370076414439","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"ugly-app","version":"0.1.28","_id":"ugly-app@0.1.28","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b0ea7324909772e8373fcc39bdd7f63f020424ce","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.28.tgz","fileCount":638,"integrity":"sha512-hZA2sw+1Xmcpro57jVy3oMtDpsk2RWxWQmO7g1OCUKXQavpGaXfCa2sytp+OaptYqa8ICbmA3ohwvT93gf4BPw==","signatures":[{"sig":"MEYCIQCH8nFgZdSffRhZI9Ca4G3X9zQudCuc6dFH0+4UcGJRegIhAMHVWIdVRC/lt0OMjuV/XMwoHv4HpdOy0JMCb8PLo8rV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1275163},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"4d1ab82c0cdacc272d5af837bc729df4772b295e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.28_1774502855919_0.26459123456703204","host":"s3://npm-registry-packages-npm-production"}},"0.1.29":{"name":"ugly-app","version":"0.1.29","_id":"ugly-app@0.1.29","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"29c5fb515aba9e6b29c14ef8d8373509310b6004","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.29.tgz","fileCount":638,"integrity":"sha512-sLUbGzo6fqDhJVfG/+2z5lnB79WJ4vsA+xd/uV0piorVXOroRgQTo+Zz84yTlPxa4nubsInpo4n04cagw65ryA==","signatures":[{"sig":"MEQCICl5HcCZES1S3sL9hP34GB0tQIqptNGp+TvxjFNIJmlQAiARpIL1MM0TwmU7oLMU9/inUCcc75LT2n1hB4ppZHQ3Dw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1275229},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c0ba052ecc2e1f7723e88ca69e0d879155cd86eb","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.29_1774503205840_0.7074131409096696","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"ugly-app","version":"0.1.30","_id":"ugly-app@0.1.30","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1d903a7b3885b46d330bb124db90063759479a73","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.30.tgz","fileCount":638,"integrity":"sha512-ABubUHOtpLBnG154vNwwyWalacYrzNmI9ANfs3i4IQXf1ird1m0Oa9HYro6+QTb32VOKq9xCKLXCV15Z/EGzzw==","signatures":[{"sig":"MEQCIFHzbnnCZxq+70u/6xlICRXp/2TM56MhJy6CCZUJdd3xAiAjMmOejMt3U0/Nfksxx0bJltCTaSo10SqFYM1e4VjdJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1275229},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6c5cf4fd0b62f74df987dd5da1953090c4775cbf","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.30_1774503320091_0.12956617534707782","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"ugly-app","version":"0.1.31","_id":"ugly-app@0.1.31","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5cece20488519ec46cf5bb0b48863456121fa0b1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.31.tgz","fileCount":638,"integrity":"sha512-Vx/TwZ0ZYrV3MJsHG3D2xecXd6GxtjtlMCP9PyUudXy7buzBqT7Zg3vuPKTDcURbjnDQ8i2AWVYCp+tzKax4yQ==","signatures":[{"sig":"MEUCIQDxrXirFw6VYL4EOQnddjDJCryTW0JPs+e5rdJ0vQJO4gIgIBQS/EPVLBxFSY7CX11h0hgfA58tC+wsf8sHfMxEDxs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1276487},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c60ba9bd6da7f0940ebbbc83f585cdd8b1d63aa2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.31_1774503661772_0.4845962571055056","host":"s3://npm-registry-packages-npm-production"}},"0.1.32":{"name":"ugly-app","version":"0.1.32","_id":"ugly-app@0.1.32","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0d6b1ce8e17f09019b92fb5849c0186ffe490f0b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.32.tgz","fileCount":638,"integrity":"sha512-PGSns4dw2D98q0dv8nNao3vY0DCr4y3HifpjcN4S+g+nHkLhAlKhfhJZ4iSHKydoQ0nMOINyb+dSrg5TGOPSog==","signatures":[{"sig":"MEUCIQDLyRpuoS0jVGgJnoeutfBVePasdp2EH2cnVFncE3xchAIgS/dxNJww9W1PuqFwrTWAkbpJbxBHaNgcEPNn9OgyR6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1274525},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"63caa030cfc81920539af7e4024a065d48185bf6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.32_1774503803184_0.34733526854012675","host":"s3://npm-registry-packages-npm-production"}},"0.1.33":{"name":"ugly-app","version":"0.1.33","_id":"ugly-app@0.1.33","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f5a96a074b9dca24640ea02613ac9785f83ae348","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.33.tgz","fileCount":638,"integrity":"sha512-OhaN2oSpM7HY0D/hqm6dFxxtd98dku9MEGJCgVfkhjcV5uDRwnIrX8UXdq8LvS9UPyxjjRAYTYqZuvyTrooHAg==","signatures":[{"sig":"MEYCIQCEJtwNX8JnIAXFIP8tQGmLIELxHg5ewNPVIPSNO6LDdQIhAKLg6MR6TUYl8LL+LyZZSsPwYeFNy9/AI8MqaEw60271","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1278363},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"510f3591296b6a0eab4cfbea8f692e0dc2f32ecb","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.33_1774504325801_0.06692048619309254","host":"s3://npm-registry-packages-npm-production"}},"0.1.34":{"name":"ugly-app","version":"0.1.34","_id":"ugly-app@0.1.34","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e4fe8089801c1e9acb300153e285f5331bf870ce","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.34.tgz","fileCount":638,"integrity":"sha512-cXgWEICZIDprtOWw8MaKTWaGh4g4IfgBSwfqlK+Rc5e4Dggk1elU8KPwqdeC3odisXX8XNSSMNJIMCd87koVVQ==","signatures":[{"sig":"MEYCIQDxoZBkvmR0ylSSBNqyzBF8tYx+V38g7S6InbB+f1LCbAIhANgNCP5PSyGlXL5yx+j/LJ1nuCeMl2n4yGOBd5SjDJ65","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1283537},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b9a26668ab96e7d78241a13ca92cd4423af6226e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.34_1774536940046_0.5832113578720395","host":"s3://npm-registry-packages-npm-production"}},"0.1.35":{"name":"ugly-app","version":"0.1.35","_id":"ugly-app@0.1.35","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"70ab3e5cfcfab5a8d91014cb9464fa0de38d99e9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.35.tgz","fileCount":639,"integrity":"sha512-1lqlQvYfiCGXjIuPqN4VYOfqBNEtz4qbBfNywHDIw2KgdIg7Ay1EnNi/znQ+U877lATXkycQcW6Z7E61ITwiPA==","signatures":[{"sig":"MEYCIQCj8P9y3rIdeXfJCO+gXSsGcarL8P6SSdbvu3zd5ejuyQIhAITocB1mmp/Rz0wNqljKDiahli7FS6jXnX4bEebTyRzR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1293381},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5ac582d59f0e4d1975bd58107462435c0a1040c2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.35_1774555062759_0.1364081069533658","host":"s3://npm-registry-packages-npm-production"}},"0.1.36":{"name":"ugly-app","version":"0.1.36","_id":"ugly-app@0.1.36","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3520d1dca6ab98097f52d1585e5bb558dba5404e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.36.tgz","fileCount":642,"integrity":"sha512-367WSR4c6vB6Ej2oPMg/v1oKPyOcQhcsBixUtEtwFd2pztC1/I1oBLF8Yv0CpbkMJsq9s05VvVA/y8fODa7siw==","signatures":[{"sig":"MEUCIAVOx0SA88zPNp/bagFQrihrNiReQOzG1Jb2lg2bzX1mAiEAgcrHo3ZKzGqcYVjHsbGoIN9BRxBYXGpMc9il7S0TmgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1297368},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"64b58f517e2022b4887b5b80b7787b1d4ed03121","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.36_1774576413790_0.9938926366485525","host":"s3://npm-registry-packages-npm-production"}},"0.1.37":{"name":"ugly-app","version":"0.1.37","_id":"ugly-app@0.1.37","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bc58b9a5b3db3558e2dc6d77567c40dbb0f40296","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.37.tgz","fileCount":642,"integrity":"sha512-mPASq8wJThWILAiUkAWOQdmKmhpoZ3FjZtSzYMV5HXWcQ2G5SfW8fhY9db5zpiQZpPl/CbXFIXS7OjdwrX0VWw==","signatures":[{"sig":"MEUCIQDuUSzSSxVhtx2q1XxkmFNi9uljHS90BGnrhcBaygf4wQIgRJcp43HMA1qCU2E8yK3qvGLYSF/euDDDJ3Ci1C3fJ6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1296631},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5804bd1243753e269dee02649f31dc3c86ce1eee","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.37_1774576581607_0.941033562206834","host":"s3://npm-registry-packages-npm-production"}},"0.1.38":{"name":"ugly-app","version":"0.1.38","_id":"ugly-app@0.1.38","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8bbd5671cc467fd4c460c7613ec9d30cabdf2d2e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.38.tgz","fileCount":646,"integrity":"sha512-qZdlaz9j+GRDeo+MaNysIBHNINV9BIAj3R0DUZQqydNmM/OzpL2xJKUNtllQ2EuJ7xfIg+2+Gi64XXWd8F1NkQ==","signatures":[{"sig":"MEQCIE6pMCgDXMPIla8EI36jhR2hnFOGOVs6zsVqgQ46LTYgAiAXyAsQtZYrtBKkIyyr86Sy1DUNsGLS/H40zcufGMQU7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1310275},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c0c580fc9ac18fb091c3dc88a0fe4c1a3f20acc0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, templates/server/index.ts and update templates/CLAUDE.md to accurately document the current ugly-app API patterns. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.38_1774581810591_0.7856899176273107","host":"s3://npm-registry-packages-npm-production"}},"0.1.39":{"name":"ugly-app","version":"0.1.39","_id":"ugly-app@0.1.39","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8eff46c2a01a495039fba91c88b6af316ce798d2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.39.tgz","fileCount":647,"integrity":"sha512-SxCavLOpYUWsD5OH0/hXQx8nlawUamX7vmAuou6Gij2b07mKgkJEPj4Tqx4o9z79KG+esuX93yaWk7uZqIKemg==","signatures":[{"sig":"MEYCIQCrk5AusgKBqttNUUNV79oxuBoOPcL4JlK/t6h9Mr6NrgIhALHOgRuNOob0aMQNsZk9Lv+suH+P59KNwnR8ud239KoJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1314612},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c8c84a5d3b4f3fa2408d53520a7a367b055c06ad","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, templates/server/index.ts and update templates/CLAUDE.md to accurately document the current ugly-app API patterns. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI in","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.39_1774584251488_0.1718537066045347","host":"s3://npm-registry-packages-npm-production"}},"0.1.40":{"name":"ugly-app","version":"0.1.40","_id":"ugly-app@0.1.40","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"08144f8ed935b4dbc5cfaaedf62c835c3102e16f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.40.tgz","fileCount":647,"integrity":"sha512-+1gte/DDd+/0VMTh0MZL2YuZ9JIBAJiWacVVQnD0nj7IF7sWhq0VW2PssYdb2IsgujMOgXDuhYaePmXenaVAlw==","signatures":[{"sig":"MEUCIQCydo1jVTpYz3G8Enxy5n6rFwLqEwwnA55YxaYPMErdigIgd4YT04f0UoPkUhfBOKpWJvtIralGAryq/cnUARl6pBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1306009},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6f3030e960aee614049152175ec198bd8b1418d6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.40_1774585378105_0.51543709104908","host":"s3://npm-registry-packages-npm-production"}},"0.1.41":{"name":"ugly-app","version":"0.1.41","_id":"ugly-app@0.1.41","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"90620833cc14d192f1b3c592d37eb2b125f3db1b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.41.tgz","fileCount":647,"integrity":"sha512-EoFwkwj/LR8uQMpN4le4aplyVh7Ty60Cl7mffQF3eEPB0yJ9I0X/iTPJmq+10j2hnn4KQ/HcDj02ltVX6W4hHQ==","signatures":[{"sig":"MEUCIFPW11W9XSCnMFa5U1EPPiaUVl6Rp6xBY2xCt3hLhLCNAiEAkjgK+jl1VXN+RChWjcga+TEmWEkmnSSqoCxfnsVEClI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1304934},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9b4baf39de9841807c67ed699050ea52b5a2f549","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.41_1774586533745_0.4719683770576051","host":"s3://npm-registry-packages-npm-production"}},"0.1.42":{"name":"ugly-app","version":"0.1.42","_id":"ugly-app@0.1.42","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"26e879ddd10ca281580c93a0f1adbbb4d0dc2386","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.42.tgz","fileCount":647,"integrity":"sha512-HUaGjXTHiPFUABEugxbcwMdLusvTDjWtCHTPriYlJY34ukQ/qWrorAR2D8bzQ4f81GVoZMG04q3gaGKJcvVrLw==","signatures":[{"sig":"MEQCIF/sYb0bKqk5CvF1JnYqBydTGYwfo/04wcu8A1MGDKRFAiBQ+QRmDgVN8fBNAQCKVRMQT4Px2z/DvDRxx8MaSsO5Lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1309636},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e72d51da2bca8f7ffa32fe70f37c519663563371","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.42_1774587725643_0.7115363715957623","host":"s3://npm-registry-packages-npm-production"}},"0.1.43":{"name":"ugly-app","version":"0.1.43","_id":"ugly-app@0.1.43","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"49aca6739bc731d013c8a2ad37e081e7ddf500df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.43.tgz","fileCount":647,"integrity":"sha512-1v5AmrTB1MKU/AS+vdd4V7Xr64UmYkKWKTviBVqViGo6CFvi7KSTVy372w1oa7EpiaMqIYk1/iDYabpCPxD+rg==","signatures":[{"sig":"MEYCIQCg6lcYSDD9oAen5tEPO0aeY+Y2d+VelcNt8olXZJc0PAIhALAZaMZJ6MYAz+e91+VS3uTrM2oZvzTY5JS5HqNKLoGj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1314125},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"52bf3e4f45e4a92d478c206414f2f6d05d2b9eab","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.43_1774588426525_0.22568882420291358","host":"s3://npm-registry-packages-npm-production"}},"0.1.44":{"name":"ugly-app","version":"0.1.44","_id":"ugly-app@0.1.44","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f7ed1e309376aff56eeae3b4230e52a395da6f65","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.44.tgz","fileCount":647,"integrity":"sha512-Dm84U9wD2Jpz/RfDcj1sZgS7jAgT2uj3eDCpvV6V1SaNcTORiXN2zaBULBszKPZ1nXV/qVH3y1oLCDi7pWdEZw==","signatures":[{"sig":"MEQCIAqIHAEnQe7vWlUhs2fxNrUpKtKU82EaIcrkpJDxAhibAiAl+ygR/CRFTwK6I/LaD4Za/QdvZtI+6SPAqheBRrtvBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1316479},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a4f4eec0b3dc175fdc39b4022ccde5608a30e84d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.44_1774590004002_0.249587068459852","host":"s3://npm-registry-packages-npm-production"}},"0.1.45":{"name":"ugly-app","version":"0.1.45","_id":"ugly-app@0.1.45","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"25342d2c5f369d1e925bc1f95af55fb65a209965","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.45.tgz","fileCount":653,"integrity":"sha512-XJfjM+2hlSnmH8T4pr/z1JSJNtVTn2aBb1Q8aA1jM8MbQCIEda7awpBIRhiYK0/Zf5FtOx7acQHkXjzRp4aAHA==","signatures":[{"sig":"MEYCIQDRmPhqhnV4RCAIQClNamvhIAEfWcnakQufCyU+/rFX9QIhAOaVasfjo8Z1nxAHYFKUFw9qBq2zikd20lmhld6nQHIW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1352967},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"37c8832fd955c472530c1a205b297b5d32ecd216","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.45_1774669167846_0.7649038774432053","host":"s3://npm-registry-packages-npm-production"}},"0.1.46":{"name":"ugly-app","version":"0.1.46","_id":"ugly-app@0.1.46","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6f10c10c5089245b8aef9db9907115a76cff6606","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.46.tgz","fileCount":653,"integrity":"sha512-hVui4BmomTTs1DICvgqtE2Xectu0vIFTuoZPS5HQbvnQ+MdHGrMTg+ME3Un2+eKxZKA+ihxUG5xHaFLyn6SXVw==","signatures":[{"sig":"MEYCIQDvwhS+UrzlaD7bHRbV3IcLPoaLnXiVf0kVuUeex/T9AAIhANtvkxv4h0svCpBf13YtVN98l8F4V74RqidRHOus6bmm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1352408},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e014d66637aaec031bcd8530d498e4f2c0b5f9f0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.46_1774669856922_0.8812451819137621","host":"s3://npm-registry-packages-npm-production"}},"0.1.47":{"name":"ugly-app","version":"0.1.47","_id":"ugly-app@0.1.47","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2b75b03208daf9daebf70113f9d83e82aba6c085","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.47.tgz","fileCount":653,"integrity":"sha512-8FaZns2FFdXEL5iY7cUPYbofbzT9qzN2ibwCjkl83FLLBx86wYIstNiNAxCwkvLQ0FmYXPCWo63uQ/KzJW1YLA==","signatures":[{"sig":"MEYCIQDtpeXfR0tc/OUi6z8AB6d5pyFcbBfwPWCXImq4RNbU8QIhAJUaUnFtePwSnPyfn4fHEtrkgiqA1dpEoa9WNLnvhm13","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1354677},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d955762e758a6c15f11dada232e1fca9f27487d2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.47_1774671294921_0.12725012303281735","host":"s3://npm-registry-packages-npm-production"}},"0.1.48":{"name":"ugly-app","version":"0.1.48","_id":"ugly-app@0.1.48","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"183f593d23a15dedd1eaba03f47e8e3fe8a338b3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.48.tgz","fileCount":653,"integrity":"sha512-4vvKr0NMtbEKhnoqXiMzQpqUbkj1HsYHjulfsbet7b5ac5BhQ9FCCau5QgKJDc0tgdISblc9ATxnNQoeRIEKmA==","signatures":[{"sig":"MEQCIDw+dtBdvSKOHr0QNd1MNUr6PXFvRkbouz+D7vEZkJcvAiBGJq7YiVJltW1Tizycz9fEfluywpJYsZ/eTSKN4dDRhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1354880},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"261f36a054fa20609fc4be93ddee9a94d5cd96ea","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.48_1774671797087_0.82266948700327","host":"s3://npm-registry-packages-npm-production"}},"0.1.49":{"name":"ugly-app","version":"0.1.49","_id":"ugly-app@0.1.49","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9f8f4e85055dcaf90491a6099eaf28c8f66951c3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.49.tgz","fileCount":653,"integrity":"sha512-Bp7U5QT6i8f2FBfB2nQFK9ercMVtswQg6uBwJDDJlKU5weMd+DOSpZVh0+iNjdOX4Br1tOViBqWDkrC/JeJwtQ==","signatures":[{"sig":"MEUCIAR/kvs38Zuezl6SnDzfijwfnPKDynyUvbPFzc/xhXdhAiEA6kn8ael6Yh4QoKrEUxiSg3wr9RuchJN77UVNAklUD5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1356700},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f14cf593de868a70ff3db7d4d2f0e9798a72492c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.49_1774672505719_0.7941527668525632","host":"s3://npm-registry-packages-npm-production"}},"0.1.50":{"name":"ugly-app","version":"0.1.50","_id":"ugly-app@0.1.50","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1ae163d3f8fbe99e737c555e864c4064d9515d7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.50.tgz","fileCount":653,"integrity":"sha512-ChMns6vZXs4G7DcvPD65WzuxsRXLaweax2qqhux/JgC7XZMaED+VgOk9g4qV9EE1fd4zRwQnzOEDgIb0mQZ9xw==","signatures":[{"sig":"MEUCIHJe9T8YQ1qGHtC7eVe2F5yserG1OzeSEoSs7q91a3buAiEApu/2rnHRlGdolTOyYs8QjNTuM95974mAY2p/kUeoezM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1357662},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2d918c97fb77390f88b77082c518deba9e88d499","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.50_1774673003882_0.9231642607139516","host":"s3://npm-registry-packages-npm-production"}},"0.1.51":{"name":"ugly-app","version":"0.1.51","_id":"ugly-app@0.1.51","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c26cc56d09d430abd84a683783e7276e299ee5b0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.51.tgz","fileCount":653,"integrity":"sha512-seO49ANCWApOWsbRiWb7nZHV9DPJMOO3/BYxfHLXnDC8FFScul8pEKb/KpJA0wbywbFHBrYEpO8D+wtcsKJ5Fw==","signatures":[{"sig":"MEYCIQDAhZFq4npCkTMLb0T1fhU0Biea79xeRAGQ7AFhnDsGTgIhAITAh787S/FAtB3GNFgrqhQHyGqjV7VJ1drqt4Qe7oBG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1357903},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d4a3f829b69fe7a256a7161472e1266e05269be4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.51_1774673710947_0.49324302175393986","host":"s3://npm-registry-packages-npm-production"}},"0.1.52":{"name":"ugly-app","version":"0.1.52","_id":"ugly-app@0.1.52","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"89c37164885f2d55655e9536367c1edb3b1e480e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.52.tgz","fileCount":657,"integrity":"sha512-mKbU8tvkxGBVmbw+NWCZnSK12wWmUWsS2ccBpWN5zbwfu+NxxBaje7y3qj6T1AUbteq3bRfQjVl4m6Xy6hfMqQ==","signatures":[{"sig":"MEUCIEZOmJ9LdtknIDrruDyfOTl9KW3MTVjJeY7oJdbPo7gbAiEAwBCO4pzUCqMx1Vfyh51/zQsTvsEEFDgTde1RdlM9DRw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1359095},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0f2516819786f74c9345126405ace922a7ef9f23","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.52_1774674197799_0.16626768588430751","host":"s3://npm-registry-packages-npm-production"}},"0.1.54":{"name":"ugly-app","version":"0.1.54","_id":"ugly-app@0.1.54","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d446c9d1c9243a03cb17543c76b8575cd1024164","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.54.tgz","fileCount":657,"integrity":"sha512-ZQNhuaER3+cLlxahNKAWOQM6vHt6ilTiKklv3yfID62LKKsUv1bRwCd/dcHUxiDwtMhQ/3+QbHyFmCQnL1h7dQ==","signatures":[{"sig":"MEQCIDhrjONBvAMWfqjdDMBzW/1fq605tKF2p88AGNuNOFAZAiB3Hxg0G2iM37lug79G5wRiXACBkEG2RBSDmu+HgNf9XQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1360000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0c2bc9973b657c6590f06fd41dbff3478b3023af","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.54_1774674759449_0.9723020809916199","host":"s3://npm-registry-packages-npm-production"}},"0.1.55":{"name":"ugly-app","version":"0.1.55","_id":"ugly-app@0.1.55","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f0f73dbd1a35ff75560209ec41ee4ecefb936621","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.55.tgz","fileCount":657,"integrity":"sha512-QsRe/5GPglf+plhmr9yXlOpMHSJz9M7VTR39MXHx01kefKU8laKUIkDQ8AfpueZAGicwObtU7DffKBkZWDTZ2A==","signatures":[{"sig":"MEUCIQDjTtQg3EVGRahqPQxp5fDI+yh5iLFAN347NQdE7KLE4QIgOdLMC9cjT29ykSahfSek+TlbzTnU39Yl3iUmAyKwtdQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1359903},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a102f6ab18bd3ffdfb0dac2db8ed9f670283e271","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.55_1774674909537_0.16943522416299595","host":"s3://npm-registry-packages-npm-production"}},"0.1.56":{"name":"ugly-app","version":"0.1.56","_id":"ugly-app@0.1.56","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6355b662f612ffb1e9a6ecaa6038a7fb9a3c6e3e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.56.tgz","fileCount":657,"integrity":"sha512-QPgYuHeQM6fPYn4fa2NtVPlERMwfQkG/YwDAOwSSzLpGlWoZHhqrWLPNSt9yT+hjUVJDap84nZyrBMLeD8zd2Q==","signatures":[{"sig":"MEUCIFOSOgWeKn9B5ujvVSUsZQZVojPi3XMkzQVFrz9hbClnAiEAobdeteA4SevPjn19q+fppGNjPigHBzDA9UwM8d3jXKc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1359903},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"da48095597af99a996d0ba6ae8170227541a91de","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.56_1774675516705_0.5853414948908333","host":"s3://npm-registry-packages-npm-production"}},"0.1.57":{"name":"ugly-app","version":"0.1.57","_id":"ugly-app@0.1.57","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b12b69d313bb14c1bedd37bec267141f26b69eff","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.57.tgz","fileCount":657,"integrity":"sha512-W7430qDhtJbRnU+xfhsy848PSEWfrcpYN60xM/+Z1pk7IvoKOCPbe3iRyQpPy4+zAHPf36AG00vHgI5XSrfYiA==","signatures":[{"sig":"MEQCICkueq+3a9/ORq1ZB9o2Qvot+lvvdDGsfj160IonTyrcAiAFkbzRlvfJyPJHsZttXDqr6tSV1PYDJKMGFkb2FqlenQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1360166},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d8552a7982950a2a66a378c920a9a9eca309a1fe","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.57_1774676683186_0.6283036451016542","host":"s3://npm-registry-packages-npm-production"}},"0.1.58":{"name":"ugly-app","version":"0.1.58","_id":"ugly-app@0.1.58","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b3b742fac920fbe4a0f2a9d4fa4b693dcc2cb143","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.58.tgz","fileCount":657,"integrity":"sha512-dC26fB9sVULjDYx8fhzJQaIX2gLpJcNSxmb0x+qzvoivzmeF/g1BXKCEH8JMVxK2SKtvDIAtdEISMAzoWcJnXg==","signatures":[{"sig":"MEUCIQDJpbZrkVYXm/HwhoKLTPnlWh7D7itZyyeUwUrC7XGQqAIgWt5uedI3yVvxPTLGIzCbzmY3Z18pD45bQyCqHdkiSnU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1361636},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f2f9d3c4b43208465f61c6b1e1f771265912b982","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.58_1774678080626_0.2710710171001034","host":"s3://npm-registry-packages-npm-production"}},"0.1.59":{"name":"ugly-app","version":"0.1.59","_id":"ugly-app@0.1.59","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"57703c80a44432bef85ac00f51bdc7bcdbf4306c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.59.tgz","fileCount":657,"integrity":"sha512-SQXsNbhMqaU0LmxWOT4AMuxM+T/W3+xegVajAmNKpBUWIZt91ty7/VCFWRBbAKWo4EyLeWcWdj2/bgqC8LuFoQ==","signatures":[{"sig":"MEUCIFYRlheD7ZlYQZ37aO0UQuOWfZnoxly45eViGKND04r9AiEAv6Rj5Qd7FBjwS/bUQqHTPQ9nyGWyl9ElEPKYp8S5qeo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1361636},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b010aa6cbc68c41dd810f8b67dc6529880ca139e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.59_1774678408703_0.36153015824230605","host":"s3://npm-registry-packages-npm-production"}},"0.1.60":{"name":"ugly-app","version":"0.1.60","_id":"ugly-app@0.1.60","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2a64ecafbf2ac8a3effd6d0c9a513b78f230fb74","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.60.tgz","fileCount":657,"integrity":"sha512-t8Gz7fruPG0KfKKJOqi1cvXzaKIsVx9cVC2U0LJd/3zuDRctpr7DL8sEoPf3skavyrL05zOYaseDPLFR0tOYew==","signatures":[{"sig":"MEUCIDF2kRRXEq2OuNXeexSXfelIVSRd5IZXcoosa5cXo4CtAiEA1zPchMYzIiRO/sRIGEDbvAAL4478pzBDDKW+6jhmUpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1362011},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b8020c75139f4c31dc6e4cc65190bd5ee74dd2d8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.60_1774679397915_0.38459944651117994","host":"s3://npm-registry-packages-npm-production"}},"0.1.61":{"name":"ugly-app","version":"0.1.61","_id":"ugly-app@0.1.61","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"31525302e9f51df759473c53250e6f4af1e56dad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.61.tgz","fileCount":657,"integrity":"sha512-U+iORayQf2cUyqtNkGFPdl0waHbsEK/L/4wttjxdy+K6Ig4H5NSkb1WUWKOq+mUifinfDoj/cNCg3xlon1tB8A==","signatures":[{"sig":"MEUCICnFjaqLTwwtx/cbXTmApJRwPApoa46a3qFcU0C7qkfwAiEAibWkusYb6LGQj12GIcBXDbhYQ5odwhyhCPjrNHUNR6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1360376},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7db90f47bac7df9ff10220f5afe1005d5da87a6b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.61_1774679523467_0.21068633450871754","host":"s3://npm-registry-packages-npm-production"}},"0.1.62":{"name":"ugly-app","version":"0.1.62","_id":"ugly-app@0.1.62","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b60bcf66a23e12f363a808ff63ed66a1a17b9ae8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.62.tgz","fileCount":657,"integrity":"sha512-uuKxasvteX7lI7/yCNZ30HPryya+ITa8egBr8y4QifjQFszY5Qx7himJGRhWQad5Pj57n9zKCIqNl/Pl+1rcrQ==","signatures":[{"sig":"MEUCICIMtMiynZ0uqEoN93yIR3UfkUwY0yT9yUtRYyZKtXbYAiEA3uiH5cRpHY2XRjGEoGTTAy4j5W4zyKCmEJ26OHnHtcs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1360376},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e4daca01a2873eef32314d40acc85360e087314c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.62_1774680217911_0.35860597230679936","host":"s3://npm-registry-packages-npm-production"}},"0.1.63":{"name":"ugly-app","version":"0.1.63","_id":"ugly-app@0.1.63","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4a9709361832661e79a156c5218c8e63e8fa51ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.63.tgz","fileCount":657,"integrity":"sha512-tGOK2BuC3qkE8Tjtuf50hMqrHUSHdUypJ2Z64ljTT9hgphYuBkyBM1clXqnFplexFZcyjPC5z1Cfu5EEY7huug==","signatures":[{"sig":"MEQCIBUIrJLkwoUdp7/0oYfrxlWCTeddCAbfIWIIeZKl7Kc8AiAt9ZgeMiqqPuVBsa2RL4Uvj8Tpj34jPuMZOoFcom/Igg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1360353},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e667d7597cb1114e43a286410e72ca6d2c36b2c5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.63_1774680803630_0.2071247528147906","host":"s3://npm-registry-packages-npm-production"}},"0.1.65":{"name":"ugly-app","version":"0.1.65","_id":"ugly-app@0.1.65","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"15f352f8d263ccbaf1739ca057105ca8ef7ada28","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.65.tgz","fileCount":661,"integrity":"sha512-EiM/O1dUiHberlPR6kD6Cg0mxJeglXxLYPvlfop21IX/rddiqxuQi2ET23ZxBhGOcW6eTDqgeuO5RfB81k05tA==","signatures":[{"sig":"MEUCID5t1FcZzWiFrMau8FkqhD2X6uc/8IJDJnuiM+V2xynfAiEA/xDVnKUDMHo9u4kb2CjLOzRxrsvI9LcMt/Maqxa1ttQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1395610},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c71e4292a9635b75aa6c864f0ede373a2f9df9d7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.65_1774714317839_0.3081031119824591","host":"s3://npm-registry-packages-npm-production"}},"0.1.66":{"name":"ugly-app","version":"0.1.66","_id":"ugly-app@0.1.66","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8767148e9723d3c91ba299ed2bc0fc670fc2901a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.66.tgz","fileCount":661,"integrity":"sha512-DZLKco2u2VcBImqDOCGPrOidR1Jo8t8YszkhlD3L8W5RHtUtDnVU7yUS9yHAu+rd9lW3gjk6M0+B2BEHCmfkhg==","signatures":[{"sig":"MEQCIFghAGnBfFk/cenrl5tm3xCUXWIMxstRZpFXjo8hY+9GAiA2EWSHfYyYBkjs0rj74UQ3G2l/5wp1XfLaCBjwIbwVxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1395813},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7a5080cdf88ac7dccdf09e322206696fc670c40e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.66_1774714687089_0.6843045577602545","host":"s3://npm-registry-packages-npm-production"}},"0.1.67":{"name":"ugly-app","version":"0.1.67","_id":"ugly-app@0.1.67","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"82f6260474715faa2b5610048ef6d6aa8b7b8c48","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.67.tgz","fileCount":661,"integrity":"sha512-e5rDoqkfceqUAac6cAXuNSK9SpA8PAdUK7raD2BIpg0dSCBdZTDIUD+0NLi9nL6Un9FApP6551qDsjAJ38Lt9g==","signatures":[{"sig":"MEUCIFMDHaUx7Oquc3mrxKhhujoL69O7oDDn4sP5RdTSclBVAiEA6CkZS7v/4HHRwtTYTrDc1vXJxvI1c7l0o/VUt+5wFOs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1400069},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7a5080cdf88ac7dccdf09e322206696fc670c40e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.67_1774716079227_0.19311757945471042","host":"s3://npm-registry-packages-npm-production"}},"0.1.68":{"name":"ugly-app","version":"0.1.68","_id":"ugly-app@0.1.68","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9282aecb10223f6d117fc1c93ceb1ce50f7c3bde","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.68.tgz","fileCount":661,"integrity":"sha512-TI3sxmIQL6Icg6qK82a7bZnPToquRLMTJ0dWmaTH8KA3mTJXouATkiOn/eQjQZLsCk68EE1gj/j9ojaLf++HPw==","signatures":[{"sig":"MEUCIFPhZiquYA7w/HRLtv/lXFWITxigoXI7kax1mq4kQVc2AiEA5BapvKVckmr7NHcmBi1JsB3uSWek0v1PzxNqsuy+hc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1400169},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7a5080cdf88ac7dccdf09e322206696fc670c40e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.68_1774716541675_0.5857245903003039","host":"s3://npm-registry-packages-npm-production"}},"0.1.69":{"name":"ugly-app","version":"0.1.69","_id":"ugly-app@0.1.69","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4e245326d9e070e7fef899912c81cc1717d96796","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.69.tgz","fileCount":669,"integrity":"sha512-wE3VCNb+Rlp7UQSyvzDK4YV/h9HMqg4qdNsFBSv9nbXQQwNBcmU1uOW4EcR0uU+/LyI3MqeS+vnmK6EkRdGayA==","signatures":[{"sig":"MEYCIQCv4qEKmYKXq5quh/qsooskTOKsSVQKdKfuCQn4kYCSpAIhALsR9eZ3VfKGZQGO6B3Z0ttOw5uc7ld50NfxXChH4Dk+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1418981},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9c84f42bc4206bcd33511211252e8ddbf467f76b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","ugly-app":"file:../ugly-app","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.69_1774719054919_0.7967327106059019","host":"s3://npm-registry-packages-npm-production"}},"0.1.70":{"name":"ugly-app","version":"0.1.70","_id":"ugly-app@0.1.70","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"557a139f9229f04490382eb23280d2d66b20fc66","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.70.tgz","fileCount":669,"integrity":"sha512-jBjqDB5TfY1Xpp0XBvhbzCQbNiVL/xt+lkrmBaES0aRKLYQv51iGdXc5Lqc0gDK6mfmBeQo96rinhHvGz0i9GQ==","signatures":[{"sig":"MEUCIQCZhkTlPE8OLBG1HUHd9ASguOsLoR6l8aELyUEZEd6wZgIgXGNnaLYAzl8NJxYpVpcOTNGMgb8tiMxF9MpPkm8uS0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1418945},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b0921e4bde4c1e0502abfad3a3ed861d5c3ede84","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.70_1774723241519_0.5041942829536119","host":"s3://npm-registry-packages-npm-production"}},"0.1.71":{"name":"ugly-app","version":"0.1.71","_id":"ugly-app@0.1.71","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b5fccc58b6f85024ce1d4ae21b3602558acd5594","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.71.tgz","fileCount":669,"integrity":"sha512-OYFDZVkx8B9HCyVInzHnjc7oheg8W4MR7l8nWXPvEjrYIivHImAlsWLFdh7NriMJyo8t4J7ADhyaRJ1RBC70vw==","signatures":[{"sig":"MEYCIQDfRjM7E9LhGNe/9lojNyVhBpn4/Mh74+ZFtZDwtFTgNAIhAMIMAZVM2ym0J96E+PlB00Fb/jTYBzlR6TPVzCzUFKqp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1418993},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b0921e4bde4c1e0502abfad3a3ed861d5c3ede84","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.71_1774723321397_0.26593385291248217","host":"s3://npm-registry-packages-npm-production"}},"0.1.72":{"name":"ugly-app","version":"0.1.72","_id":"ugly-app@0.1.72","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d9a249462a09616a0e370831d12f9c4133a00a9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.72.tgz","fileCount":670,"integrity":"sha512-pwVwR8/FL+EdBlzJpai/EnkGbNTL9+i1KFRF6UClw0a9L0GwiURWJO0U0g1JGqk6m2RQb7eMXS3nlRkIxCwgDw==","signatures":[{"sig":"MEYCIQDL5O6b5t5gFT0yL6/l3SDktSiiwWzsUlS93G3HpZzuNAIhALc5qJeW0VErPJrdVEQVbDq9RBH4xk5LnJXAd8kYyVSH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1425265},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"932348773139b9fd703dac1bc5a7229a3e170a42","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.72_1774727868761_0.5765501468986842","host":"s3://npm-registry-packages-npm-production"}},"0.1.73":{"name":"ugly-app","version":"0.1.73","_id":"ugly-app@0.1.73","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5691393e788091336c2d99812d417fd12a70f223","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.73.tgz","fileCount":670,"integrity":"sha512-eVNDb6Wcti1ticX62Z282HyImWtGVSe944jB5y0hKwr1Pf+lWWAcTa4R6p1xlMByDn7E2Iajv+siWFkAl0y92g==","signatures":[{"sig":"MEQCIFSgOS7km5g+gc6uSf+aParvnHUXHm87O5hO8Zcp1e1+AiA3UkFOSrtWYdYIY17azWVKmUVh6fTv9OTiOgkX1MtidQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1425283},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1e34e5820fc76cff849ab318e26f55a1525801a2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.73_1774728644558_0.2925432358855844","host":"s3://npm-registry-packages-npm-production"}},"0.1.74":{"name":"ugly-app","version":"0.1.74","_id":"ugly-app@0.1.74","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a75a6a69e4c803c4b1572b63c757180ca6223cb6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.74.tgz","fileCount":670,"integrity":"sha512-kCfTSSFZ+noZeFXztIRr6d86D60viDm9OxxyWOF77KVaK2b6adEZ833JWoVtko21LGr+/ZvjXhWACIDtO4/Z/A==","signatures":[{"sig":"MEQCIG8Ur1+KC6UtQ7jxW+EI8hW1pp15MU1HXQmtwpfaWHGxAiAxw173Cp+wAqdXrt+wLehHSEToYvhUpqNIhKxqFiO1YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1425283},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"bc8ffc2a810ff2c606e9dc9642be2d8801f328ac","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","onnxruntime-node":"^1.23.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.74_1774729981294_0.467337878283284","host":"s3://npm-registry-packages-npm-production"}},"0.1.75":{"name":"ugly-app","version":"0.1.75","_id":"ugly-app@0.1.75","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"897a6f58506d1abb72d761508164c3b6eff84159","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.75.tgz","fileCount":782,"integrity":"sha512-qexAIDn8ZNvZA/5Wiw1sJMI9zFYjapiLWtYgEHlKat8tL+hAxJJlfPL0wUTWdzv+U+0QDbbFuYD1gUY545aD6Q==","signatures":[{"sig":"MEUCIQCN8B3qu1JlPjSkDCt6/fmonCPlzNbwZxpfFC286eK3mgIgQtHPalz4DW8Pvi2dS0Qs950NGUTgJXkDQt6nyZc3XDQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1873718},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2e34a910cb611b7221b15ab910cfb9ea0aca990f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.75_1774734043195_0.40759367618023656","host":"s3://npm-registry-packages-npm-production"}},"0.1.76":{"name":"ugly-app","version":"0.1.76","_id":"ugly-app@0.1.76","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"519478dbd861354c68303c59d74d12348002c035","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.76.tgz","fileCount":783,"integrity":"sha512-q1zHfvd4gne5gaLicgcgzZAG2mxowTfFqHWbN+2ugHRc3E3rWmQPW0l2aIR12bvwTn2QlZzz8/PprohfqVOv7Q==","signatures":[{"sig":"MEUCIQD6ypHyQvHp+wBQr9EFKvIutJFGZWWCXvKP4ryOVP0nuAIgP5fz/7VzZsTWPASSGLKKdrW72WzYlMng0WUHCMqnCj0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1884863},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a57513626aac508ceda8424c264df2cb4bc84f14","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.76_1774739461491_0.0012342746349578437","host":"s3://npm-registry-packages-npm-production"}},"0.1.77":{"name":"ugly-app","version":"0.1.77","_id":"ugly-app@0.1.77","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ca1b4fa43551cb9f84e7b8cfe1241abefb5012c3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.77.tgz","fileCount":784,"integrity":"sha512-r7IWzdGDpk6Jh8SunzRxAS6RguewTNuDJe/LWmQ0H0qVdpFe4JjwqwXbYyzxVatTjrtufVxCEiGLY5WJM1yudw==","signatures":[{"sig":"MEUCIEiSLSUzKqe8C2HP82GDal2Te2SA82FUXqRJ4fxXv2rTAiEAtrWJ8G3xR09ibO4zfZTKft9Ou9HgdOjeqZccwOucgfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1924517},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b60b76dc0a19ddbf7a1000e59d0ddd8ea1ff9ff1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.77_1774744265927_0.08656353853172982","host":"s3://npm-registry-packages-npm-production"}},"0.1.78":{"name":"ugly-app","version":"0.1.78","_id":"ugly-app@0.1.78","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c62171107c77e43b0a51187a89cce6fe51affd32","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.78.tgz","fileCount":792,"integrity":"sha512-SzRI3er8s15ypJhzsFUtIRsrwcxKqi4PgOagwhQwPgja8yGMqs2t4gRH7i+hHfaXGH7GOIJYms9GiTj+b91crQ==","signatures":[{"sig":"MEUCIQDJuEE4yCZN5ZdCFQrV//QkKuEO7spuoFs8nUAF6r3+rwIgVXJQn9JvNvRlLrgk+ysmxcItTllAIbntLnN5UbUwTYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1987032},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1271b8531194fbe377fe3c34c5333ae1ae725e7b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.78_1774810931940_0.41578076107492157","host":"s3://npm-registry-packages-npm-production"}},"0.1.79":{"name":"ugly-app","version":"0.1.79","_id":"ugly-app@0.1.79","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5a14b73c599517745e0a56bf831225d8ef4874b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.79.tgz","fileCount":840,"integrity":"sha512-5FrmMVp/4xMWJaL+P7BqKub3XvZxlgaE8588VSVllOPvrSFb2OA7ztpbs999g5pPfdQfhL49LAStxTwZjmzSNA==","signatures":[{"sig":"MEUCIFAhHdKxV6VRQwsJlF+ANmgr+N5nUGXCAeFWSqvqUiJZAiEAwB3uJTQpKq9LA+VBr7aJgPR9FjukTuDgxSwIzF70Y6U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2588671},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"98db9e67c3f2a05e6ff6d33fda387778ac9b8f13","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.79_1774816884757_0.2888533816610761","host":"s3://npm-registry-packages-npm-production"}},"0.1.80":{"name":"ugly-app","version":"0.1.80","_id":"ugly-app@0.1.80","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"010d9229f5890a40caf2666c41c27280ae724907","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.80.tgz","fileCount":810,"integrity":"sha512-UF3mVJYLPUhcC0tgp/80nlDPnW7NSire+OBsqMlzBouGPEGJTyqYxO7+62IOz3ESYXzv9gbyA6Dj3Q/iLGcB8w==","signatures":[{"sig":"MEQCIEiSy0JXbK/klmflkthzW0MnJaO21OafqcmKBQVHrdFZAiA7S0qE+wtqbFuHs77DAimB2kXbzrXV0yGdnFliOiYZJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2110430},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"da37d280f0b4fa87420a408d9b2c2a408f6d25f2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.80_1774824878905_0.524887257552751","host":"s3://npm-registry-packages-npm-production"}},"0.1.81":{"name":"ugly-app","version":"0.1.81","_id":"ugly-app@0.1.81","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"62be312acc7c28818e9829cd188d2833e1d571c4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.81.tgz","fileCount":799,"integrity":"sha512-mFwCcRXnkQi+MwW3qbAVtAdOPdMqEz543LizWngsjjJ24MlRIu0HTnpJQu53n4/hMqFIHEP+AzAMLev1L42uiQ==","signatures":[{"sig":"MEQCIE1oPnuc5laSy/lshhWD/8+8os/v8VDkWGEEUpXRKeZbAiAabX9iSnaX63VE2HUNO2WA6lj0dPfxnhKu1zBhCk3mRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2023450},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"03a297d2b2191e1b793d0b6a453614e77f24e535","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.81_1774825845374_0.7784813045136008","host":"s3://npm-registry-packages-npm-production"}},"0.1.82":{"name":"ugly-app","version":"0.1.82","_id":"ugly-app@0.1.82","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8de943b137dde4ad2392253174760838b5b6eec8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.82.tgz","fileCount":810,"integrity":"sha512-ZouZbVDZJcHtfTCCyZh2TOW5+SRIxrIKCnViiZDXAsvuvo2wNWkcdQ9mBiWsiniOv3d+Z6I9a3CHt8IHF7g9Zw==","signatures":[{"sig":"MEYCIQCUywDh2X7dS9M9kwN3kfaPbNzUD6/QM0HrfOncrq90dQIhAJYw6XRoTdlTxpmJAyF/qiQ2HUSr2CnNoRZXTLxM2Vud","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2095229},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a260bc71148a79b66afbe253a90d071dc693107a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.82_1774825899851_0.9822025147743223","host":"s3://npm-registry-packages-npm-production"}},"0.1.83":{"name":"ugly-app","version":"0.1.83","_id":"ugly-app@0.1.83","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"097fb87d4ce49a8c48db4ca5063d735e6874caf3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.83.tgz","fileCount":898,"integrity":"sha512-OLxVhO0zl/7RxUOWtbEWBpsxK7Su/0T4oaEznl5rLNrRSCEyWv7A8VcwPgtLfN/L1f27SO3IbD8zcusNknbbNQ==","signatures":[{"sig":"MEUCIEdF4B4v7hFNuyhGo53tz2ear8/COxzNzMC8oPcSw6yHAiEA8Mm/aF5vtxTc92qdrEy3KvDLsSCrHmfetkwg1LGtvI4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4960022},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d3268def5fcc4e117cc5ce94376348060a844e6d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.83_1774828165008_0.9282905176127711","host":"s3://npm-registry-packages-npm-production"}},"0.1.84":{"name":"ugly-app","version":"0.1.84","_id":"ugly-app@0.1.84","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a7911d6111cacc628c64dfd87365e864bb1ebcc7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.84.tgz","fileCount":898,"integrity":"sha512-619l+slmZRCOSps0mJiD8vPSGLaeWmRgszV65xuiI3ZmnPXIy6VU33GXXbP6AHfie1anfzRxlZ+ddgbfgCZ1ow==","signatures":[{"sig":"MEYCIQDMGj6+Up1hf88qqxPlcXwqIbhj3dB3lghPYTddF257ggIhAJDQqud4i5K32pne/nU0ntbZ6w0t9OXwtmTSrhD0WmHj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4963895},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"cad6930c277af274a346f1d59f52ca73d3c97851","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.84_1774835342605_0.6396050316154587","host":"s3://npm-registry-packages-npm-production"}},"0.1.85":{"name":"ugly-app","version":"0.1.85","_id":"ugly-app@0.1.85","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bd51349546beee758c664ee6d2f06dc51055882a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.85.tgz","fileCount":898,"integrity":"sha512-OD0QihEnd5HWvFB1MZ1QQPtFih4Vno8Shcx/b6ktlWgHiBF5r4IjsjHejuy+efG0E1jHC+QkgxUpVd7vDZMrBQ==","signatures":[{"sig":"MEUCIFM/DEoDmc+k41ocKQswEyLLPo13neN6zqSekoaCVuiGAiEAhUhfNam7ULTlFA+vgVamofiMLElrIJRkEMgMhL5Lzhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4964334},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1d163c7a2db46653959971a30f08db5a83c5a3a6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.85_1774835888550_0.6732152624868468","host":"s3://npm-registry-packages-npm-production"}},"0.1.86":{"name":"ugly-app","version":"0.1.86","_id":"ugly-app@0.1.86","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"73acc797b842d9c396b92c1d5ce613f095218cf7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.86.tgz","fileCount":907,"integrity":"sha512-holmyA4cMAomizvc7G6QeDe7M4JhYLu8myZJWaBJRJfllMj7KgwviChZG8BobMj9cCPXMUakS3ZsPIQ/JzjF3g==","signatures":[{"sig":"MEUCIDD0lgfcHCPMDom/o7SqEOUIAmmH9s2Suaxw0r6rlqhzAiEA6YVKPlfIsO44pddHi4BT32TtIJsygR7ECR9EBSY6b3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4978597},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"54963a14c4e745759c39651be064aa96876f8d36","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.86_1774838210402_0.03996577670716084","host":"s3://npm-registry-packages-npm-production"}},"0.1.87":{"name":"ugly-app","version":"0.1.87","_id":"ugly-app@0.1.87","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7a16421bab5ac0b25cf3c82f5da7be6abb12c3da","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.87.tgz","fileCount":1095,"integrity":"sha512-d6Zi8a9MXoDqyA6Qort/0Y/56ILivciYfKI4j7jUwY4mO1S0dWA+71Y+bhWi1HdEbFa/qaMfQkYzUoh4uMM1zg==","signatures":[{"sig":"MEUCIEH7CHl95Z6VVH9eGKk1r60NCes1CnMMcRZNQp7HKNzKAiEA2ndPPAkGrcfLbH/1agbbXmpC6CbpT8cQKfIn/+LBGw8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5883830},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a5a7b46c4424f84ee17bf3ced53243980d1f0e01","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.87_1774838572591_0.3538819583818362","host":"s3://npm-registry-packages-npm-production"}},"0.1.88":{"name":"ugly-app","version":"0.1.88","_id":"ugly-app@0.1.88","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fd7e9d910e87a24f1b5b34eedfbf417c09184bc9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.88.tgz","fileCount":1095,"integrity":"sha512-0YBHH5fLiYQoFQ26Vt0v4K/ckFotK9uvFiB897a2eIiDH1sGlAZgH4mKPVVuqOMdgqtM/OzjbBhvayXY1reYpw==","signatures":[{"sig":"MEYCIQCWUmokqL2kKfeZeb79HEmifNVE7+epEiLi4AcJ6mEukwIhAJVkdgO59BM86dUkDgkklx6HVLh0EI0AgLQ7/wOvw/RW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5883838},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5f81ff61d0cd649ba16726292c3493e1af00c415","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.88_1774838615718_0.8265042066848007","host":"s3://npm-registry-packages-npm-production"}},"0.1.89":{"name":"ugly-app","version":"0.1.89","_id":"ugly-app@0.1.89","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9b61709b2b4690d15ae15a94eb95f7139b7fab5e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.89.tgz","fileCount":1095,"integrity":"sha512-MZraARk+IXU1VxfCX1QLGMSAClX0lrSN2NJpn+fQ4+xXHOxF3PnBraj780QQ/uriCeNHHNPZxUYV/0NC5CRqXw==","signatures":[{"sig":"MEQCIE1PpW4/d+/aL0rgT5z1qn8K1RxeRMQw5+lP6mAObTKoAiAm//CAB3tkSM6Cpmthg1fdOWv/tVZH9efxvM1QR6SZrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5884174},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6c473debb2db375f239538fd5670c8e6384837d7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.89_1774839358255_0.8543712643650716","host":"s3://npm-registry-packages-npm-production"}},"0.1.90":{"name":"ugly-app","version":"0.1.90","_id":"ugly-app@0.1.90","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8ecfa3ecd8d10d7d358fc4f340a09a5a67010da6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.90.tgz","fileCount":1095,"integrity":"sha512-C1+EuijV8LiP1XzOAspU6bGOaMgsN7vKssR1p6pVrYQx2D2i1sPB4lfrFjrj1pnMvHdxL+A01pQVymy1LllVdg==","signatures":[{"sig":"MEQCIDFUT4NvBufp3OXRS/01cyjYibf88cdJptlFD6jwMwQ4AiBecAHOKcxCibSQ4ujNc1AVpzVHDAtn7pa/2s2fa6+1Bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5884436},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7f39fa0f5f7f88315a6e9c5ceada9a943443047f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.90_1774839728999_0.33774756060489075","host":"s3://npm-registry-packages-npm-production"}},"0.1.91":{"name":"ugly-app","version":"0.1.91","_id":"ugly-app@0.1.91","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3e32c9422e092db796a1d9f0f1df3548979beaad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.91.tgz","fileCount":1095,"integrity":"sha512-owGwxLYcdd0RXCcYGsiZL15tHkFLsel5j1Zs3E2rojdLqEVJv5UKsw+5O8Mjg4mfIv2nnFvsVFs5zvaO4FGvRw==","signatures":[{"sig":"MEQCIEHNSicheUWbNELRcreX9cyRNJ1XzdvaPeiv4vf2eNiZAiAzAim2rXzNKonw3R5uqJ3oKk5TYeklX5bquZIbm7eA4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5884698},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"68788e9dc3aac3405f8d533dc230e66c7fdd4512","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.91_1774840075480_0.035749216517376725","host":"s3://npm-registry-packages-npm-production"}},"0.1.92":{"name":"ugly-app","version":"0.1.92","_id":"ugly-app@0.1.92","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"34852c854a3e6d8de6437ddebaad88c75b7bb3a3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.92.tgz","fileCount":1095,"integrity":"sha512-ttdS/ioQUOpLBXcgQd8jHoloI0SMVftmLoUkjxlJBcpTftMzHAVne1SFD1U6fZd6QWHAKDwDVsLNDdu4leQXtw==","signatures":[{"sig":"MEQCIFn69mkz9bAhUwPGIX3uHkitDoksD0wZH6tYJ7x/Ff8wAiBv7uB461FgDwaM13zmtb6Qoaz0nmIWNygAUjTYw80JRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5884904},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"62394634b97427e2b60adfcfba3431acd48b6854","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.92_1774840260646_0.31954732733753133","host":"s3://npm-registry-packages-npm-production"}},"0.1.93":{"name":"ugly-app","version":"0.1.93","_id":"ugly-app@0.1.93","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bfa295e7c611881d471b9fa7497e124cc7231049","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.93.tgz","fileCount":1095,"integrity":"sha512-Sl1pw+uoa2XHkZyL02SLpEkaa/RIrg5mUXJ1y6gcCMwbUpu3/cyVfZa3gzotNxtV8CTChb/ASyApSxn7wyyI5Q==","signatures":[{"sig":"MEQCIDnlXfV7ej+Cxmt5Hky9MCLdpzrv7mD2Tty+iKrgjB9eAiAV6tTa7qQBqB2EFKMM1bqvUARdesbSkWgTw9SgPM7xgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5885099},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"825a5a523f3db596c40cb59858dce5c6dc24b348","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.93_1774840458041_0.5402002410174411","host":"s3://npm-registry-packages-npm-production"}},"0.1.94":{"name":"ugly-app","version":"0.1.94","_id":"ugly-app@0.1.94","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f29d677e81ebd09705708132604d298ab43739ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.94.tgz","fileCount":1095,"integrity":"sha512-YIY3YgWfa5ZnQuaZ7LCRj4hbTjeXOekUC9VKgB+Fd5kCp0jjECyBmnUrfcuCyNX+HOfnhTsU2ebZkiaWUwWshA==","signatures":[{"sig":"MEUCIQCz9Yvx9sEC6kmfy8b7OXS2buRKV/nrOg21xQmcHdpZGgIgXRVMh2r02N3hfVuKg46H64/wKU0DKb5YOjBbuF6uR7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5885159},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"51b00e67a72af6cd3bdd04e5080aa2458600f0bb","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.94_1774840837224_0.8899422911829473","host":"s3://npm-registry-packages-npm-production"}},"0.1.95":{"name":"ugly-app","version":"0.1.95","_id":"ugly-app@0.1.95","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb7b101a64e72183f55a1da3fb284da943ea9fc6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.95.tgz","fileCount":1095,"integrity":"sha512-1/G1/5DgP3yHIqzIg2DEFb011JkF3P+MlsUt4gLm8jqYyFZ7pslLconixL206xK+O9OWtFNqKqt8U6kbnSSsdw==","signatures":[{"sig":"MEQCIAgs+9EQ7Mq9/RTM/VcGQxzYGr47wQZUSx4yJgxXLyJcAiBn55AiYbSwzMRHzWnxeXQ/aknIjqtI5WVVI6E71xYeVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5885227},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c60649924ff81c083bc0e10b07167cefa0d5b22f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.95_1774840934421_0.310480205126092","host":"s3://npm-registry-packages-npm-production"}},"0.1.96":{"name":"ugly-app","version":"0.1.96","_id":"ugly-app@0.1.96","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2e09f331e1752df0d4a5693a81a0ee79e96995b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.96.tgz","fileCount":1095,"integrity":"sha512-FWrGNiiazg1HJG5fA/2WywrPybrlkcuZ58soMB7S/GDytDbXjuWtVm1bF4iXzL4pZH49K5NOT70/oAYOFQ4qZQ==","signatures":[{"sig":"MEUCIQDvXHSXhL7kH3EReKP/inQySDK+32DtCPCfcLP9rVRNygIgcNzZBcaXwUhkRlwPSGaxCNfyAfesgzjfFFspncT5Vz4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5885099},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"54f76187dd493e3599c69a83d8443873548c9b63","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.96_1774841077277_0.8940207805172653","host":"s3://npm-registry-packages-npm-production"}},"0.1.97":{"name":"ugly-app","version":"0.1.97","_id":"ugly-app@0.1.97","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3281cd3a00e605556423c3dfa69bcdb270f892a3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.97.tgz","fileCount":1096,"integrity":"sha512-l8Be3GyZ1RCQUoujxSNLq95nKhK+QTHWFEp3Pnz7bieWN71wdS+Jh19vpIZeMoVNUVLG4yGraYcepO43WiQC6Q==","signatures":[{"sig":"MEYCIQDrp5Awu7vM/b0zmfP2mVhvvDg8nCQTexZMjL9vpGeVvwIhAP16+WyHmSPeZhctd3+JZrhapOlANVveO3aQm45Qa0np","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5888374},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d260e49cedafa9157a7504aa62d1eb3b1823dce9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.97_1774841940925_0.2266359302374672","host":"s3://npm-registry-packages-npm-production"}},"0.1.98":{"name":"ugly-app","version":"0.1.98","_id":"ugly-app@0.1.98","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"afcf474467235643c35f3b2ee96eefe1fbfafd86","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.98.tgz","fileCount":1096,"integrity":"sha512-SW/EOiAKnB3kVvMtKgwjbz0CMfpvA7+qxv4Fey8Q6czAq+Pcet6+CY0BsSzUAPC49QWYj2cuYij2UsGHd6YALQ==","signatures":[{"sig":"MEUCIQCsfYgAyjMUGG36mGjav3dftx4O3aZOLKqWJaOvx3R6RgIgBEzKWM8zXWa/tAvdYjy+kacHmZV6JBITzQHKOhTdzk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5888818},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"cfbc15426fa1949c77ca53ca9503cb0ddc073464","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.98_1774842091279_0.08362824493561405","host":"s3://npm-registry-packages-npm-production"}},"0.1.99":{"name":"ugly-app","version":"0.1.99","_id":"ugly-app@0.1.99","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a465389ab36ce9353baca970dfa2ac6b2b959ccc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.99.tgz","fileCount":1096,"integrity":"sha512-yJ/skSjeypMeglWNN/gAkqORpl6Q/BzjjaWjMVOOG9hWYv8cv9CXMG0qnuerNIQmxlwpqOvyiLVmKyaDqL6CRA==","signatures":[{"sig":"MEQCID9fMgPWk2EchsWOC6gMDqzg2HSbcMTGQdHwaYP7TkaiAiAu8M3ipuR6mrIGEBrtPBJ5HQybjTVIJHtPQvjpyL1LxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5889059},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5398873ea2997965f7fff210158e35fcdc770ee0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.99_1774843346361_0.8512890797521944","host":"s3://npm-registry-packages-npm-production"}},"0.1.100":{"name":"ugly-app","version":"0.1.100","_id":"ugly-app@0.1.100","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9cbd7c1d37f7b83d84a66201c6c8186e1f8dea3c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.100.tgz","fileCount":1096,"integrity":"sha512-czi8qZLNxxqdh0ifoC9XFyGGeAkfGZWUdlkLtvKV0mFP57MGXMW4CI4wqRjavp1d+cO0B3Ase1e51Zyui4mXCA==","signatures":[{"sig":"MEQCIDbfMZBOPmuMG4fPMmQ0ij9jtAAczyYip1GMSIVDybzYAiB9ggweuBCVFicNsAeCsVQf6iL+yFStWqWak++5wAFtHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5891876},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f5c0d5bcd87b577383c55729f38e175cb23209ed","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.100_1774843526267_0.49598347080067806","host":"s3://npm-registry-packages-npm-production"}},"0.1.101":{"name":"ugly-app","version":"0.1.101","_id":"ugly-app@0.1.101","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"215a41b6c2117c68841a549dd609be2a07aea211","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.101.tgz","fileCount":1096,"integrity":"sha512-iQOoa8mXnzrU6XXCUEkwfHkgsuTkJNr4a+A62GvBG8Iw/eMiKZCWs/ye1MFEzz1yZna+80gY1izMoR/viyLPqg==","signatures":[{"sig":"MEUCIQCvk5ca1d00vSaDpQPDjI7iibkBHlGGHQWllENa+L8VzgIgDFqw6HHwp/xwcN5VhQe8EOT9BqSZirJ6sXOqq7e+cbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5892409},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"62c2fc761953c83cdc46d1d527fad020a5040230","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.101_1774843698188_0.31683369778307147","host":"s3://npm-registry-packages-npm-production"}},"0.1.102":{"name":"ugly-app","version":"0.1.102","_id":"ugly-app@0.1.102","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"679c5cc86b5e572997779ef731522a6d20fdded6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.102.tgz","fileCount":1096,"integrity":"sha512-IxlMHYHzC43K65iObBhkPqoaDSQs3b9M6k9SqrIsjWPXG+SzvZeEaEmVyVgYPh2kPmKDMVIo5OsZ1ePfreHlGQ==","signatures":[{"sig":"MEYCIQCukhXJ6gw1dQZzSrnDuoXykahfkST0DrjP7MECtQon1AIhAOEUxlhfAZ2qgrGxhzXA/w4sY7G+0b0dSMJHfFtKaAM3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5891361},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"89ce3971856bd74d7e49272ac559acfe8898f54c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.102_1774843747192_0.13809886238045777","host":"s3://npm-registry-packages-npm-production"}},"0.1.103":{"name":"ugly-app","version":"0.1.103","_id":"ugly-app@0.1.103","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e5c28f62128f7b044f031685c644172322a28e23","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.103.tgz","fileCount":1096,"integrity":"sha512-sclYSA2rSBt1kIi2gMDWjP5LKs1fEuf2TLQPcaWfRodPrvNayNArMVqSd4g6E+xV4UibAwsvKP6SjzaWkb/RRg==","signatures":[{"sig":"MEQCICHd4fGZ/dJfoh3WN3MwtZztnjIkicbk9eh5az/tlER+AiA02HzxUMs0etWDz40cBSiNUne1KYLzNfbKB1yQnUg63w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5889063},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"37daa49d213e4c33dfb27b1a90d5bd9d6ad61b57","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.103_1774844049753_0.5298740975547105","host":"s3://npm-registry-packages-npm-production"}},"0.1.104":{"name":"ugly-app","version":"0.1.104","_id":"ugly-app@0.1.104","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"30a8b69312c8895483998e517cd8ffdf28a0534e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.104.tgz","fileCount":1096,"integrity":"sha512-0wkDdyQST3/li7szvH7pCR5nWyX4s9dp7d9MN5+iUYFFkpsFqLf5lCXJsTOUnKwUKxEbgWX17jHdxEmukXOEKA==","signatures":[{"sig":"MEUCIFz8QMR1+hJFjGDxGTMmDJ4Gf3RfLxMkudxwtdVLwnn7AiEA0Xj0sW7OsYogEGcukZ0oUGSpnpJYIi9Ljdy908OaOVQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5889154},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"40c517cb5551aee728e313703e7884854c2654f4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.104_1774845213719_0.7771822098348984","host":"s3://npm-registry-packages-npm-production"}},"0.1.105":{"name":"ugly-app","version":"0.1.105","_id":"ugly-app@0.1.105","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d992262a63e21c2bf289a15ea96a92231b292cee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.105.tgz","fileCount":1096,"integrity":"sha512-c4WJTkWoxRd/HLVLV4rt9WUq4I6K98QDQ1rHgcxfQgT/hjlKQjnsdYIo0SFgKDHoIihZWNftq7b2y4TfNbFECQ==","signatures":[{"sig":"MEYCIQDhDF7EKSIbjumhUGoKCixNn41e5RI2deXfWH/pLPIzYgIhAOKDd4tu3n8rHZ64rwYL6cbG59lQ1qgnxuogNqY53Yws","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5886016},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"4fef8cd975319d98493b38cef0defc9dc8d0fd68","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.105_1774848018828_0.045469053821165284","host":"s3://npm-registry-packages-npm-production"}},"0.1.106":{"name":"ugly-app","version":"0.1.106","_id":"ugly-app@0.1.106","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"79eefc994b1485f8d3178b030c7d0a1669f93ddc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.106.tgz","fileCount":1096,"integrity":"sha512-IAFtNMSrViMfthtny0+EFXjxkxkn9uHT/b5piwGaP4cCJmdXIAq0QG8CSlK/zF0L5egB819yTQtOf9h1E90bFw==","signatures":[{"sig":"MEYCIQC2sq+eeL7RZpAw8/FPtjBSV4+OOwlrhQkydtl4AUn6dgIhANksESKbawHTD8YlKBjvDPy9qtJgjNml2I47JQn8k4rF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5892813},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"571c10d61236412e918ac0f30ca42ffb34f6e9d1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.106_1774851052420_0.04635467523796","host":"s3://npm-registry-packages-npm-production"}},"0.1.107":{"name":"ugly-app","version":"0.1.107","_id":"ugly-app@0.1.107","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"134002beeeea059a3982c28cfd66225d09712a3f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.107.tgz","fileCount":1096,"integrity":"sha512-CQjtYwkxdvWdtlo7Mx21Ew4RdtY15dqwt/IX4fQ1rQ4dK5erk1iutzj2/FEh6AutsS5jeM8crTRtcRBoH86e8g==","signatures":[{"sig":"MEUCIQD8tLfR4+CNQ49J63Kpga9r3XAQI0VyPhG5GRS4GRhIlwIgMGJquO9FsJbRRtp7PsEXafepC2nixB6+fRumnv+S2VY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5894916},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a8158924ae7ada801e450d98e704f145e8acc265","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.107_1774852646716_0.7271690476329444","host":"s3://npm-registry-packages-npm-production"}},"0.1.108":{"name":"ugly-app","version":"0.1.108","_id":"ugly-app@0.1.108","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"22bf1332db30007e3fb5e37e0b95fc0d916bf964","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.108.tgz","fileCount":1096,"integrity":"sha512-/NJQg1UmC5KyaHu+sAh5YNcgxsDAIW0+/3LOCbnwyHs62R5scy76Qdkj18hA5N6vJLi94dcGdrQw63RUBL/POg==","signatures":[{"sig":"MEUCIDVbT/xXllpGLwtbdLritQHYJhGMYw8L3FfvfSPGoDkYAiEAt2wCH2YDNIlfW7vS70m2Vduz+pe6/FEXTdbxy+xKOoo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5894917},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"072802594b808b5a71fa0415c7ff478df0f5f218","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.108_1774854286772_0.5818242884588503","host":"s3://npm-registry-packages-npm-production"}},"0.1.109":{"name":"ugly-app","version":"0.1.109","_id":"ugly-app@0.1.109","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4b54d83fec0cd9b6e07dafb0736318c342341ab2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.109.tgz","fileCount":1096,"integrity":"sha512-ENpqm41E44Qa9xJjOGYVm0TZK/YQbelCBD/WpmZzOEnT1U6NslF31QZOyqw+9MgdEiv7a/pnHq8fsPaKPB/FLA==","signatures":[{"sig":"MEQCIEpOHQf26gyzwMUZVKpaObUtVuUALqaCl9qllpIcCbaZAiA8qaFC20oCpv2i/tNVlyNuu/oEeINcdkC0f0D20BdY5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5894927},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9a06fe4204fed42ee0eea5b20856dedba78d6497","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.109_1774854462168_0.28536910967785833","host":"s3://npm-registry-packages-npm-production"}},"0.1.111":{"name":"ugly-app","version":"0.1.111","_id":"ugly-app@0.1.111","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d1f08f4b135f9133edfc94531eb078c2350d5655","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.111.tgz","fileCount":1121,"integrity":"sha512-qJEI72s2nl8UsLiZ2Y8gXK1e57cxrvchqTx1ncaS1SRjuT558lO2UJ2/uyYUqF2glTz+8usYa+yDfdK0ZARHpg==","signatures":[{"sig":"MEQCIGxuXd2P2+FZUALBsmGw96jF2ZlSISc9DY6ho/WRKVg2AiBwssi211f5E8T+tA3XD7+1KDEwFzclipH+sTNakIW7tg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5967685},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"20be64d55c2ddd550f4ce0f9084cca06d6676d67","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.111_1774882585330_0.8855621996598102","host":"s3://npm-registry-packages-npm-production"}},"0.1.112":{"name":"ugly-app","version":"0.1.112","_id":"ugly-app@0.1.112","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e52fcf22754de4d07ebfa5fab38d74f7a5ea418e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.112.tgz","fileCount":1121,"integrity":"sha512-wR89LF/CzdlkNqEwpBCDlveHm2M4KDHLl7zfm79h60hlxzoL50QJ8p6VRkO9TS/5qhw8TwXcQPbJWHd/FYco7g==","signatures":[{"sig":"MEUCIQCY3bs/LBZesP4gTSidzM+z0tbbABR/l/56E7/sMtUm8wIgQAzDUqcjVe1FzgcjXtgjRveJd0+JS806uKPSl7oQ4dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5967685},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7e305317ccf94a18c9156e4608bb5f92ae4e8898","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.112_1774882656399_0.9721425430765063","host":"s3://npm-registry-packages-npm-production"}},"0.1.113":{"name":"ugly-app","version":"0.1.113","_id":"ugly-app@0.1.113","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"867758523d48480e6f8558e6131a14e755f77f20","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.113.tgz","fileCount":1121,"integrity":"sha512-aGRHvmhY4fVBQDRrflj3SmGjdnrYoH2UmOo1i29mApzdhjhfqD2tDjPSu2DC6JDmVSjI1oeEo5tviCIvyiJyQA==","signatures":[{"sig":"MEYCIQCZMb5WSuUSzLzXThObTobYt5ae0/40tXciRSVJhNiP0AIhAIEZoJ5pqGu7uW32XTcF+efZKzbUJZAnPkyJJJdjabgH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5967841},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1e009f649090740e0cb43093e8965e2745ad7b35","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.113_1774882924262_0.3084004031321488","host":"s3://npm-registry-packages-npm-production"}},"0.1.114":{"name":"ugly-app","version":"0.1.114","_id":"ugly-app@0.1.114","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"72f8e199c202145c7b7e05a7773098db058440de","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.114.tgz","fileCount":1131,"integrity":"sha512-CS/I/tHdK/KQajRHwtzdkDytlTfcgCRSQTJ4PZoTutOfS+8pDyVxYrNaBASwP3prukfSJI8xYStmSjBBsFh+Pg==","signatures":[{"sig":"MEUCIAvzjT1k3NZBFrt6+mO0Tua+RdweS8NfUyTb/I5iHrlSAiEA0LAD9M/8xVH4dm9a2A78OYJsEf/YjQnzWKmVKovmM98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5988567},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c8719d250c4fadc91da6ac47bb47f8190a743a0c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.114_1774883209052_0.007496096102672656","host":"s3://npm-registry-packages-npm-production"}},"0.1.115":{"name":"ugly-app","version":"0.1.115","_id":"ugly-app@0.1.115","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"97f200413840e3ad39395e2632770242d0608fa3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.115.tgz","fileCount":1131,"integrity":"sha512-MFO7ezPBDrlQR1oUCCWIzj7ki1unPnC6skUafMvHP4fwbtWwvgjzWuDMQmCxTA/nTHkEUm3twAR233GIhhM1Rg==","signatures":[{"sig":"MEYCIQCcLyVlL0VPXT3PHvrWXQDL+Q3spygJeITbPl1gDhxgJQIhAPfK42hUMgEA5E2u5UP6P/LbNzSatlyae3p1PVfpv1tY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5993785},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"8a032bff5d8eabe9090b117f4979f5f811957e83","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.115_1774883440649_0.13390375502833973","host":"s3://npm-registry-packages-npm-production"}},"0.1.116":{"name":"ugly-app","version":"0.1.116","_id":"ugly-app@0.1.116","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5a7c9b2de9faa381160ea0ceb6355ad87949309d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.116.tgz","fileCount":1239,"integrity":"sha512-4QbR1WsS6RBYnpbddlvqYGBCmLf1kHjNGWMp0c5Xh+YHMePPNbOo80rW7I+InBHbGaHkyIEa839d0a1pzqkYaw==","signatures":[{"sig":"MEQCIDtXz518atuTmP3n/rgXuS4twqDGOsnkgdJStOYwPH0mAiBn+xXHvzrw61prMToIL/4splaqrv/hPc5jrBmsc0k3ZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6424747},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7ebab8c3c1b73e1edc0827b89e957084985b9782","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.116_1774883934250_0.6621773440849943","host":"s3://npm-registry-packages-npm-production"}},"0.1.117":{"name":"ugly-app","version":"0.1.117","_id":"ugly-app@0.1.117","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"54ea86242459764ddbd00ef64d8730b9ca1483df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.117.tgz","fileCount":1268,"integrity":"sha512-JUZvf2lIvaTSvrlgj383qIwQO+N3vZLCuVf9VeUHfdLM7ielviKJLAZzK4TW0Z2c6BtB2k9i0L3P333G+A3u7g==","signatures":[{"sig":"MEUCIERJ8c7SRoud6GgelPA3SuxvxUvfmgXxIal3CdzNtvv4AiEAh5BpopGKJCAQSrdDNQisQnxF4Mpziy+eDNfn3MPseRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6776747},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"3b77f40780cf85a70ffcf92da5c2e9dd97c45620","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.117_1774884231038_0.9199106048899193","host":"s3://npm-registry-packages-npm-production"}},"0.1.118":{"name":"ugly-app","version":"0.1.118","_id":"ugly-app@0.1.118","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f7910d30a6eab3340b9890e8f9aba47ee2605b8b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.118.tgz","fileCount":1274,"integrity":"sha512-PlxChzC5+DCssBpv2YoJ/R+Ms7XOu/xg+t6XKbJqmJGCfWcKMfaVGiyJbwv2YgNefqvzsMfUFB4yxjNFgN6O1w==","signatures":[{"sig":"MEQCICjC1NJXPKZ4QHtp6q8n2y4w28A7tdeW6o+hAtH/TDSOAiArXSkLW18P81dipLc5cBOHeDBvcwMp7GeNh7qZTl9UZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6833086},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b60a4a5b04476d6a2343c4499ff2b6b42d70d07b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.118_1774885867007_0.9685569843958102","host":"s3://npm-registry-packages-npm-production"}},"0.1.119":{"name":"ugly-app","version":"0.1.119","_id":"ugly-app@0.1.119","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"42d0849d52dc17e5fc0ca8825f0c80ef4e80bc0c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.119.tgz","fileCount":1280,"integrity":"sha512-BKEAMWuPmyGXeviZspSn+sdxuGgts/unoQ8dgvF9OOSdQRBbrcqRl5DUvfgkk8zrXRrSABfB0BrIvsmIIZxw3w==","signatures":[{"sig":"MEUCIEBgpXDyzxDB8jQIsbwLRX0kCSfOgRsnAYnTYOq6GNLoAiEAoHeOZHoYPVnbmHltsnT/ltxZOsUmUbv5LezOeHFBVEc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7056813},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"aecdbf72e2078df5b0c947a44d2c409b323e6775","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.119_1774888585660_0.3824750559480685","host":"s3://npm-registry-packages-npm-production"}},"0.1.120":{"name":"ugly-app","version":"0.1.120","_id":"ugly-app@0.1.120","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0f11949b25d75e210d67298d737fe4057f5d647f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.120.tgz","fileCount":1280,"integrity":"sha512-glpvw0XIbOpcTxJumR5zfB2mBH5ZxfcEcf4LweV+q4+hP3F3f5AYtID/0CoGiIX/5B3V+50wNXi2I4wtTApiZA==","signatures":[{"sig":"MEYCIQCNpVpGPkRYsza5hKCd0dKuOFcJuajxfkN2V2BT189vcwIhALSuZMVXhrBcL4zrbGS2D3XGMiOgrZXRtpinGJAEr6l9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7056448},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"649ed13e4c465564ede1fd0fd1f2221043404b6a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.120_1774917936296_0.41338043084111953","host":"s3://npm-registry-packages-npm-production"}},"0.1.121":{"name":"ugly-app","version":"0.1.121","_id":"ugly-app@0.1.121","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b01f60a8adab149c6481d6a24f80390452457d78","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.121.tgz","fileCount":1280,"integrity":"sha512-uhGHOmrp+94+qJZtcBAEzOJEUtAKL1BIkXaTl0J+oMLddjNJdA9P36/5YmOekEB7uQbYKrzpdjyKB2717mUPpg==","signatures":[{"sig":"MEQCIFYv2rcl/Wqk5HoBMDDvwXfhOeCUxsSxceGSYDLLaMkdAiBo9Rcux/MAvZmEZWj0nHYtog/iFDz+KZECbbfEn2a9pQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7058088},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5faf87914a914ff493d4b9035565f36f1d3bb4dd","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.121_1774918167479_0.04482706049473517","host":"s3://npm-registry-packages-npm-production"}},"0.1.122":{"name":"ugly-app","version":"0.1.122","_id":"ugly-app@0.1.122","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c90ecac942faf685e1706bd69101803a3e12e944","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.122.tgz","fileCount":1280,"integrity":"sha512-KSCDZV2rIxWDdMOT69jW57nteiaxaVEB2DzlGufxCscYM2M8cHns86Tx4xfOzke3FrPB5vjqk/VoOYKv4wYvzw==","signatures":[{"sig":"MEQCIBVbr2OcHdUKeksgUi3n3//yMYaKt+uX0obs+pJjxzxaAiBDmohTi2+4p4pNkc4cq5VXnmMPh0+zcOoIs1rLlLy+qw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7058088},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"8427f179924a6f1faf848e47ae4f9d9f9aac9364","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.122_1774918349359_0.9491200879516848","host":"s3://npm-registry-packages-npm-production"}},"0.1.123":{"name":"ugly-app","version":"0.1.123","_id":"ugly-app@0.1.123","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3a086fd796dff157241550187677c46c39b78877","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.123.tgz","fileCount":1280,"integrity":"sha512-9bMHene2h2OCI7SCUO9vL3qK+71OVjr4dg0cjj6tkkfN8i99NkvOhPrsLDjmNLcEuff4q/gOEx3/l5JhqlOH0g==","signatures":[{"sig":"MEUCICm78LyJy89/zf6kePOE5fq7mnllYksUOOOJrsGIAeJ3AiEA3C4A7UNXn31bjuYJnySh/rJ8UvbMySHOJ/VyeTpimNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7059245},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2a575260a3f663caa15731bb3cfaced135d91715","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.123_1774918476131_0.6169447710683891","host":"s3://npm-registry-packages-npm-production"}},"0.1.124":{"name":"ugly-app","version":"0.1.124","_id":"ugly-app@0.1.124","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2dafa2c256bd55258f5bdd494686d48cb29ca507","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.124.tgz","fileCount":1280,"integrity":"sha512-3ziZDzgaOwVhs01y+tm862FNBHnxCA6LwKfTxlk/cBB8uz4smoVD4O6S7a/7LmZ2jmX8x9dxHqxMiu2p2XKt2Q==","signatures":[{"sig":"MEYCIQDz+E8o9mV4oZ2sbgdjb1yeH3PUgGeW6PF4r924s1bfBQIhAOw8Qwk+y+bDgonzO+ZcD4VCPLRCgVEIY5jVkEbMVRua","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7061074},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ebe65a1693b27191169ab6bbbc6de938699d1b0d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.124_1774919014707_0.1906144368135505","host":"s3://npm-registry-packages-npm-production"}},"0.1.125":{"name":"ugly-app","version":"0.1.125","_id":"ugly-app@0.1.125","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7b372a0fe0195e110ae10e7f3999fb4b248a8990","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.125.tgz","fileCount":1280,"integrity":"sha512-Ijw+1K2BDDOIXNJoDQvNXkJo+SbqF+6eVH5tHvJ5KbuO6bnuCOib0alDJ9c5dgxswAViPd5Eip6HhDMe6KDmwQ==","signatures":[{"sig":"MEUCIQCzM9yVt3Rf8trBwP9OpLT6NihKBbEWIx3Jg5B1s3IMkQIgQQTM7nDX3/6BAk9DO1iKW+1z+23whMYVIluKCk0NKxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7056507},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6b42b02854dee8da7996fdceef27c30e15428be9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.125_1774919549690_0.465562810742709","host":"s3://npm-registry-packages-npm-production"}},"0.1.126":{"name":"ugly-app","version":"0.1.126","_id":"ugly-app@0.1.126","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4805ebb352e6f37486873201ee9c60dbd09ac4be","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.126.tgz","fileCount":1280,"integrity":"sha512-B53vOGtn2FN2R6gOHT+ruHy9kSiSZJFoT7hrtNMX8JzZ89UarfY6FgGzeQgmB6HYMuPUid9AbxxXkof+fvGR+Q==","signatures":[{"sig":"MEYCIQDOx9tBIsW1xdHA2KgFiOzBW6Ab1eaO9co67/3rU0ElmAIhAO+W4gNgQ7aWHAYmR1I7+6vWYNMX2GczewEow/C54HN2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7067281},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b8e97f00819922a38b4493dc7ea855db9f042f6b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.126_1774920298377_0.03566513044589925","host":"s3://npm-registry-packages-npm-production"}},"0.1.127":{"name":"ugly-app","version":"0.1.127","_id":"ugly-app@0.1.127","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1c57210d8aca047109209b63dd3253ee312025e2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.127.tgz","fileCount":1280,"integrity":"sha512-veeR3fdm8LAdb9x7kiPa/oAucn5a4KGAjhVvgnfQW/8HF9PKYOyr+bJIgSJabieliz1dBSp+OQ7dWzhuG4fpVA==","signatures":[{"sig":"MEQCIBNjRfE5yF2woMNyA+GHXzroeCGGYQHc1BIRdWhN2LMFAiAtCGFWmeVqeol78v+nHRTpXjXjgsMdk1feij9s/yyj3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7067281},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0f47af6fa192ab1004f6bf12b6d58e1f145ea542","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.127_1774920454134_0.5034106445609201","host":"s3://npm-registry-packages-npm-production"}},"0.1.128":{"name":"ugly-app","version":"0.1.128","_id":"ugly-app@0.1.128","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ee5a5dd85fc919d58db3050fbf2ba558d969a0a5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.128.tgz","fileCount":1280,"integrity":"sha512-9mCEKtNYf2YwAZxDJEnRiodMYlEEZSnjyTB3HOvzZB9PbQHSGDmeR3tJ+IZmBxRJ4QPd3oXBalE+cnW3Segz9w==","signatures":[{"sig":"MEUCIQCb+iYmL+zOGA6iM8U+kPyPGVuVCcZtC/0neOI1lC1lQAIgWyXARy468ZUJHBUpYmROsa/fFAnG5nC3VEb8Fd4HMOY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7066078},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"eea75e83a325bf3a632f80a8be399c8dfebf5e6e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.128_1774925730211_0.28488761630518034","host":"s3://npm-registry-packages-npm-production"}},"0.1.129":{"name":"ugly-app","version":"0.1.129","_id":"ugly-app@0.1.129","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"418d30a001dbd97e4ee530aebe523f7ee50dd04b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.129.tgz","fileCount":1280,"integrity":"sha512-PSkMEuqz7lQx1MuRC7fDzl25NPrlygCFwztZPJSm4SLO2DYrR7k9v36gz5lJYk0VklP2WMoezwRbg1Re1+sa/g==","signatures":[{"sig":"MEUCIQCTbgSCh0Kmm5nWqNF7gvT5tM6kSMUm/yURjE3C3/EsMwIgFDDiy8UXc2/xXuAjhPWmk95dzTuJhb0WtHIZ9PnxzNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7068458},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"18d7b66a3dc66f9a06dd4d1b04b8682106fb1515","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.129_1774925968193_0.8430833458307931","host":"s3://npm-registry-packages-npm-production"}},"0.1.130":{"name":"ugly-app","version":"0.1.130","_id":"ugly-app@0.1.130","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"47229b2a19da51d54afe5e36cd0e40f8bdcc781e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.130.tgz","fileCount":1280,"integrity":"sha512-dtdi6IsEhn7VaogfBGv9Fao6yI1W+rbYgShJLkKexORc3Ze1dkCwUbSCHZVk/mpT0kImi7/rJPerRA2vgdh1+w==","signatures":[{"sig":"MEQCIHoYRXqizLFOg5ZgZSD5T9IUFe9krNLukahLK0n6NAqVAiAKOlAsqtO6UzHDw2KsBksr35WzppiLLZABbJQsDwwDNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7068458},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"512be3825947c3acb27ffd20157d6a508eccae1e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.130_1774926113139_0.9819630772956747","host":"s3://npm-registry-packages-npm-production"}},"0.1.131":{"name":"ugly-app","version":"0.1.131","_id":"ugly-app@0.1.131","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"074574f59138e46b240094af964cdafeee55c3cd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.131.tgz","fileCount":1280,"integrity":"sha512-u96tP3EjqhvAxej/NHDnpJfuDG8Uxsy+rbX9NEDBdlg/n5/UHj86lAq4YfmNb6YpMXqKvxQ4hnjkAGqGIkMDoQ==","signatures":[{"sig":"MEUCIQDynznE1at/f6kU1IIlA32XXHdTsfN8E62Y02m2NiFfQAIgbjVjXpLg7M2mxdaEs/tYPU4rU6PChAdUpSe5+dH+l5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7073598},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"181ec69f71201698e3d0134545050e75e58d864f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.131_1774926462892_0.5933225706934144","host":"s3://npm-registry-packages-npm-production"}},"0.1.132":{"name":"ugly-app","version":"0.1.132","_id":"ugly-app@0.1.132","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cbb9b20e71e6d7ca9e9993fbc21055656b673345","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.132.tgz","fileCount":1280,"integrity":"sha512-FMPboHJTPAKRfx6BPRbMs0tC9EnE1TpNXW3DjBaFm6sxN1MWADgvDaFbdHewioOi7IhE55J+tk/VN1HplY/chA==","signatures":[{"sig":"MEUCIBznO70I1hFCS9PhI0/QxpFqC+9NUy/twRpfniW4hFoGAiEAjlqradXRvg9hfiwvHB6WeildfEDG87ydl3Jy83RN2lI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7077925},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0fa013107084f7526d1f89d4a568e0179319a82c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.132_1774927312467_0.45490851501831453","host":"s3://npm-registry-packages-npm-production"}},"0.1.133":{"name":"ugly-app","version":"0.1.133","_id":"ugly-app@0.1.133","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2c4bd88abfd667fef7b9063d7b50d18fb03628c3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.133.tgz","fileCount":1280,"integrity":"sha512-r4MQLpGDF0gYu1KEgUBST/CBBG6AccJLhU0sj9jlvyA3Cf0dGXwFrvaucC8+GPZy1rmvLFpvtlU2XaGKI2rqJA==","signatures":[{"sig":"MEUCIAD35jJ6PN8Vhm5LhLjDRBuPHgu62djNCRJK6+irNW+ZAiEA603i0fHc+NIrjGgkfxNfDOSusHPNQ91GDVH9zOUzK4M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7077760},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"4967c8ee606bd8bbe3d1ac939c1bfccb305b3f86","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.133_1774927629523_0.9632981864631391","host":"s3://npm-registry-packages-npm-production"}},"0.1.134":{"name":"ugly-app","version":"0.1.134","_id":"ugly-app@0.1.134","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d5dfe35f5ff8748e1b555b07a041ccc9a2b410be","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.134.tgz","fileCount":1280,"integrity":"sha512-e0ITcMnPZf8aizQLjvkkdzZGzkmOpeSgQAw12Xy4G5czNPhEcHVZ7JUsnsgBpM4obwzvnxWw7TJzTCWY8vJAVw==","signatures":[{"sig":"MEUCIFkKzI5fs/X7MpTSts9l4BgbL0LedquGMs34vEnGeVvTAiEAtqjw+K2usXlCv3qiwH+8payoacbYSVIHwHoQbzgsThI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7078231},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"bc03de964d7e7ee49d9e75316d9c7c56e1ab176c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.134_1774928044466_0.1744014642062237","host":"s3://npm-registry-packages-npm-production"}},"0.1.135":{"name":"ugly-app","version":"0.1.135","_id":"ugly-app@0.1.135","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0a9735e27c607e702605e3e3d7bef526ccbcecc0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.135.tgz","fileCount":1285,"integrity":"sha512-tbCyxjuHY2q2iy1vlO4yHxVHCs/2DKUA3XfvYlQRG/6Om+Czc9/2OmhCmY11wO42oGdwJ6678sdhGknbC4mDTQ==","signatures":[{"sig":"MEUCIQCmsxFXu8iJLODFr/wJJe78A3zweGQaR83dJf7VrV5tgAIgMhDC7KfCO3vyWMBT9XwCfo7xpJXMv01t1WJ3bhvemAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7099408},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"fb0bce62fda2a8847d9c26c288f5e2f959ef1486","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.135_1774928908025_0.5663721311592931","host":"s3://npm-registry-packages-npm-production"}},"0.1.136":{"name":"ugly-app","version":"0.1.136","_id":"ugly-app@0.1.136","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3490a2c2bdf4e9aeeac17e18a1bb9828b1e0c994","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.136.tgz","fileCount":1285,"integrity":"sha512-FmPH+wk7ViLq2pT/iMvMC89PNfsT1Mjzdfh07l5i94VvOY7ndaFKU2D/PIcLDk6nwUM7Fm1euKJVJq/0uTr7sg==","signatures":[{"sig":"MEUCIHZFkoH1FWrfyx+DW8cMw0c9KpzKhsk1qc08BH4v+cxQAiEAzm17LOaKDYFy9AXBWPCndK8l8FoSaLFPyNCk7k53kRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7099715},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"875d9a0adb64e55fe94c1d7e74ddbd63bec67723","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.136_1774929086438_0.48631745861143916","host":"s3://npm-registry-packages-npm-production"}},"0.1.137":{"name":"ugly-app","version":"0.1.137","_id":"ugly-app@0.1.137","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1791325ab2dd8eff54dcda58cd5e0bf92676a608","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.137.tgz","fileCount":1285,"integrity":"sha512-0UfBnhOSczVFlE40wxFJdh4PbTt2ICCpEUC4tGHZwRMNx+cdrZZavVvuDTe3/QqlNETyhjwl4mp7EzGHMTj+wQ==","signatures":[{"sig":"MEYCIQDltjUpIDZGYNOmhrC1a/RBBEH/sXZcOloXLGFRvZxflQIhAOEpq8stw7004zSlfZ62+EWFWUSUzjx2LIUvAAXayBhy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7099715},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e8e8573abc77a160ad1448c2b96b2aaedfabdcac","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.137_1774929208588_0.9881350768758383","host":"s3://npm-registry-packages-npm-production"}},"0.1.138":{"name":"ugly-app","version":"0.1.138","_id":"ugly-app@0.1.138","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a98c6112d5cd7b9376d60659462f9658a5976e32","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.138.tgz","fileCount":1285,"integrity":"sha512-WASJu9Fd+EdvGCAanZx7ambn/8kB3JUorwbmvolyIC/C3ktCDDTZPkN+tUrBh+YZulAMCL+Iz8ywIGGMxZfIfw==","signatures":[{"sig":"MEYCIQDIiTG1e81V1YLztYyN3hptt90jiZxi1Z2g2vN0WT8utQIhAIfEUH7aJ1EteH19O8pCClP9FEGPVRKFwCU5SsM7tTyv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7099791},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"85817ae7ee35246a89ebd7f517e93e2802816332","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.138_1774929819352_0.11258564332789733","host":"s3://npm-registry-packages-npm-production"}},"0.1.139":{"name":"ugly-app","version":"0.1.139","_id":"ugly-app@0.1.139","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8d73af42518d398cefc14990954cb6fbfdb8af5f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.139.tgz","fileCount":1285,"integrity":"sha512-P+K1+RmLR1XdWYUTQoeh3Ff2MJD1DlPDNLCqZCbd5Z3Qj9Rk60hlVFl22W+qKmhsepoGFde71VyP+8sOce0PcQ==","signatures":[{"sig":"MEUCICsvOcY7RpjcAo7lQ1A8MtMs6+zC9PRw3NEWKWMBnsWtAiEAvcf/LTyk1uDyRAirUjG5mLkJJY7elHIH21F8ThOHF0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7099262},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"967a0477ed1ef165def4f35fb656b6793e4641c1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.139_1774930056392_0.11496319960809598","host":"s3://npm-registry-packages-npm-production"}},"0.1.140":{"name":"ugly-app","version":"0.1.140","_id":"ugly-app@0.1.140","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"899fafd7b1f8cb9fc6f9d5fc5f89575b3aaac885","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.140.tgz","fileCount":1285,"integrity":"sha512-y9t0oBC0Wmor8FiOjVgHYlXwzHF3wsc15SwvtapNXpmo6fJo/O+5Xj8l3WKicQYfC20JLXgJ8A/QjYVdh93Ggw==","signatures":[{"sig":"MEUCIBW+oH7R3TzhYc6rkh3yuOgjzLXBq8qfWnQL8Wbdga19AiEA2mfxIkMUtld0KJaLqE8pfZH0ur6Nf0ZC62/9dkMMqyU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7101758},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9a57adac8d1e895edce4dead4ea17051aa3cf158","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.140_1774930326342_0.8951027922386683","host":"s3://npm-registry-packages-npm-production"}},"0.1.141":{"name":"ugly-app","version":"0.1.141","_id":"ugly-app@0.1.141","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9d622339fee2ddcda76ade102dfcf45c226127cf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.141.tgz","fileCount":1285,"integrity":"sha512-CGLIsjWpgLrR4bcPwtuIw9Y3/4j32EEVidbmif7kpvLYddaikPF0q7J/R0aHKl9NDnalhMD6tx1LWKbhDDkErQ==","signatures":[{"sig":"MEUCIByI9RRLZkXZ644J38SowhSBCgqFHjiV23jDRZ05EhTwAiEAlWA5G1Hl/tbKMAkkfLXEuQVgdaNDFOxPM865BLJ5KRw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7102111},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c65a9e2471bfafd6a68b12889510a488564a97d4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.141_1774930518001_0.9852699771857756","host":"s3://npm-registry-packages-npm-production"}},"0.1.142":{"name":"ugly-app","version":"0.1.142","_id":"ugly-app@0.1.142","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"baa4e293f3e1e0a9765047c4754e30b025cf9c90","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.142.tgz","fileCount":1285,"integrity":"sha512-7R8z3/iUX3N0dQp3xxnQuNSDrpoYkfLvN6YPY82icgB99X6CdbyVa2knpARo+ytfbZVGiPQXIY2P+3M+2vWzhw==","signatures":[{"sig":"MEUCIQDI7uYviTrKXNNqsxX2dXaNAsxw2/wY+u0HvtiNIiRcDgIgdD4TH02eeUX5HBWBGsloPAiXra5/mKYmS2g89oGu4nI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7100975},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"70acfc938db96523680011744658ae23288defe5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.142_1774930742850_0.8135998947945853","host":"s3://npm-registry-packages-npm-production"}},"0.1.143":{"name":"ugly-app","version":"0.1.143","_id":"ugly-app@0.1.143","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b95c2e4727fb76fc3e3ae8193c449b6dbb07413a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.143.tgz","fileCount":1285,"integrity":"sha512-E5VDHK/r4Hy6pZhdAiYuoho6zzI02CTZUvI463vZkW2lxhef6uBItSsli2FE+adXrjsqEoAERkq3DkokCWCbCA==","signatures":[{"sig":"MEUCIQCjHWtVnQKMqrTn9ej/OVPmf10l0iqVYH503RO0PGANMwIgY9oy8JOzvOoeYAWUXVnxFnZ9aJwFz94f0TjzffFPfnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7098344},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b551e1e91752c57c4ff1633f285319bfd279cb28","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.143_1774931575299_0.2578703286592823","host":"s3://npm-registry-packages-npm-production"}},"0.1.144":{"name":"ugly-app","version":"0.1.144","_id":"ugly-app@0.1.144","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c94298c27a302ac1eb24ffdc25e9b52d74053792","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.144.tgz","fileCount":1285,"integrity":"sha512-WjVmNRYyKziUftW2AXT8iYrka6uhstZUrQeM+1iy1zeFK2sSK1jvBAsM2s0M8Ai+1cM1v9uRZ6x39GSqB63YSg==","signatures":[{"sig":"MEUCIQCNCnnkqeBvSOP6ChKtmRxSw/KwAYlDPaKW5T+5YzNQ2AIgJCkbeCqDQigc6qYUpnzS4RLdabgnfyiTClucf9x3+k4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7102607},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"70485a0df479fa585e6a336fe4970872959af87e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.144_1774931925752_0.6428952775433323","host":"s3://npm-registry-packages-npm-production"}},"0.1.145":{"name":"ugly-app","version":"0.1.145","_id":"ugly-app@0.1.145","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"df77765e3cf45768e901c08468c26db2cf7355ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.145.tgz","fileCount":1286,"integrity":"sha512-pNBJq1p/Xe2E6V0Eg2V6ra2cR8KZLeT+6TqS0/Ss9M01Tl4AhUUiS56bGjEXlGr+Rsukxqc2lt1vxd8TmfxF1A==","signatures":[{"sig":"MEUCID0zMIw6tTDUpnfEnR4CT7/cHziReixhy/vgkCYeBdfMAiEA1Ya9rUFwOiXMgM/IrkJWjoinRYDYaZCuDEBdjBJAnN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7118658},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f020420d79d38669a76fc561c730d6ed4000d902","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.145_1774937506589_0.5478716615475281","host":"s3://npm-registry-packages-npm-production"}},"0.1.146":{"name":"ugly-app","version":"0.1.146","_id":"ugly-app@0.1.146","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"041d94712e64e53fa0447db5e9184a52b038f8db","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.146.tgz","fileCount":1286,"integrity":"sha512-nOAelh000oubDqJePiWlcOwXlmOfWtIIt5PpqrxCU7rB+337O/4bMWmCk4H0Re5UMfjzyssNG5rayZqiSaAJyg==","signatures":[{"sig":"MEUCIBJlWk8Pt4XID5CRXt/JJUIRJvbrdKdkMbO7uyJB2H8rAiEA+HD7VAE2XtiUZicoQl+QopvUfEvYVjNsxXa2OAlLv6I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7121728},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2dd542a57a7bbfb19a6f14006affd8bb9d596a7e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.146_1774940189178_0.4323771743034004","host":"s3://npm-registry-packages-npm-production"}},"0.1.147":{"name":"ugly-app","version":"0.1.147","_id":"ugly-app@0.1.147","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8126c4b38e41e2ca87234de237d155456f7220d3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.147.tgz","fileCount":1286,"integrity":"sha512-6kc+KJIQ2OO15abVk2ITk/7WCI9eUrTMWAlnKpQNDZv1bV5PqUnioeeR4r7IwcSXnCGM2Ry0IeRtRzPLQXCDFg==","signatures":[{"sig":"MEUCIQCBDxCtyzp2oILmfPicxycFcUzLCnFEaDMEapFb3vi+0QIgJ4klGGTMh/f6IBD+DtR+tr7Ll8gqkVnkEslJNjpR9Mw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7122668},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"978394faef76dc196571e67e390bf2eb791ccdf7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.147_1774967352740_0.8461384974248756","host":"s3://npm-registry-packages-npm-production"}},"0.1.148":{"name":"ugly-app","version":"0.1.148","_id":"ugly-app@0.1.148","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"612b23382bdf3d0943aff707fa6a86c49a89650b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.148.tgz","fileCount":1285,"integrity":"sha512-8OGEC43fgXzg2BLY27Fa221Hz9qt+ito9Ix1OoWow1Pe5VoNh/6n238GEIVu26fm5n2LuYlCJEuqJSBP6z+M4A==","signatures":[{"sig":"MEUCIQDXjcPFc76QJ/EVqC6xTO5Hi+GvROQ438xQ2c37vBdiKwIgQzdjvK0uJ6D7cxwzlAH9HI69dN+3VcTlvu7g4z8BB50=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7124514},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"48fc17e3fefcc7d92f54fe12fb3cc2e3e8eb515d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.148_1774969161893_0.2942554244101263","host":"s3://npm-registry-packages-npm-production"}},"0.1.149":{"name":"ugly-app","version":"0.1.149","_id":"ugly-app@0.1.149","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a3bb134b7608da02aa8ad4dde9af6f228d1a731e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.149.tgz","fileCount":1307,"integrity":"sha512-mPmAf9Xk+AtfNt0xw6MKG1BIMf6gesysBuomxfik6+My+6y5v8Wo+I592tn+M8Os4x7fc8wd8DoU/rAEk0Gciw==","signatures":[{"sig":"MEUCIQCJFigArXEVx7LYu33HiINDEpYtGDIPhtIunKk53OkkhgIgQ8e39NlZc7Sz/99itL3yL5lGiZuwnZc5/iRxFRmXl0Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7146975},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ad76b22faa64a6c071308f92ba296ace119d72ab","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.149_1774972853773_0.8820126908540022","host":"s3://npm-registry-packages-npm-production"}},"0.1.150":{"name":"ugly-app","version":"0.1.150","_id":"ugly-app@0.1.150","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1a536f7268b1a2c08ae17014b460d4c52ec509e8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.150.tgz","fileCount":1307,"integrity":"sha512-O7p+0xnSjJcR0S72OOrzlBvuP+Os+GOmO5zPU/697rJHMZLteuaSk8V+HferWwdZyUqK+o+/C4ffU5BnYW2xgg==","signatures":[{"sig":"MEYCIQDvADoH4Lx6zWC/aGOg5OugPtMEoRaiOBiIs9W22ARbYgIhAKWJx8HN/+mCi4h8DIv1/EdSvS+ehQu6hYA0DukPZo8X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7146975},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0042208aea2071cc8db45063ec31ba2c37abcedf","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","ioredis":"^5.10.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.150_1774972980895_0.750878573527417","host":"s3://npm-registry-packages-npm-production"}},"0.1.151":{"name":"ugly-app","version":"0.1.151","_id":"ugly-app@0.1.151","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"44d0198f0e72614e5df2a815412f8cf1b5584169","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.151.tgz","fileCount":1381,"integrity":"sha512-tNjIsxGrD31YMfhqgWL92TPgP5YaCFkrUWW4jK8Q93x2Gf4uvJig5cMSS5jUIeZJEzVo8Eu0K4DeCWp7xSwsnA==","signatures":[{"sig":"MEYCIQCVSoNMJt5NWMFaeaGz7GwpJv/dD2avDsD4XDP+CQhQ8AIhAMniedDXjGpQctHTYf0UpH/L+Mtx1nvWtP8BMaCmDalU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7311501},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"dd90a597b148889aca24794d080dc6511764dc5b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.151_1775007395656_0.41916549631099964","host":"s3://npm-registry-packages-npm-production"}},"0.1.152":{"name":"ugly-app","version":"0.1.152","_id":"ugly-app@0.1.152","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3ad249160a0b2d786abb9fe8c6d045f6cdd7e253","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.152.tgz","fileCount":1381,"integrity":"sha512-r0xh8AI88cZnB9FOs91afVwHwmiDJK4D6GkZBDbGWevqj43SuShhX+EvzGGF6Ac5/ZOeAVUmXUgpiyEgiwdbxg==","signatures":[{"sig":"MEQCIBlnsUktsS9/+cTvp+PYjcnAGVj56QXNgYT4tVPDAEpwAiBJOA7kR/eDnGXBjsxGhfIHo3ZhHmeB4XBSVFxfOAQd/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7314609},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c659ca06a390935032598a2f62c37aa30ba3101d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.152_1775013787035_0.8919488535106426","host":"s3://npm-registry-packages-npm-production"}},"0.1.153":{"name":"ugly-app","version":"0.1.153","_id":"ugly-app@0.1.153","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b173f30185f943fc6e11e771b1616ac6133ec4ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.153.tgz","fileCount":1381,"integrity":"sha512-KrO/VYgClIRiggoQW4JV6lOZJ32CAUQVgyzzBpQ9fc8Pnk7sraSGF8Z+y0s2+ESNknEAfz85xoQFNroL8W/Z2A==","signatures":[{"sig":"MEUCIQDJRDkMA5f8jEb25Se221xsRREf55+b0Y8kdvD/MVydZwIgCa0Q9JxMsbaxTcyGuY7PVwyAW7Rr2hXScOjZPaqw0wc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7314609},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ab11392137166ee0dd045d4b5449620fdbfd39ac","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.153_1775013938289_0.8494559887731201","host":"s3://npm-registry-packages-npm-production"}},"0.1.154":{"name":"ugly-app","version":"0.1.154","_id":"ugly-app@0.1.154","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"40ce9505a1fda292c3d4e55b02cf2e30688cfc07","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.154.tgz","fileCount":1381,"integrity":"sha512-qmgXel1+LFYXRdYs1SneFtZfY8UElp4idj8JRPaiL/zR52pkSjBQ69fDrAEDuRpX82m6rzs2hZWq2x9/fA00Kg==","signatures":[{"sig":"MEQCIH9ZNqiLE/KPZY5OMTUesg6gwd3lgFZx8EcKTrtJMDaLAiBiroq5lvETsNuTUHHek2sr9LyytXdGDK2opC92WdK4cA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7314629},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7a5f563ac46984aaac5a1c3928104bc62475507b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.154_1775017774294_0.24475172195898431","host":"s3://npm-registry-packages-npm-production"}},"0.1.155":{"name":"ugly-app","version":"0.1.155","_id":"ugly-app@0.1.155","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"41ecf66da0f92799e4060d61e6167f3c1a92c06c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.155.tgz","fileCount":1381,"integrity":"sha512-ibKetX3tREBTnNQKXaSmVOFw6oW5idQr2l47IEjIU/ZXbpccEMufRuE0tszDbecSFWCK5AIL94koyiqNWm5XMw==","signatures":[{"sig":"MEYCIQDkNGU5Z3SuoFU1KdgtCjqWn64OEbOu+2oKBkbCxFRz4wIhANMxXzGKWWONvrHwihyF8OJDKNAoNsUWzQjgiCsPf6dv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7315035},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"872c1c03586b057b60325d8c4af73418c32fa7bc","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.155_1775017826010_0.6165264941360149","host":"s3://npm-registry-packages-npm-production"}},"0.1.156":{"name":"ugly-app","version":"0.1.156","_id":"ugly-app@0.1.156","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"16d9cde4aef9f624a8ba1f5233fcf0f6b606bbe7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.156.tgz","fileCount":1377,"integrity":"sha512-abbzxd+vRLoRz64/vQ9XIE4J3SeUJ+m8ydpEy9LOID3j/G2hA+Ak/BzloVjyNYy9T1L264mbn01iXn7cPLM4Ww==","signatures":[{"sig":"MEQCICjwfYucdj0/gQ8ziLKguLZrtsO6GAYaxZyXOmpmF6TAAiBPLLN/Kg6JmgCzrgfrwVmwqypip9MVlByQ/RtgESAhSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7300758},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c8515e07e7bccb814d40ead845aa22a23a93cd8a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.156_1775017895789_0.6438488771893947","host":"s3://npm-registry-packages-npm-production"}},"0.1.157":{"name":"ugly-app","version":"0.1.157","_id":"ugly-app@0.1.157","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a91412036ba8a83acd5ffe697df7f72e7078e801","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.157.tgz","fileCount":1377,"integrity":"sha512-bqUbUNGJbATK+Q5H4ojbuZDSwEXQXOE3EEeO8jTvxZEsMFv2gzdBIjlMSx+By8c2G2P9vQeum8J0zpMbQq0cew==","signatures":[{"sig":"MEYCIQCWaEfy03cYAvdhOJ3lg8pD7OJUE0x1lU7HcO0j1Vu9cQIhAOtvnIxxzVkBaoLlYo+Epdtj9NfKd2HXdJtOC9+Gs2n5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7324577},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"bc99da8660849bdc6fb1f2ff2757db406dd65234","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.157_1775020333858_0.6360394451931068","host":"s3://npm-registry-packages-npm-production"}},"0.1.158":{"name":"ugly-app","version":"0.1.158","_id":"ugly-app@0.1.158","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9e0dbd67f062e441fc8156492202487ba70505e3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.158.tgz","fileCount":1377,"integrity":"sha512-tBjULGsUYEIm6XWsu3cDfcj2/o8S7DtbVywb4TDx66QBjHEsy2CDp3Sr2tLnEXjBjtZA4cqhP9hr7Za4y3KBSg==","signatures":[{"sig":"MEUCIAOvm9EJnSAqqy0gac329kFfSB0/QH6j9MX7/Y9O7vI2AiEAgw6XrKex9YgEWJhpuL2yIvWHd+AlwPhsuK8MwX5ytkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7325046},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1bcb5730b76a8f2444161f15f8d09051a03cf326","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.158_1775021669395_0.1650093039106586","host":"s3://npm-registry-packages-npm-production"}},"0.1.159":{"name":"ugly-app","version":"0.1.159","_id":"ugly-app@0.1.159","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0a9c5efd7b26fb01b29beddb8defd07fafe19d15","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.159.tgz","fileCount":1377,"integrity":"sha512-Fey32MGo5sab1JVb9Ahjvnf0ERib+DdqzlkVu0GKJtO3n18DVNDmoJvXh9hyiLxBXd+EpjvUtNU0mHyD3Ia5Kg==","signatures":[{"sig":"MEUCIQDzvgTRqFIesIppiU5eZ6icv7/n8UEbMILhg4D+8HkTawIgDMaCAoabtk7312MazQLY/YitgDMaI7RcUgOxoSgHIgU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7326316},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f45e1a2cdfd4a7d360e2f47003279aab3eda1e5a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.159_1775021955058_0.48003189543533176","host":"s3://npm-registry-packages-npm-production"}},"0.1.160":{"name":"ugly-app","version":"0.1.160","_id":"ugly-app@0.1.160","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"53a819e831d4db9bce0c2e51843313e3c03db1f6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.160.tgz","fileCount":1377,"integrity":"sha512-W9ONzn7RkyS7D+VwYO3P+FfkFUHcE2GeJEEijzI90+cy7sONFrN1EgjN7Es2M3sybbUViNu/XmypGbR81g3Y2Q==","signatures":[{"sig":"MEYCIQD038vrDhLz6lXnd56QvixsJvrWaQ3KSXfZeXTciUh7BgIhAJLd0Ub3nCb4g8MBCou9RGuL0wg6dACs484m7JxGqPt2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7326256},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5f1fd750603fcf5d9acf3e37f26840cecbba571d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.160_1775022196875_0.7765746528970563","host":"s3://npm-registry-packages-npm-production"}},"0.1.161":{"name":"ugly-app","version":"0.1.161","_id":"ugly-app@0.1.161","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7eb01afc0615af7407a60a09cf3fafd2fe01f7d5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.161.tgz","fileCount":1377,"integrity":"sha512-5BRLXN0FbvHWQArBMtqyh/k7LU8Ojip/0mbut24yOd3FqSggGlX46orgCJQjhgBcYPC3R/74B7aW7EOdx77daw==","signatures":[{"sig":"MEUCIEfTXy4Ejy8DDhgHHQSTeVOZ82D5P73ew8M5Zgb0LyLaAiEAyaYlzQ49oeqF22IuWeanP1uHhDLzu9qe3pdB+ROeXkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7326397},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c9e545667a8acb669c6ce8d4363bdbde6dd7bf8e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.161_1775022416145_0.7901828811422988","host":"s3://npm-registry-packages-npm-production"}},"0.1.162":{"name":"ugly-app","version":"0.1.162","_id":"ugly-app@0.1.162","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d20da603e0e38c004243439e460ab78c6a8b5c66","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.162.tgz","fileCount":1377,"integrity":"sha512-jjvng7+kXrtDYzr1AapyyaA9w4GdSRA1gGbSL2ZhkgR7qg3+ortn92MrG7tMaV7wrrswkzmJdzNWnp4emi3UIw==","signatures":[{"sig":"MEYCIQC6mEF8C4igOgxSjs0yWnuK80N+8G86/ZjZ7ca0R/aORAIhALnHt2HYbM3dKn2SvSd8gmTsXAax2fUucuqwen5mIBJr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7327395},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"11cb4c846e200eb5669ffb20e48fa3b42fd85d9f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.162_1775023066447_0.23680319336298483","host":"s3://npm-registry-packages-npm-production"}},"0.1.163":{"name":"ugly-app","version":"0.1.163","_id":"ugly-app@0.1.163","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"10b63b560d107b716a65be039e194fc810f3a6cf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.163.tgz","fileCount":1377,"integrity":"sha512-xDkmMDrme9KimRImpDijPcefaJPzQWtH9hW3Y+RMaaLce2BuxVcArJKniaYS+wMF+TjtDCl+lE1TTjJGKbWoUg==","signatures":[{"sig":"MEQCIEU1ZZQHyt88o5Vb3YddwgimRK+znohu5cuqq1tByc7+AiBKQnqig5XAXqEQxYefzP/6jXxhvNsIOd2U5QOwr+0+Pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7329682},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9e6fc0ac063107b11ba33c239e14f5f687a27caa","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.163_1775023419084_0.9328401406823701","host":"s3://npm-registry-packages-npm-production"}},"0.1.164":{"name":"ugly-app","version":"0.1.164","_id":"ugly-app@0.1.164","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"03e723c26d239f5921f9d03b8a26eda60bcd8633","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.164.tgz","fileCount":1377,"integrity":"sha512-H+rai4UPX23wbP0fqfnutmJbHP32K2T0I7A22FX8CF9uIQIF3nfoSzOscL2jy91UW8CVyC6i1t3jqLOlQrBn6Q==","signatures":[{"sig":"MEUCIQC5J6jyGcSGJGPtQpKPDd/E0oN5uQRq4WHZD75MIIGr/gIgMxV0DT9Fk6dUxCl+SocuNKv6DvApJ2EysimT95rLM2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7331792},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c6a185769aee504f46ea7d8bb6523952d056b1a1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.164_1775023617993_0.14223122532392485","host":"s3://npm-registry-packages-npm-production"}},"0.1.165":{"name":"ugly-app","version":"0.1.165","_id":"ugly-app@0.1.165","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1ed8c4be5a881e7742637ee65aefa0915e8e26b4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.165.tgz","fileCount":1377,"integrity":"sha512-B7zSd6IsIOETvFEOmfKjsseTZn0IKqRtEOuqWl6vqIglq/8lN3vP/GiAOrFAVBgMOEwA69+9zxuLaOh7IfdiMA==","signatures":[{"sig":"MEYCIQCm03o5hajskAUTr3mSXU4L6nxh4ZV3W5eTaumHFyrvPgIhAPFSndba9NjkB0o0pFw2nm3Fqkq437r7qxjV/xsGZhLx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7331786},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"8a24f271d3093e765c2e03ff3e000e9939d53f46","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.165_1775024469484_0.8478584901875501","host":"s3://npm-registry-packages-npm-production"}},"0.1.166":{"name":"ugly-app","version":"0.1.166","_id":"ugly-app@0.1.166","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a012ff5deacbf1ffe623355a09c83dce7fd6a257","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.166.tgz","fileCount":1377,"integrity":"sha512-yBfXVwE2v4sEZrLQqQja95Uzqu/Wpw30G58dt2Mp6sZXqrhX5j8UcUt8wrM2c6F7psyC6SdqmDpr0OT3UwHU/Q==","signatures":[{"sig":"MEQCIHWcsztlfY5PLJv2FHRehXRzKRCotrJE3vWvoi0La19CAiB2Jlml7O9Dswdbb53ft74+cQESRp5tQdZSd1wxpSCibg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7272486},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"583eabbcec008a35c18e508fb8bc26d1dd3f6265","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.166_1775025506011_0.5547836166134184","host":"s3://npm-registry-packages-npm-production"}},"0.1.167":{"name":"ugly-app","version":"0.1.167","_id":"ugly-app@0.1.167","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"04e7d7782c4234897dca19ab085df30348e094ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.167.tgz","fileCount":1377,"integrity":"sha512-zelPJtW8/nGQGNE9LkCrk1KLIS9/JAxV0P4FzRClAH+fZbSpWSNOJnmeTkSCVcM34fKa0FgQhph49fccaXAmvA==","signatures":[{"sig":"MEUCIQDo7Y3Mzh1OXVy0Vkx79Xk7+2LRaa9gvQEcUBXOxDunGgIgeAFun7LdV1vfIOYglm4a1rZy0YFUilcNqm+fNRUIgYo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7298813},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"67aee2715644693694e00a611ea10f4a98722ae5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.167_1775027167961_0.44586395536370205","host":"s3://npm-registry-packages-npm-production"}},"0.1.168":{"name":"ugly-app","version":"0.1.168","_id":"ugly-app@0.1.168","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2189b21924688bc82c609941392976b88b506f6f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.168.tgz","fileCount":1377,"integrity":"sha512-yIICUkvWO/M4793t8OIbNGoWJxcqwsD0XxqRqcAQnTI+mWEOb4gD2g2M/BM50Isb8vQqEk//nfOLkrgsWuE+IA==","signatures":[{"sig":"MEUCIBR7sTGj8EsmT1pqqi/3mXM3YAgl96fNOuG+aCfkIefJAiEAkl++DFA3S7il8xD3Hos2GB8BLxx08FX1TmbpuReW+g8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7298890},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"80abbdfa03897f726715f7f14b26227745f86454","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","mongodb":"^6.18.0","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","mongodb-memory-server":"^10.0.0","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.168_1775027584450_0.08587405919304247","host":"s3://npm-registry-packages-npm-production"}},"0.1.169":{"name":"ugly-app","version":"0.1.169","_id":"ugly-app@0.1.169","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52ae27a11f0237f4a219c61dc1e21095e8610d4e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.169.tgz","fileCount":1376,"integrity":"sha512-AOBWbo1+g+nkw2U5c+SHHbQgYvi8Kw0Y0Ta6et5EPTPFFPzYmGbMTUVw3zWQzUt5xf1X0fL+mxwEyJZmavBlHw==","signatures":[{"sig":"MEQCIGBQT1uc2bqE5jvpL1qr/i1W92jrVP7OvjHOED53AMJVAiBM6lobq9KZakldPD4j+NSKHTO/dqJFjavHhCUf5XCMPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7286105},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d84f301d086ee1521b787537f62a4cfdf2cee911","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.169_1775096708997_0.09123341098920168","host":"s3://npm-registry-packages-npm-production"}},"0.1.170":{"name":"ugly-app","version":"0.1.170","_id":"ugly-app@0.1.170","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0f1ad0aeb5d1cafaa1b1ddbb787a0d19a21467b1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.170.tgz","fileCount":1376,"integrity":"sha512-/MbcTlYxXSwrc2K6rI8cRRLxoU/paVOKiyXxEJAhvf98HAcoVrZLvNll9KOWEpxi6/zCnzaTvbv7hepKwKji1g==","signatures":[{"sig":"MEUCICsLXTuh97qouEcwmxAtON9NfKnytl9Mmm8JMN9ZnJisAiEA6p/CBCQPNboARbweX305jyCujiU+UJOd9Rt1a6F/GQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7287563},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0bcb5a975b6fe3f36562d819bdc5cc7ac9b4cb74","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.170_1775097099711_0.7777160530772951","host":"s3://npm-registry-packages-npm-production"}},"0.1.171":{"name":"ugly-app","version":"0.1.171","_id":"ugly-app@0.1.171","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"77c3a0c418dd7f0ace8592ff35def5ff5767da14","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.171.tgz","fileCount":1376,"integrity":"sha512-hSJyhKLcKmb8GO+rsHW5Hns0yovyVSXJLJ5F9QtUZXN8gU5gljyZMZECbpoDwhyAvQLhVKQ9u2UgAkh1GC30bg==","signatures":[{"sig":"MEUCIQDXzMkDU8Rwi7jIWLiIwykLCQBQDCLLh6a83hYRhB1Z2wIgbObIpPGLfRmhhiN4JRoICnl0oCChc4BEM8SLTOT+lAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7287597},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e3bcbb009349b7fae8c0f788ff5ea70a3477af6f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.171_1775103934146_0.4849577555893394","host":"s3://npm-registry-packages-npm-production"}},"0.1.172":{"name":"ugly-app","version":"0.1.172","_id":"ugly-app@0.1.172","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"665f26417dba68aabf8c3f7267ecc843ea8debf9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.172.tgz","fileCount":1376,"integrity":"sha512-7iVKyj5TY4DTVvBw7IhmAo2J4PYC0DNER8ZaG7foyR782j/TgFTrp/9IT6HvAuOG64D5C4d4Kf94HZz8shfJpw==","signatures":[{"sig":"MEYCIQDV2VzsZyiqHKsZB2WymxqwbT+7XqYHQE5j0Uy0ta1igAIhAPklEkFDQj7FqJcwJirXhC7da1ZU5IOtkzZGTSQlN8bD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7287597},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a74b314178294890b8fd0ed18bda1ad49b4e8e69","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.172_1775105407159_0.108059069845857","host":"s3://npm-registry-packages-npm-production"}},"0.1.173":{"name":"ugly-app","version":"0.1.173","_id":"ugly-app@0.1.173","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"541c6eae56ff8ecb069d89c7993be679f1e08f4a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.173.tgz","fileCount":1381,"integrity":"sha512-wpdtrVp6Soqg96mB6NrnkOejgZo4N5njHBvFFs9lJwHoYG78vddpwUFd3ERMXRd2Lk/egAxXomhGSnvEQoPKEA==","signatures":[{"sig":"MEQCIA0aleitvHGnJfcOhQNnDMNg3gdIHzG5phthat0QoeYvAiBnw4i0t+GpzfuyCZIO1pliFozrQs20d88KOT7xtcF3mQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7300428},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"30cd54d93ff66fff34971e0508775e96e8a51ec9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.173_1775110583994_0.43360951614585264","host":"s3://npm-registry-packages-npm-production"}},"0.1.174":{"name":"ugly-app","version":"0.1.174","_id":"ugly-app@0.1.174","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"132f74b125aa7017a397d2d9bc9053a550d95d76","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.174.tgz","fileCount":1386,"integrity":"sha512-/xdBMTACUXbBwriogsstVvy6L9lrggkiGWtyK/qRmDlNdaiC7x+vQTOZ7zg5CD+DJ6gTd5lO1/ISpKLK+WBmsg==","signatures":[{"sig":"MEUCIQCAyAkmghFk1VtgXZARk8NG4mHlD/GqDEdPoQ2zHigRogIgODWdGe0iwKpOJbTHPxAre5dWAKBMSWk/p8Qzpu4x+4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7326922},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e97d7a216005bd55a69be48422c13cce9375bb7a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.174_1775111720458_0.8512065928543036","host":"s3://npm-registry-packages-npm-production"}},"0.1.175":{"name":"ugly-app","version":"0.1.175","_id":"ugly-app@0.1.175","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"60afc5aae9a6abcb16d950f210a159366c26979d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.175.tgz","fileCount":1386,"integrity":"sha512-kiPjjeYs5Me2MLz1tXlGwsGYhacr1Qi1aD8FaunKGZHvg1y6vHN9RzMQK/nHgDlH3w2dOwmtgC9CejywBcL5Lg==","signatures":[{"sig":"MEYCIQDfUePML9W7rA8nIug6gpCmNt/XqM638FV8BDuy/Px3EgIhAIanCTefPlYINBi+EjaVXN6xzoPPWbCeY1lKMb27VkXi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7326922},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d7921fd242b0b9cdd002cb915ddfba87e87799d8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.175_1775111732883_0.4581117266805774","host":"s3://npm-registry-packages-npm-production"}},"0.1.176":{"name":"ugly-app","version":"0.1.176","_id":"ugly-app@0.1.176","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"989f6c8c358f316c83c3c8a54d443d1707de64b9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.176.tgz","fileCount":1389,"integrity":"sha512-0RMixrF26h+EH+clOZoVPbEsdb+JfrqjtO43DJLhjzI0BZmECOJw9i0Pzlv3LkeKlm6GvEMrySbSGcv+vwqV1Q==","signatures":[{"sig":"MEUCIEh5NNOXNFJ/4A2PwJfpHKqOg1YqAm+Y8tEy3krZjO7hAiEAwOxpeHUCyooBGe20GqGHtxkc9hV4teQBs2HAqKbVq/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7337573},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"bf154727751a0cf132df4ff939d98bfd0a9ebdf9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.176_1775139829303_0.919663712747814","host":"s3://npm-registry-packages-npm-production"}},"0.1.177":{"name":"ugly-app","version":"0.1.177","_id":"ugly-app@0.1.177","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b72f5a2b8e7264bc56f67df2291e94fbd7b4a1be","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.177.tgz","fileCount":1285,"integrity":"sha512-6FXFb1xZZxdZXwgz097bvzn3mioKadsjtWSYl6tNOgAjPfOf/um1ZGO1eF6cw84IQwzCuB8iRSjwajLqk+dirQ==","signatures":[{"sig":"MEQCIALzdAPPwSX7bsthf+8++zvly/i69kpD1NQuSIwQ2hocAiBksCKbtfrjX5BMIwitmkkBqJwcfPfgHyw2W2i5LGkU0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4174785},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1edb3cf74a6d5895ed896ecfcd4eb4e5c6ba9657","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.177_1775141863519_0.3082256505144789","host":"s3://npm-registry-packages-npm-production"}},"0.1.179":{"name":"ugly-app","version":"0.1.179","_id":"ugly-app@0.1.179","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3b7bb523aa313d454939cf9b3676b6b596903539","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.179.tgz","fileCount":1285,"integrity":"sha512-Se0ovEZzZDd2ZTV34w0mTLl0s4JPGRmroMpz4h7W6PMtydiU103EeRA+3H+ebqMOd2oFf8IpiezVg2uMWxzAwg==","signatures":[{"sig":"MEQCIGm2x+lr7/EwALahaU3jQPnJ/fu8rGiu1v8SsNeX7Y2yAiAwllAVNDtLf4njsDXFGXA+VmQBbtdrg9ych1Qm5X4KoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4175177},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7e1d27ab324826a38ed4b0c2b0409cfb16fa442c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.179_1775142924253_0.9445226305498831","host":"s3://npm-registry-packages-npm-production"}},"0.1.181":{"name":"ugly-app","version":"0.1.181","_id":"ugly-app@0.1.181","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4ee257594bce312ebc14a36cd9db5b73a74feedf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.181.tgz","fileCount":1289,"integrity":"sha512-IhVR+3V+Szair1WnlQ1VxsPMdDI1jzHpJ2f7wYDPoroWoUNA3xmL5c2ZlN6N7oxHJxlJJk35/pufcsMZh7GfOw==","signatures":[{"sig":"MEUCIEW4xgrz11vq+HDgrFpkkkngZ0SK0PvDnPc12CfORFa8AiEA8S7o+sOdvwGH2VhrVfU9xRrAf0Lhn/9NSk9DOPYSm3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4196230},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5041551a7f58dc9a1fc96fb66075ba5deb357685","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.181_1775145173441_0.6433393816932877","host":"s3://npm-registry-packages-npm-production"}},"0.1.182":{"name":"ugly-app","version":"0.1.182","_id":"ugly-app@0.1.182","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"933b879dc2fd3fcc24d0017dfbd751645719209b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.182.tgz","fileCount":1289,"integrity":"sha512-vZRt9dGeU8PZbLm2h+rEPxwM9KkgBSnUV3UP+YvB6L9N3OQVlEdCmUSu+Pt8WNEBUWTBs8K6LdRkFedBe9UWYA==","signatures":[{"sig":"MEQCIHU6bYGj+trjQsNVCwigQkRyaeKSInw+e1a5z9pC3CRqAiBIorLhSYkzJ0McdysF9GeZFZdcCMty2qnsaQP3POO9pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4197687},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a19ee03f49fc6ce1643d7e4b4d93a9803c7b1266","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.182_1775146650506_0.18503852202116056","host":"s3://npm-registry-packages-npm-production"}},"0.1.183":{"name":"ugly-app","version":"0.1.183","_id":"ugly-app@0.1.183","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c229e3e105dea2f86a8583b1eb53b75ebc93815e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.183.tgz","fileCount":1289,"integrity":"sha512-J09gWZDL0ks9L7PpQhx4OuyM2df2mbMGyzq42sUH/4innqc3DfgogUeAxeC6stNd8biv2fCkoAsIpyLxIpUukg==","signatures":[{"sig":"MEUCIQDa7Kznc8VWpXzeGAJ1kJIf0k60x4ZLJBLKsaLnZGyTrgIgU8ErQHF0MZzNBDvHwFpKQaCD6HLopMrr2cnx0tzB3JU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4198176},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b899f8d4c5a1492f78c83b9c516a6a8be182bb30","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.183_1775146979605_0.7593402947954639","host":"s3://npm-registry-packages-npm-production"}},"0.1.184":{"name":"ugly-app","version":"0.1.184","_id":"ugly-app@0.1.184","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"66b44e8965053ea5126025a6fffcfda46be69e9d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.184.tgz","fileCount":1289,"integrity":"sha512-WIzA+CiUNMTVt1BoomOSEtZjFFBhAld4+rP/RAAE1hiX0Cku0raS20+sr5VuGVZ1AzhmBNLWGjXSXv2AX6FLtQ==","signatures":[{"sig":"MEQCIHwSLUs+0VEi/Qxz8kUaiYurQBPTnIyjigOPJf0p00CXAiB+vYzpyaf2yWd+/97AKYH9nNtmOa3E+30VEy8gXh+dtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4198178},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5669dda120e931545a3c62dbffd3f7ae5eafeeee","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.184_1775167786351_0.6473535797359389","host":"s3://npm-registry-packages-npm-production"}},"0.1.185":{"name":"ugly-app","version":"0.1.185","_id":"ugly-app@0.1.185","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"62b03313149a293db04be1188d85329d6e46e652","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.185.tgz","fileCount":1289,"integrity":"sha512-Y7Pp7sspDqJ0RSWgd+OEpntf38RqhfkFBNW3gi8c7hLXlMBGWHQvc6Jh0Hrq25eBKGVcb/NHvNZ9VvXNSHjn3A==","signatures":[{"sig":"MEUCIGU/m8zYpaX3SynVqjmQsZL9Tw/nvl48hJaCQLqzr8n9AiEA8qN36PfLU0UbtkmNKo9ix4qHs9NLmduvYbR6Lg8TQfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4198178},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"dabef5a98c3d480fb3d185bee9a0aedafbe79961","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.185_1775167818158_0.6387525636828144","host":"s3://npm-registry-packages-npm-production"}},"0.1.186":{"name":"ugly-app","version":"0.1.186","_id":"ugly-app@0.1.186","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"84b7b157edb3f1c65c78bf1358261d0d38abfc2c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.186.tgz","fileCount":1289,"integrity":"sha512-qalnBxNDsmhJFn6zy1lI8FElttZrAYG+W2FKCDe3KCLJMmcNkdk8mJzshi/XQomTL7WFa/bynYo9cvyRvuqnpg==","signatures":[{"sig":"MEUCIQD7bFFQpWD1iqpDgo+tHRPq8F1T1jrZqW/zCBZOxywmhgIgPV6FBSX9l/GRaMdPGrkWBYx2T+9na7ZtXGkuVN8TRc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4198178},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2026d7d0e5a974b426d7b91ef27089fbd31152cd","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.186_1775168655465_0.12504013055462582","host":"s3://npm-registry-packages-npm-production"}},"0.1.187":{"name":"ugly-app","version":"0.1.187","_id":"ugly-app@0.1.187","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb3c47effd5760130e87d8a697439005e2c625f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.187.tgz","fileCount":1289,"integrity":"sha512-jbvlM9ho5rR4AcOlol0/BivTUI7GkyYe5JlhFAbf4+M00EWw1UL2Qs9HTRseUtR/JTYf17+5L6DviappHMVz1A==","signatures":[{"sig":"MEUCIAzByxF4ozjS7ZStIK/HzFgwc7XCGWreqPDICeBGcr+4AiEA8YiP7G1dUBwPXZjXsYRWUHaOaEOgX8xuuqd8KmHUGD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4198552},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"973e538b20df769aaaf9c84bbdbf9d17917ec887","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.187_1775169050749_0.910911983686602","host":"s3://npm-registry-packages-npm-production"}},"0.1.188":{"name":"ugly-app","version":"0.1.188","_id":"ugly-app@0.1.188","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"33be352e1097ff050974e438f155ea8785ba0d08","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.188.tgz","fileCount":1289,"integrity":"sha512-mGGRiS14ubOWpdQoDx4IEiZFXnl7rfLgoYf5JXuwb8qd6ihtQi9tPnFG+sjM1gSnIRh3cz2J3/87dwfIHuKasw==","signatures":[{"sig":"MEUCIQDTNUKR9Ida/Dew2390cBFJS2oVXOlpy9kXny61pKolDwIgQCwQ3BeMGzn7M1zm+VJLLZi2gki79amLDdYUL03op98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4200682},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"3deca20cb6c13d7fa9d9a4fec9515317708e6308","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.188_1775171924387_0.8353433815924174","host":"s3://npm-registry-packages-npm-production"}},"0.1.189":{"name":"ugly-app","version":"0.1.189","_id":"ugly-app@0.1.189","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9caa7217945d47224bbcdaecee91f77c5bb924b6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.189.tgz","fileCount":1289,"integrity":"sha512-UWEggli//kAGv1dKTNGwBgR/r0jIkZoLh0yszVgH2QbSFBrvI/GmnW74bXThYHBwXmn8hibt1/r/LG+/78KPOA==","signatures":[{"sig":"MEUCID5h1r9HCgvbw5anLYKI22yvjYft0BP6ZEGpwOjDi6XRAiEAvUeU462HRyMcYf60q5C1Sxr6qGApLwl1S2DXMrQOQbg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4206679},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"f386101d8e3bf3e3e38289dbac573c6215b4b71e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.189_1775172548473_0.5624364948101321","host":"s3://npm-registry-packages-npm-production"}},"0.1.190":{"name":"ugly-app","version":"0.1.190","_id":"ugly-app@0.1.190","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"00a1932de27109265a7f471ecd561ad37ba52c5a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.190.tgz","fileCount":1291,"integrity":"sha512-UMn25Wa+w2LGzQGfnegN0hl3n2WNkFS/c01l3LX/nrg8lcnUosVXJZFARaO4NEHT27btRf/FBhRyCGA8JM0uIQ==","signatures":[{"sig":"MEYCIQCN0LRbz+f3MNVG+wAQlD/QkFrP/i7cW/MuKmygDc1TCAIhAJXrOZpeFx4LEnjXHywqYSJxtcq4Rf1LaT8ozq/tmjNE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4218598},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c3f18dc2405f439f95b6d19cf843019cda5f048a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.190_1775176309093_0.4142526741768442","host":"s3://npm-registry-packages-npm-production"}},"0.1.191":{"name":"ugly-app","version":"0.1.191","_id":"ugly-app@0.1.191","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b6e6fc8481d0592315f8f6368d8ce48932f9552","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.191.tgz","fileCount":1296,"integrity":"sha512-goFeNuDa8PC0zwnkRFQxp0u//A2a/euJvvkB88tH64oVElJUPoJG+WVgCV+4oxUzPVkom9l59FXtkEWcGqUDzw==","signatures":[{"sig":"MEYCIQCsCGRL/+I1O5aPvKhBg+24meDaWLq5AzcG6ctJ9J6VMQIhAKI5AGETu75Qa5MzYx+sUOhZfoh7OVAg4VCh8nOZVbG/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4227417},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"07ca0845819ce7acc2e0f421298bae83bbbbcaa1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.191_1775178478571_0.9677794683880478","host":"s3://npm-registry-packages-npm-production"}},"0.1.192":{"name":"ugly-app","version":"0.1.192","_id":"ugly-app@0.1.192","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0bf581a63dd05d3c43ae39561f49d71880e7842f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.192.tgz","fileCount":1296,"integrity":"sha512-2GtQ7OSU1g/laRMUbPLRMD9rnGW+6F4CQpOZlviFZzBG4PNasDPLxuokPuFGnYNGduvp2+bbZpzlN/sw0nHExA==","signatures":[{"sig":"MEYCIQCVUlf7XNspPpNdHq2U7wT9WOTQhgEc88NUgPnwnjXCAgIhAJgcfyZDwCbki0yx1MqkioT1JctA+XkHTKYs7tzdeIBj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4226582},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"0bc265a0f214a8221f79c31096f9e8b4390c5167","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.192_1775179076908_0.838971026942277","host":"s3://npm-registry-packages-npm-production"}},"0.1.193":{"name":"ugly-app","version":"0.1.193","_id":"ugly-app@0.1.193","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a96f815c7eff4372e7a465162a78b1f8195c5312","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.193.tgz","fileCount":1296,"integrity":"sha512-Y30k+P19x7YcMhVDfT4faDYPXHrfMsEnQbKNplH0zmHkiItzthRvZCUWA8GuRRrdVmCS7X4nB3hd1Nn+Bxd0Uw==","signatures":[{"sig":"MEUCIAwFZ4uTY08XEV/2DLm/ZDMwb4r2eqk88qKmlyUKTEbWAiEA1K2eHqXzZ9/34+AklAZ6Fc3+d3Se+k8elOY0KHoOljo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228902},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"68d76883d163f91eb8451dca60e6c4c6ea0463cc","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.193_1775179425835_0.18028222380559966","host":"s3://npm-registry-packages-npm-production"}},"0.1.194":{"name":"ugly-app","version":"0.1.194","_id":"ugly-app@0.1.194","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"752aedc5958f1189ea6eb69b615e43eef276602e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.194.tgz","fileCount":1296,"integrity":"sha512-b43dPCeGgbydhCsP5OQz7NAX8FiFE392lZBCH34e/8vp7Eo/s9QFE68ts6cREwHx0OkapS5Bn1PE8vQXWgEp8g==","signatures":[{"sig":"MEUCIQClIOd1h3NFj7RFGCayUPvDIpo2z5YQHShzwFW58IC9SAIgXWVEoZCJ+bDpRAgHNSPZjr4QDoT8x3G/i7alrz+Q/Gw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228902},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ee586237cbf43bcecb9bff9e50a27e9c17570236","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.194_1775179466554_0.18238395864724932","host":"s3://npm-registry-packages-npm-production"}},"0.1.195":{"name":"ugly-app","version":"0.1.195","_id":"ugly-app@0.1.195","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7dd940f8f772e88cb14b22e083eedf1d06ae56fc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.195.tgz","fileCount":1296,"integrity":"sha512-QoVTKlIGNU8r6vlHmEeMbGiiCMzHYGZP1A211SXKtu7+kmsZ4rOFS6T6ZBGMBeYvr1n3DqM4Kq/klrUS/3fm5Q==","signatures":[{"sig":"MEYCIQCg3YbH3mP9HqU+rE96pGTcEXPvDM+BeYRpagE2QsbgiwIhAJZZnsRs54Q6CUeF3rR6ucDoKFIc8xJAQwxskwy1Oyqc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4227475},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"de12d6fbe23e0b389a428ed03b69bc887de6fe72","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.195_1775182531928_0.13130059898169888","host":"s3://npm-registry-packages-npm-production"}},"0.1.196":{"name":"ugly-app","version":"0.1.196","_id":"ugly-app@0.1.196","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4efd49c8f50d02bce9c4a9334b5d80d2db834367","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.196.tgz","fileCount":1296,"integrity":"sha512-bXytGcey+ZsbQrw5/bEOPK7awgtz/Bcu9Y8ax2jp72bQPylICy87soEPRLli8EE0aqHGBbSKff7jnGvTi1SfhQ==","signatures":[{"sig":"MEUCIA6XRC1s2nteW2j2FIYzTGwrkd7SVQRPReJsiZFU7Z7LAiEA4WRmQSKNiPgKmyjZAnUO2zxVCK1q/Lbzm3i8nj6MhwI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228544},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5e827a39b977403eadf4af8b1d328a38f6437982","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.196_1775184967469_0.26457744973494","host":"s3://npm-registry-packages-npm-production"}},"0.1.197":{"name":"ugly-app","version":"0.1.197","_id":"ugly-app@0.1.197","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"baf3e7b4254d87d4d4bde85db52673b748106a2e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.197.tgz","fileCount":1296,"integrity":"sha512-4R8pSWBsQEqgpq2gFZLK+Ho67rB5lzobygD3QNvozlgQeE73A/uMNzmqcrCZ8d2QPZXGfVYqxZB5ydzFwamMAg==","signatures":[{"sig":"MEQCIDEMdu9pWx5WiRXwj02d4YMwS1Wh9lOwGtaitPLlVOL6AiBTX68Tl6I8X9Lq8mEe/rjLo8p2uS3Y1vV3/jVfnuOuJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228544},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6d84e447c869442faa9d53e5f658085854b81f3a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.197_1775185805160_0.015042190007259482","host":"s3://npm-registry-packages-npm-production"}},"0.1.198":{"name":"ugly-app","version":"0.1.198","_id":"ugly-app@0.1.198","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0214651b0e42752fdb7f8c1f96c06126dcdde431","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.198.tgz","fileCount":1296,"integrity":"sha512-7wRYlhj8w7BKobvIr9s2IoPXXvTBzF+qgzAjI6Gi3ly2EUv9TSjUHSgBR5cgSiQjdTA/jUSiWCdYU88SXjwKHA==","signatures":[{"sig":"MEUCIAvu0UnIPgD5b0P6mO4GRobxxqA/hQs6ywLAtgalYSG7AiEAuQWoQqdhfKx9F0gq81S0QHZ2i2cGrWFy9e0xppW716U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228544},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"44b5fa7d3ad66fbcafba122003819b9712f2e92e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.198_1775186570503_0.031107029089648908","host":"s3://npm-registry-packages-npm-production"}},"0.1.199":{"name":"ugly-app","version":"0.1.199","_id":"ugly-app@0.1.199","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"874ff7df392d5ead3855656f0a98f796cff37c24","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.199.tgz","fileCount":1296,"integrity":"sha512-uGdTlb1MOYTjKoC4aAtkju93CG4t+DpFcgplSV+SOjSBrHjECjzwzvX6YAE+ez6miytjOVwPUN1DnbLKkIDt1A==","signatures":[{"sig":"MEUCIQCLhTiWlrV9GKHBO8kixCPFb1PhTy6sjNEnxZfhneVHpQIgDZEfI9uD86yUNcE87Zp3lAERXuNa2nXozkietNxqv9Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4228582},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"4e148f1fefb29c359b7ca7753ff470fb4a1d5cec","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.199_1775186807400_0.7091509531471036","host":"s3://npm-registry-packages-npm-production"}},"0.1.200":{"name":"ugly-app","version":"0.1.200","_id":"ugly-app@0.1.200","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6e5e5ccb32811d6acf8009a96e9a0f12ceeebe34","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.200.tgz","fileCount":1296,"integrity":"sha512-f99kdniHt+Pg+hvdV+qaOEDM5gRRtkawR9O//mKSIYqnOuyuil7gW5D29wOFLk7YAOtCmIXgR6ZTeh9Ps7Lucw==","signatures":[{"sig":"MEUCIFToBum/VpD2w5bQZUBGrsaeq0gHCUxxVHgl8D6fK+5OAiEA5/upkfLb0yMlNZ6DdzG9BLu14LB/QG74FcKl8p20+VA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4233298},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"fa8a3c98b419047fc13a83b0257c4917cf7f97b8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.200_1775187398363_0.01836886737121124","host":"s3://npm-registry-packages-npm-production"}},"0.1.201":{"name":"ugly-app","version":"0.1.201","_id":"ugly-app@0.1.201","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"08c44063611e25abc9e90a6c06a5ce0ba7d913fa","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.201.tgz","fileCount":1297,"integrity":"sha512-SqUZ1rYhS8tTlJwL8H9gSNeHM9Pc08t4m1bgdEgFmRemkuoo9Od7abk58bRM+fkakxqQTPomkted7aA3SdWcHg==","signatures":[{"sig":"MEYCIQDGev4J+OxefTB9b4d/1908alelF7sWgwkg/S+atLxxoAIhAIBiMC341+pbuIB7SjNMzJ0p7FFOL4IRUr7RItQ3YYYN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4243784},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1f648d8caa4d92c24ad24c82ce9b5d6ce3407ce1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.201_1775191426411_0.16940057332293934","host":"s3://npm-registry-packages-npm-production"}},"0.1.202":{"name":"ugly-app","version":"0.1.202","_id":"ugly-app@0.1.202","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"57196f4bb5e9bd5008f7e6c77e1c8a3541fc8ea1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.202.tgz","fileCount":1297,"integrity":"sha512-ASGgH36sDHRCOTCAm71Lqd+oC3vMRaM6+jr/WZAJvX0bWcJ2iMBKVs0SWLl8fUlqLrD44o8eYTTqTYNq16+M6w==","signatures":[{"sig":"MEUCIQC/8khflVB/lrPVz8YMQlf2AiH+9qzZZ2VrqQ1uhSbDEAIgEAY0kuXHiNo9a3vpfASk5mWRBQGH1pJjKNukNQkIn7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4244184},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./client":"./dist/client/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a85b13e8c8474250a4226a77a134c6e45079cc8f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.202_1775192760393_0.017869953928602023","host":"s3://npm-registry-packages-npm-production"}},"0.1.203":{"name":"ugly-app","version":"0.1.203","_id":"ugly-app@0.1.203","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a083d537ad3ed6fe7c4b5bd9f31bb4ccafb09da9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.203.tgz","fileCount":1317,"integrity":"sha512-3TVuat5T5F+coC7K5CU6Acfu93wkBUf19/reF6UUa7zYhZmhADDMcosgU6McNh72MtNfRigMHORPUccRPfc62A==","signatures":[{"sig":"MEQCICbFuIS6AkQruiuDuaGWoVDOnybJzcEfpEx74mnwhyxJAiAfqiYLGT2/yx082T202APwvpdp6Q+L1eC+8QCUMxMM2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4294870},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a710c7510761b6b20493ddd72fa5861b2f08a5a0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.203_1775232811759_0.19609990167113","host":"s3://npm-registry-packages-npm-production"}},"0.1.204":{"name":"ugly-app","version":"0.1.204","_id":"ugly-app@0.1.204","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c48912589f10484e37af48c5125c1f4245b16d52","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.204.tgz","fileCount":1322,"integrity":"sha512-owkZnCxxqjMKf/19/hZae/raMr+Lx/bAcN4fXt8AmG8UOAAkwby0M7D8Ym1jSjtcL2L5Kumr7iByKtkyASf8qA==","signatures":[{"sig":"MEYCIQDbdIYsWdIShlOb89LHS290EmvXFZLgHhYrCN9x0ExSxgIhALuO6BM2WtssHPYCKTh2TgeA8NUgIak6OIYgRoeRbfyg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4318150},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"10a0ca211dca0aed2c291c38c9e04f4c4f2cf54a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.204_1775252118009_0.614435898665969","host":"s3://npm-registry-packages-npm-production"}},"0.1.205":{"name":"ugly-app","version":"0.1.205","_id":"ugly-app@0.1.205","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4f9be9464de32cb259c3007036e52c46397af1d1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.205.tgz","fileCount":1322,"integrity":"sha512-V18WEyLcEwO5OQ9bReT+rLS8jsFffSDBMx3B2ED4dFvO6Qdd7H3+fbgXDg+7c2feSdoRZ5rcaAWcJ0Cm9QUMKg==","signatures":[{"sig":"MEYCIQD7QwwpNoI/zO41HctYo2imHmSEWYCsSrKCifmi2lXRpAIhAK0C/0Kf0HIAw0/MEwoflBpCFhxtB20xPvLEvMhT7h86","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4318953},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"30c9dce328a309d7fe073df137133cf2192379cc","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.205_1775258235336_0.7259041672096327","host":"s3://npm-registry-packages-npm-production"}},"0.1.206":{"name":"ugly-app","version":"0.1.206","_id":"ugly-app@0.1.206","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"01d735caf22c6c55d2583a44850450495cdcedbe","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.206.tgz","fileCount":1322,"integrity":"sha512-j9JkrxqjZcVoUqgMBHZm54RCao1j20DGaJvgJ4zwSMz3ch6oHh2FL6VibI7K783S7Xg5tI78/Z3MyoBEk6zJ7A==","signatures":[{"sig":"MEUCIFiQAW6c+QJ9cL+GekRr91DY3a7kGkWtBTCpnlLXAGh2AiEA2ZHviWk7aaU1GTEq5yeTP+rB/3sjWGfYFkOJKXxVG2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4320066},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"ef8af2441bcaa334640b510c7ac7c454bb1cf641","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.206_1775283544403_0.7122362543573058","host":"s3://npm-registry-packages-npm-production"}},"0.1.207":{"name":"ugly-app","version":"0.1.207","_id":"ugly-app@0.1.207","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"37404435e556b5918c7d4bcd1247081c5c4043fd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.207.tgz","fileCount":1322,"integrity":"sha512-2EulvCDliXedZ6GOlZQpbFgKqljzMbtG6HoQdzDUx0wvQfrEkVL/34jkGHPB+pOxYLezlhw/WWfOW6CKS6Hqnw==","signatures":[{"sig":"MEQCIEkAPkp4rvUkRT1n/yEF+Ct1qvQn4dsf4397Z0QqHA/cAiAGqHDyTyZiypWCvOjl7IZ7s8K43lOixHyidhQZgmT4Ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4320066},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"2df7a3b62ec526818cdfdd0fb84c296e5ddaff19","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.207_1775283587204_0.4759028870878965","host":"s3://npm-registry-packages-npm-production"}},"0.1.208":{"name":"ugly-app","version":"0.1.208","_id":"ugly-app@0.1.208","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2269eaa2928c3565763f64ce757c9a01d2c26112","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.208.tgz","fileCount":1347,"integrity":"sha512-9ZHKAUWeLb0642vS8bCMYyFPRsGEfQ76M9TJOgSHEy4kClGx47mLz4A17YyXFLORuIQ2FfjJg4YuHwl4fcYtfA==","signatures":[{"sig":"MEYCIQCbBX0uuRkPudlIzadPmsEWGjZVCe5mFKh8eNX0GQ4/KgIhALjvXVg6H+1fP82OM4fj0JMatb5iajWaESaeUm92qBwa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4420240},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"1ad36faf991e94d9a4fd8b403c0fb73949f44454","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.208_1775314080099_0.19415827896107873","host":"s3://npm-registry-packages-npm-production"}},"0.1.209":{"name":"ugly-app","version":"0.1.209","_id":"ugly-app@0.1.209","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"17b6c354b088ebd75a4b349160352310d43e805f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.209.tgz","fileCount":1347,"integrity":"sha512-CZ+J4orZDv+QSrvKICGCA8uT+lHFN4mp+hYe9wV3EjYyl2A7ObJUsKAoZi6tmH2/GtympURoU79Z/hPk27YcDA==","signatures":[{"sig":"MEUCIH4+zT69RX/LWWdpFA4EWgxmfOH+1x/RffehwPznD4/IAiEAk+MMaLO7tpkK2H7Z4dBYw/r3pkwGZoI47a/wJMoVRCI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4420240},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"780b158c0f28b58be465a96c1ac1c7792f857088","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.209_1775314168332_0.9825523791643194","host":"s3://npm-registry-packages-npm-production"}},"0.1.210":{"name":"ugly-app","version":"0.1.210","_id":"ugly-app@0.1.210","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7c422a0f79a9c50b9029d0011e26b27bbbf2bcc8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.210.tgz","fileCount":1347,"integrity":"sha512-e0XzeE5G3LSStm1tFe0NYdLd+StbbOPxPbeukyxM/8NRFnMFDvzV1vrJSh5sdDG3ULmtlZVW7a+1NiIeB2Gfsg==","signatures":[{"sig":"MEQCIH13UP23/3iz7+Lm+lL4/gMfJ9up/CvwFISEuza6W57KAiAZIkgDxYfFtnbDmInA3+tEt6BUV7HOBDfqSp11uOnscA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4426772},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"89d5ba1de2733032502e84089c1c8d978348a660","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.210_1775318931848_0.2399467170718974","host":"s3://npm-registry-packages-npm-production"}},"0.1.211":{"name":"ugly-app","version":"0.1.211","_id":"ugly-app@0.1.211","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e1aefa5bf1fadf07234a28f01f9a9c3b20d65be3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.211.tgz","fileCount":1347,"integrity":"sha512-sRgyh/rQ4HTfF/gjdClPSyJSpfrMNFQcu56Rn9TS2kEbO7lqp4iGf2SzohGFNrFsqIU4x8MomoZ0ERyWCY01Jw==","signatures":[{"sig":"MEYCIQDTIuu7lHWiV6ro91VLmwTYeAhAkH2yLhhl8Pvl2D+YWQIhAORQk1u/5/TwfbwE11ggzGiKk36C+/lm77HZdtsf3OKh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4427181},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"432b96327838682446daad0f97a653faabb1a056","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.211_1775319041118_0.25460559357311796","host":"s3://npm-registry-packages-npm-production"}},"0.1.212":{"name":"ugly-app","version":"0.1.212","_id":"ugly-app@0.1.212","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f0a7266cd6238d5a5a139e990448c754497bd307","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.212.tgz","fileCount":1347,"integrity":"sha512-gl58gHvGDcp+9rQBDfobd5vAHWQj3z5dmswkXdQplFNjFEULfgTLEEUWGtz5scfQbFnkqS2l57Tgev7ulkMf/A==","signatures":[{"sig":"MEQCIBiV9qSEaW/cAtcD6CwZe7gJhTB7lk9V3UbH8Pt/8eWjAiAYIlrtZtOIFcTHHakoiZ/R/5I25XUXuCHUKtJQYMbPnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4428070},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e9031d81e423fdbc3e2aaf35b48df23059aef371","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.212_1775322067674_0.7596687917022948","host":"s3://npm-registry-packages-npm-production"}},"0.1.213":{"name":"ugly-app","version":"0.1.213","_id":"ugly-app@0.1.213","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"05ade55a7334ce2c67ba139bcb5beea261d2dff9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.213.tgz","fileCount":1347,"integrity":"sha512-en8tzN0kMbwF9b5yWMhdB0esLS2bCPhdMqDq9MXAALBOcFQKys1xIqISWm2nqvgTfv4+MWEb35+2o5gglgZP2g==","signatures":[{"sig":"MEUCIQCz1uqCb2xUj/RFo2aiZe4SWP3AE/Yv0iSTXonwlTc0fQIgeK6E1NB6ZbNb5jnM9pJH3hdmGp3TOw8NWCCyjOmgatc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4432180},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"da7104e0ffdf58e93c598e169a149c59391f18b5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.213_1775334433480_0.4034080516662346","host":"s3://npm-registry-packages-npm-production"}},"0.1.214":{"name":"ugly-app","version":"0.1.214","_id":"ugly-app@0.1.214","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"413620ea1a9cdfd7ac411b37869bb92e2fb9f1bd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.214.tgz","fileCount":1347,"integrity":"sha512-eswRIQqjlXqA7zGy8V8t7LCjDpIfB0dkZ2UpChJsIlzV5qhA3kzD+Kd8odNBSUxsT2nsjY6PgOemN7W4Mg7Rsw==","signatures":[{"sig":"MEUCIQCTRVNGDFgDxjpx9V/6A237s0xNLXTWIXJg1fya8GT8NAIgJpiZnOE0UGrKR1U0fQ0kPkShKEibci0V2y2nffAhVDA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4433436},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"3a6c43c78cba0535378db7e53f44006f199bff46","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.214_1775334829844_0.429465012052314","host":"s3://npm-registry-packages-npm-production"}},"0.1.215":{"name":"ugly-app","version":"0.1.215","_id":"ugly-app@0.1.215","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"51468ec2a5439537304117ed5789ddd6d14eb7f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.215.tgz","fileCount":1347,"integrity":"sha512-Ty0BvdesehfqgePN4qyckDMKwyYObzdKmfWkTerWADkKxg03Ms4qJc2dD4A5XNMmt6SBEjnjth7GT34XRZRvQg==","signatures":[{"sig":"MEUCIF6zzn8jvxUU0FyrZWXFWUGQti5bLymJURnPGYkhkpYIAiEA1v94VdTgehpH0gutVjhDI1xrOtv1exfOV4wAWeicJOk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4433436},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9da5483f279c3522c4a9a149f0be47d411bf8116","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.215_1775339106479_0.17940901616119587","host":"s3://npm-registry-packages-npm-production"}},"0.1.216":{"name":"ugly-app","version":"0.1.216","_id":"ugly-app@0.1.216","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cb6b2b1fdc746386f3d0dc075d3c13d459f7011c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.216.tgz","fileCount":1347,"integrity":"sha512-WSNiFxqlnTxZVYk/qfUtkPhvumuDE/oMn2+LF6vcPMoz0dG4O/Hs4tmmIcHbqG4cv6VlbVrTXZPNhNcspBUuxQ==","signatures":[{"sig":"MEUCIAOq5JzeWEzU2LaBSsLzLpb7G2qC9ijMQodzgbPvEmu/AiEA2y57WUGbHIxwVCmdtABBIZ6x5WKr0vZu4bPapeohrkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4433435},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"378a2bbbc09fa8c5042bdab573016ab3af7ad5df","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.216_1775339538469_0.617034634885206","host":"s3://npm-registry-packages-npm-production"}},"0.1.217":{"name":"ugly-app","version":"0.1.217","_id":"ugly-app@0.1.217","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52d069afab584aa32baf960ae98046317ca7d7ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.217.tgz","fileCount":1347,"integrity":"sha512-aM+1ludYMoYzXPNMdZVZIaZ0sg8Xc1R2HtAyhRoP9IQNDPtzIh4qTwYhg9ly0BVaQq6OUWXwNnqz9dIGBZKi4g==","signatures":[{"sig":"MEQCIBYwIUz7Sr72OUidb404HzfBDHwSfEMhLQWTX79DTl11AiArBFCJCRrhSef3fMs0Mru3/kZK9BEYiMqix6jPj6ZaZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4434635},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"82c553aa1b34e8c4b556a125e2be99ef00f5d7e4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.217_1775340046244_0.8079620924035742","host":"s3://npm-registry-packages-npm-production"}},"0.1.218":{"name":"ugly-app","version":"0.1.218","_id":"ugly-app@0.1.218","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7c47aa479d5cba8d04db4f6011710d5cdaf65810","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.218.tgz","fileCount":1347,"integrity":"sha512-hCgbMFsvGXTKrtnPyrDmhGNetUW/J4XvjOSRfu4AksZMR0Iklx5of44UGUCmyqiZoUuJnO1hoKPI870pCAFaVQ==","signatures":[{"sig":"MEQCICptYRN7EExjKxYsAZGlwxWkg3iTzE6kPemMCVCoo8sAAiAljWuAksnWHIjt6ZWcWvlXTIZchp4CkhiNBAo8aAzcAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4438991},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"9b9cdab9f93a70bae010afe433d79eaca56eebc9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.218_1775342581514_0.6070802091110012","host":"s3://npm-registry-packages-npm-production"}},"0.1.219":{"name":"ugly-app","version":"0.1.219","_id":"ugly-app@0.1.219","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d56742d23d2e5a466e18fd717115954522910a3d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.219.tgz","fileCount":1347,"integrity":"sha512-VUBLjB77kxdG80IupzkQKbFFFRb9hKRYkic6TK99FXHN+/fnSRUxZSvrKt/WP1gtSI3EpZvXYHgoueeFevl26A==","signatures":[{"sig":"MEUCIQDoVl59PruY4Rf1j+G/XFGHmGktHJNibyd31od+IZfbIQIgXaDqYQmiQnfNL2PAO/XQXE7ybjwcRgYoY+FD0u8vwcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4442243},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"481e2699d6c7e5cb6a75a2924da1458fd8792ab1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.219_1775343493641_0.6026679711862928","host":"s3://npm-registry-packages-npm-production"}},"0.1.220":{"name":"ugly-app","version":"0.1.220","_id":"ugly-app@0.1.220","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e6f0ad405086c7c450ce4eeb0e367a06b95575bc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.220.tgz","fileCount":1350,"integrity":"sha512-BMVVKmlb2kJUD6OcpzpKPiZN+MhiZC6l+FOCy/GXg1c2ZgsMiemhLaCgKbEqjSdKXcUwc+MBXNOF7RWM+JdhzQ==","signatures":[{"sig":"MEQCIBPfYO0AGIxlVml7ofrlohd2Pr2U4LjpZYUZVFAxM/SnAiBsiqbkYT0DgAkr/fxErq1zsprdDZ1kC0dzLGYIJyBF/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4444849},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"00063fefe55327062dd8b5c245fb595a6e9e30c3","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.220_1775346264038_0.8254236362242304","host":"s3://npm-registry-packages-npm-production"}},"0.1.221":{"name":"ugly-app","version":"0.1.221","_id":"ugly-app@0.1.221","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9043fb97391288eaaf0556d55c8b39e06dc837db","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.221.tgz","fileCount":1350,"integrity":"sha512-w31CiJkE1AmNWk/uHRKJ5Wixn6EPPWAtArPtTkuvth/dNbOtprJtI/IawtZ8PA/rl4YRawKacxAn64ytb99PSw==","signatures":[{"sig":"MEYCIQC2JiQGUZWf4Dpp9nshdGcsFjx4jMbkKwCdFLOECuyPawIhALKiO5LkHqOvRi8pxjV+rDn7xx50pDDboIicibw1pVLp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4447203},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"88eaf2467accf024dc01cf238088b74ed79d9359","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.221_1775346814973_0.31366332652901585","host":"s3://npm-registry-packages-npm-production"}},"0.1.222":{"name":"ugly-app","version":"0.1.222","_id":"ugly-app@0.1.222","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b99da892312c2dadeca4dcc1787cd2e9f8cd06f0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.222.tgz","fileCount":1377,"integrity":"sha512-xFKLASo5cOWPr3J2E95LsmyqMkwjId42EJFuF7AumA4dKrkbUq9+mT4jc5ObX5WJdTgaG6hzFxuz05i8H4QXjA==","signatures":[{"sig":"MEYCIQC14O68wnzEotZ87FZRbXYpENTxhPN1GdgYgYsam0F0GAIhAM9w33ffQRGNrpX+sP+gFxR8L9rIPR81VuFpbRd5wAEy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4533492},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6ddc9c0e0a6aaed4c46456b09bcae9871930a5ea","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.222_1775358339368_0.6487012956420766","host":"s3://npm-registry-packages-npm-production"}},"0.1.223":{"name":"ugly-app","version":"0.1.223","_id":"ugly-app@0.1.223","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a6663a5463de500ed5fdba9f58792e16b893e2ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.223.tgz","fileCount":1377,"integrity":"sha512-O6x+L+wf+JkHWlx4rqyDZczEuMef3boMMVyOdNj6HMyrCwBSnaMvtuYPcPyK/0xPzbtfhhljToGbShGtuHEeCw==","signatures":[{"sig":"MEUCIQCcOmihlCjhrMEwIcvemrAc3vhSBakIVzsCO9Vigk/euAIgExrZ6NAec9E5fw8yV9tj+vcwjMu32fNvY67ZF8RsYcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4533763},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"d351c37b987953d40b68d2d487718bda3f8e6de7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.223_1775360046024_0.015740675443356222","host":"s3://npm-registry-packages-npm-production"}},"0.1.224":{"name":"ugly-app","version":"0.1.224","_id":"ugly-app@0.1.224","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"832977268f6df2b79b170501254ae92e7180687a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.224.tgz","fileCount":1377,"integrity":"sha512-vW4RLUUZmvFC3Ob/lDZ6hWnQTk2KuDRpWKGP/N0d7uyoSy025dCp/pKqnh6VJWhLJUV4Esh0zyS4HG43T+Vw9A==","signatures":[{"sig":"MEUCIQC5l34mg1p+Wa85rDnaVBYF5Kgf/LrGXcILHoC9o/A1VgIgQ/SAC8D6jw41J0HRguwdABf3RXeODm9EsJD+9EGZLbQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4534861},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"a595c5de702b4fd7f5f5c2fb4f5cc9ad364b3ee7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.224_1775360631851_0.35253011299819326","host":"s3://npm-registry-packages-npm-production"}},"0.1.225":{"name":"ugly-app","version":"0.1.225","_id":"ugly-app@0.1.225","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ca8843d3c230c407d9290d32831380f8defcb909","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.225.tgz","fileCount":1377,"integrity":"sha512-0rQGv3xbOoUnKKs/450ZP+1LGkGsehKOnBcAg9mtXpsJcDwTJSWGu7p0ZUWkm2qnGkw8xUasqBe4jC0qMGZQkg==","signatures":[{"sig":"MEUCIQD0ZkrAEZFO9C5VEZfw58Ln1s/uuB6v9N2KDqJMNTCSmwIgBNzXpwpyHGgsbeX/Mmk++e6XJpetTegKIXy2z7SkuCI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4534895},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"5f1d3350190add41f986ad6e3eef79f43e0765b7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.225_1775360772196_0.45419107506143064","host":"s3://npm-registry-packages-npm-production"}},"0.1.226":{"name":"ugly-app","version":"0.1.226","_id":"ugly-app@0.1.226","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d73a6d0040691de29413bc9fd2b5c9ed112d83f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.226.tgz","fileCount":1377,"integrity":"sha512-ymAKsyVM7LeHDDro0y2q+JZOI4Y91j/qTqZJgKkcItBYu4MNvwvp/IESvbLvYjmo/b7LgTea0TnfDsuMfBSeAQ==","signatures":[{"sig":"MEQCID6e2CpELycRdQia7ra5wBOUlfYyVSe9eYnZiY9dxMAdAiA/1+aFGZLcD3gPsd595UXmchzQaWxd1hSIQvEMY+WnlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4537761},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"343393f8369e4d8149556f3bc2409a5427187d3f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.226_1775360934564_0.8604236787836159","host":"s3://npm-registry-packages-npm-production"}},"0.1.227":{"name":"ugly-app","version":"0.1.227","_id":"ugly-app@0.1.227","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3e08ab103199858f7f747be3b222e82dcba8d8d8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.227.tgz","fileCount":1377,"integrity":"sha512-ZtYiH/qhstnOvtdlj+72V41hUl+NIj60HcJHcIScPkVu2lnrzlTVcEpcZUml+y5dOFHtDMnKLgeQuHPMzpVdbA==","signatures":[{"sig":"MEUCIG06v6nO6N1fzYT9+GuUbteb1NpsLQgueAo8+p0HEUDRAiEAgHOzzVG5hyh3dpIhUGqzaaXcYG0/C554qBGtvzlHbCg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4537761},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"6cae5fe6ece705326d254120bdce068b4798c15d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.227_1775360967703_0.45170882149153635","host":"s3://npm-registry-packages-npm-production"}},"0.1.228":{"name":"ugly-app","version":"0.1.228","_id":"ugly-app@0.1.228","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"255c5593e7a8754d87ac2f4f9d09fafe1937a454","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.228.tgz","fileCount":1377,"integrity":"sha512-JPmZgt8UVkE8lgg3jb+KrQLlOndpqpXOoSUB9xys3ux5gEj8fjlQLPnMIBK9nqNUSzNg+wOEg/EhIZUv4BS44A==","signatures":[{"sig":"MEUCIBU4SpDXPrFg4EdsMRrd2X2vH+tuHsqF1ap+surkwJPoAiEA827olORkxbvgTrDADnht+BH1q4o62p73EUgdYdDr9vQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4542717},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"c404eded3b0f9509eb46f35f0e5d86515b68bcca","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.228_1775361307191_0.756979962131354","host":"s3://npm-registry-packages-npm-production"}},"0.1.229":{"name":"ugly-app","version":"0.1.229","_id":"ugly-app@0.1.229","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"045f5b79b61a02d5ec02c1b8baf44f48168781bc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.229.tgz","fileCount":1377,"integrity":"sha512-xj+BA7yECfDTAlYz0gPnZHY1FuTUiFRMkNrNWgIfL5bmtcarNco2huO0mkcKRsA3F3/aHPRzThuWz/p4dfOn4Q==","signatures":[{"sig":"MEUCIQC12BEHd1mfRAfRTa7lIzWz6Qpt29lc4oi/tKVvf7WfCwIgR+kXAxS5Y8w6P+qx7kS9hBOh1fGSGRTVlkHZbRZtlow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4545762},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"041ab3b0afb9a450313c46df996bdcfc7ea59b68","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.229_1775362467698_0.04412112048460903","host":"s3://npm-registry-packages-npm-production"}},"0.1.230":{"name":"ugly-app","version":"0.1.230","_id":"ugly-app@0.1.230","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f16a27d10fe7e128bb93b23a06341c2c73a75223","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.230.tgz","fileCount":1377,"integrity":"sha512-lz257qXckfPKoo7eeKxrqVAJKj/AG6Q7hQeDHYdPMprZkIS5pLxXa6L/E3F0bQAzJkeqBm2xthr5lJHhwFcgHA==","signatures":[{"sig":"MEUCIQDAtldPDeJlnyHIdo8EzgPKCk4KEYCtGDUWt5RcSMWv0gIgRTxb23iHLeRaNEEYe4aRnq9DcVl9qr9xky6xOVLAgBg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4545796},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"e858c9b0bc1805efe71d85effba85ec9c4a2f315","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.230_1775367104251_0.7856655175822511","host":"s3://npm-registry-packages-npm-production"}},"0.1.231":{"name":"ugly-app","version":"0.1.231","_id":"ugly-app@0.1.231","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"803e66ad385499d7d900ff3f8d92b3381d69ccb3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.231.tgz","fileCount":1377,"integrity":"sha512-823WCmE57jOyI4jgpdkOnHvHELIZJUcohQN0NJvbrxpn9CN9qyDUiIcfhZN6oNRXdD/lsXthn6kzU8hUjJIF8Q==","signatures":[{"sig":"MEUCIG6BcNy4WcMTuddP1cWUf97L4jGggft3NGY00pl4LKR5AiEAufr8hwO0/B5069BYdtu/unT5KQVSkLqVxLRNBW5xTdA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4545796},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"b7b76a0c4ab92aae12b65c99bf2d1d3346454cdc","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.231_1775367219123_0.24192666845518662","host":"s3://npm-registry-packages-npm-production"}},"0.1.232":{"name":"ugly-app","version":"0.1.232","_id":"ugly-app@0.1.232","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6e6e300c9a42b96b66eeb3e9e4a46d950fe69b03","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.232.tgz","fileCount":1377,"integrity":"sha512-/uBIMEQcA7Pf8JsxYEsALwqudnepvOc7olh/oDftZN8QOoYGl2SPkQbazWowfjuAOWa6wmYTiO8Pon1pE+92Ew==","signatures":[{"sig":"MEUCIGUjNFGANS9IoskMXcRfSSJH32cisL+cV7dWuStdQhC3AiEAiIn+HMEWrr5ZYsP6VxApc0FdGBi9IIEaGEDxbIilnmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4546527},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"7f4d26af1d6c9c645af92402fadd8b6ecc297fdb","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.232_1775367693358_0.9101661788198636","host":"s3://npm-registry-packages-npm-production"}},"0.1.233":{"name":"ugly-app","version":"0.1.233","_id":"ugly-app@0.1.233","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1a05e1de1abb1fa32e9d39814a674ea2c32c1d48","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.233.tgz","fileCount":1377,"integrity":"sha512-kBt5IjK+FH+yz1pO1sNRFCaNGGnAkG7I6GudljMkp9+3weIXtnKHrZlC+0su+Ul7mn9EqUN9bAI0rPSPqC7BZw==","signatures":[{"sig":"MEUCIQC1g9Fjik6oh13FH6rw6X2I3gL46tsjL/CLjOryC69ASgIgIlY+cgYU/ZXuZ92ucDXl+YNrBft2ozmH5HfhY1A1VoM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4547726},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js"},"gitHead":"244e501ed08a8addb27bcaa22db9a5bbe0af26c2","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.233_1775369414532_0.28794675757349353","host":"s3://npm-registry-packages-npm-production"}},"0.1.234":{"name":"ugly-app","version":"0.1.234","_id":"ugly-app@0.1.234","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9ee80879eb20f7519717ea9334e6108e45cd8a29","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.234.tgz","fileCount":1412,"integrity":"sha512-o+SKJfpdQ9cHETDBmDP6QWOaHulSqPS2cTEzz0gObaweuSGVSlsfBc558PKr3Pf0lkY4SvDJvNrxZ4tAHWTn9A==","signatures":[{"sig":"MEUCIQCccn8Jygi48PSnoN3rewKkcOc56PWtuDYXBh1feME4WwIgEhLIqDTL/K5IoSejuV0PoYpL4z4OeMwN79sejl9Qnmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4623889},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js"},"gitHead":"b8e14fe231928a69a1d40e0af299ab280f254c6c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.234_1775370310272_0.7408379994724559","host":"s3://npm-registry-packages-npm-production"}},"0.1.237":{"name":"ugly-app","version":"0.1.237","_id":"ugly-app@0.1.237","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"381a551b9a2593c3e7b84e3b69ca4c638db519d7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.237.tgz","fileCount":1420,"integrity":"sha512-kG0i6FCMkp4h7o8wefKpqWZC6c0i47xIlWK380dvXRQIzRgi0VoXKKwbm0if7omfzc2bxUPLT+VhK/+MUc9f9Q==","signatures":[{"sig":"MEUCIQCKs9kFkUnUKsc3y6jNSPvlwKH9y8SOPtAOYcm2M0IdjQIgelLjarpg/ZCy0+Q6+/QQru6FyfNvpc7akz4MUork47Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4639363},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js"},"gitHead":"bdaf4b50c286d3501487dc0a3975bb886696ebba","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.237_1775371346635_0.11449954508339677","host":"s3://npm-registry-packages-npm-production"}},"0.1.238":{"name":"ugly-app","version":"0.1.238","_id":"ugly-app@0.1.238","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5ea3e8d5090579e44588c9f40904dda07fe4e54b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.238.tgz","fileCount":1430,"integrity":"sha512-uOrLlh+RR6l5HuTDilAJdVe1joM44KoJn+Ch5k+IkGUfh/FpaFGKTIsGkb8auVerVBukl02nPi+XHN3/vKGWbg==","signatures":[{"sig":"MEUCIQCaQd/96efWAyszoigBAwtLt4SMzYRobDeU38wYm/WtjQIgbQ4s0y+G0rDveeZxN98EB+Yv268hQtoBpp8NRUUfJgo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4717696},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js"},"gitHead":"c185d4d6076f6af34e054f50c49cb0149901f97b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.238_1775372003052_0.5665319371729447","host":"s3://npm-registry-packages-npm-production"}},"0.1.239":{"name":"ugly-app","version":"0.1.239","_id":"ugly-app@0.1.239","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"00972c5c471c106eab700c10f59f61d0efad56d0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.239.tgz","fileCount":1424,"integrity":"sha512-ppnNUqUnSUHRuYSn3IYWuZpTOuX+aFRz9k1ZntMkq9HfJwYHksU2vjWvTgeouGOJnUQ6WdRHbrSrUe4ORGZCgA==","signatures":[{"sig":"MEUCIQDeHe2xvfGxLlMyTx2GxAhJCHUfknw1b/z/7UT1KSgargIgKNvDEdriK0gG9lOVk+iVXO7+AL+h8SW01IgRVu8D8gc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4745805},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e985d310042944fcdf1dba58777eb608a754d006","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.239_1775373452882_0.8042730902220412","host":"s3://npm-registry-packages-npm-production"}},"0.1.240":{"name":"ugly-app","version":"0.1.240","_id":"ugly-app@0.1.240","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ddb3d7940326953453525c70078ebd51c7600192","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.240.tgz","fileCount":1424,"integrity":"sha512-SVBBOzLv1I3jbH+CJR/7v6hVZZwxEdTdE8hobBwrNvKotgfl1a9JXlSGac0vQppTdkjhiL4HMR2Yb1p5XqkGNg==","signatures":[{"sig":"MEQCIBoNW6LMs2YGmCouxaylCjogN4XEqGX1cvLBvmCpqtL2AiBx3Q/xS4pEER3nHrH54lJtXP5JezmD25wjcy/UNYkbpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4746245},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"236e60a0fd2142da6ad563403ce7bb64371b9e7a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.240_1775374073512_0.086212609020762","host":"s3://npm-registry-packages-npm-production"}},"0.1.241":{"name":"ugly-app","version":"0.1.241","_id":"ugly-app@0.1.241","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"10fe4f66792b0cc98cd7574e24b05651ba0499fe","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.241.tgz","fileCount":1439,"integrity":"sha512-EwIYlidDathH3QbAPYCQvdHWYyeh+EiPYZ+TFIhr4j9F7ew+pxxvlkzzo1CWteiDGy7sJCDRDpZeXwCQ9xyyhw==","signatures":[{"sig":"MEYCIQD9T84SlpQfbHMDCrUGje/r9IP/lb2Q6nkYgiHu3JfrsQIhALnLbuypnJsMVFLeLR7HsPlrqqAqrhTRT2AKmezFWaz8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4781713},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"35603191d7634863711af8be972d25db76c73e56","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.241_1775374553456_0.6063153042235889","host":"s3://npm-registry-packages-npm-production"}},"0.1.242":{"name":"ugly-app","version":"0.1.242","_id":"ugly-app@0.1.242","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b95d34cfb24d533cc097814d711e2aa45346ba22","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.242.tgz","fileCount":1469,"integrity":"sha512-PKhOtnqC1qyXX/1+9LJFnBhnL2pXlDYMVG6sG0IaJTIb97tJXUfdcNyNZDVNxuxQphlY3GRqc0RBdcioBHJhCg==","signatures":[{"sig":"MEUCIQDO7WWK68NM+Et+Hgt2XifVjM2eogse87vKyma1Oh0KIgIgApSm23E9LyeAg/N9nkow+h2y9aTQ12TU5T6rH3yw9y8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5015433},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e9f3ed88cf355b2f968676f44b4a589a6d928f18","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.242_1775375140897_0.7043074279164154","host":"s3://npm-registry-packages-npm-production"}},"0.1.243":{"name":"ugly-app","version":"0.1.243","_id":"ugly-app@0.1.243","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0ccee7addbc8bd8041a4807701cc061a9c0d804d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.243.tgz","fileCount":1586,"integrity":"sha512-vJw4fyczhxPTk6ozv30YzO7Wm/JWxvKLMPl6SE/1wtPeMQL84418BEQC0ysQqOl98g94HXbPRaORYbwJonCBkA==","signatures":[{"sig":"MEUCIQDXUKbWn2XB8QRZWWQorIfOzlDv7H8wQtLQGq6P6PwirgIgUwdmYRxtbMwufhv4i+6rj+egX7s65iEyBJuI2/2ca7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8873000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"948d9188f425f1905a64bbd2d9f1c382cd1057db","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.243_1775423722975_0.36870073773895795","host":"s3://npm-registry-packages-npm-production"}},"0.1.244":{"name":"ugly-app","version":"0.1.244","_id":"ugly-app@0.1.244","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b62ce1472886099776899e794f922051e998513b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.244.tgz","fileCount":1590,"integrity":"sha512-moGIAomOT5SRW4q+HiHdXBfDtqWoM3ydAuGo3Vw4cRCPYlMth3FVIYKKIcD/rdsqfwEM/w0SHOn/htrhvIWDpw==","signatures":[{"sig":"MEUCIQDSM2A8qxpIe3ZOUZxOTi2TnLkhGDKqzP1irC9FDumuNwIgWQ7y44gzi4YOWlyxue3uqxKlu9Vwl2LWqsbGKYcKzjI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8840849},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"7f65d31062af0624ea5e902fafae68cd5e11c7d6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.244_1775426895491_0.8775947728376094","host":"s3://npm-registry-packages-npm-production"}},"0.1.245":{"name":"ugly-app","version":"0.1.245","_id":"ugly-app@0.1.245","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b4b6351766cd201ba6367cbd48d01b0c8f55a3f0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.245.tgz","fileCount":1590,"integrity":"sha512-5o9oQzTZj+KKcGzRqFppj1uV47QqUEndDC8zdH+rR3ViqQAVfQXGt41yxyYsmxc/xn1dnBfopg94UoyMGuIHcQ==","signatures":[{"sig":"MEYCIQCh4rVnDWtTbT9MYTij2Dxj9fTLC3bP6ailwshBFJQE9AIhAPg551sQ3sDGNMprToQbrfsyc0HET0liQNG/0bYu90JD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8837237},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"38aa0cdf78c4805297ca359abc6e40d68e8ab97a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.245_1775427220746_0.7704857564287189","host":"s3://npm-registry-packages-npm-production"}},"0.1.246":{"name":"ugly-app","version":"0.1.246","_id":"ugly-app@0.1.246","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e3d6ae93fef032635ee78bad2fad7f18c299ad80","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.246.tgz","fileCount":1590,"integrity":"sha512-8VQUeY0WjncTn6MfWnIgPGtk+JlYrSwfV3/24BWtNXoXIuSsudaRUFo3N6TciTsGeTeUttRCskAzHnz5nOYprw==","signatures":[{"sig":"MEQCIHD2wguytWhlJSkbCdYR6+02toehTcQsVGcSe72ApPmzAiBrwvEO3Dc3lCsAby7hoPuWtodrK/n6uqt1y05VAiGvkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8837241},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"089b8b98079237dda83fd0137aaa6f6ca08bbb36","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.246_1775427297035_0.8137096931018282","host":"s3://npm-registry-packages-npm-production"}},"0.1.247":{"name":"ugly-app","version":"0.1.247","_id":"ugly-app@0.1.247","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9fdfc8413e318d077fb954ab6293a6d0c48072a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.247.tgz","fileCount":1590,"integrity":"sha512-I3t3L4cw9sKWRa9fjhI0a8xgdNcIIYdTSLGsKrl9q5Y10NBOc1y/TgD4PbrRbtXwUFB2+pYkNJm5XNQU/gadHQ==","signatures":[{"sig":"MEUCIQDR+exanBrQX8tgTXUNSMdQD7tQIjx7g3/Y3dpI/tNtcQIgA3aj7OS3Fnu8fA3eiTAMWkQjdXt7xuUMeD/w3SwwauI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8838342},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"3b37c6ca45c9d02ac6868c914f7f3a998474ea2d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.247_1775428097050_0.41051175405209395","host":"s3://npm-registry-packages-npm-production"}},"0.1.248":{"name":"ugly-app","version":"0.1.248","_id":"ugly-app@0.1.248","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0628b19e104ed542cd4373e58756de8ca58b3732","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.248.tgz","fileCount":1594,"integrity":"sha512-NAjojvWQe6xu2w5tobzQ9O6TGvQPQL3HNgU/P0uXNHTcinJb4VeUK0HFeDT7xjQ/0uAu9tjDNLtfNTfiESQXbw==","signatures":[{"sig":"MEQCIBOPJ/rLUti1wJ7tsP/lFkxwyZSLBcwBPq766Ydv3VpTAiANZe7Cr1ZAH+0rdf+l3hncucQ8kioTGRzAZUAFuK842g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8819453},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"2b7f2b66db902a8744a5d1f63d36279331c46ab6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.248_1775428522570_0.5956761200154466","host":"s3://npm-registry-packages-npm-production"}},"0.1.249":{"name":"ugly-app","version":"0.1.249","_id":"ugly-app@0.1.249","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5a5370d0a808ce97fdea6017b7aebed02d2db56a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.249.tgz","fileCount":1593,"integrity":"sha512-V96eHBFeh/utGX15Kl8DNe5wv944W0gkDbv7MbQ0ZCgMX5/i77L1BPuSGnnZ8hiSRBVWzi0tzp0ffE95jYSzFg==","signatures":[{"sig":"MEUCIB4NzsVpPW62Rg+ixi6y5BWW+eo5NlRF4ys7fvReuQ3mAiEAtGL+xjqotp6UEPAzhizglIv9MRmeoAag27lcPc5BJkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8814934},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"3b0a8caff6f15be1fb82a98706e98446e3806198","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.249_1775429336431_0.3471268380501833","host":"s3://npm-registry-packages-npm-production"}},"0.1.250":{"name":"ugly-app","version":"0.1.250","_id":"ugly-app@0.1.250","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5e0aa9652fe28fee53b7b1f187571dd8bf56ac89","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.250.tgz","fileCount":1593,"integrity":"sha512-/Sif9ZJ96Icirxs7yLV0f6S114wk3qYaN6gFKiplp3T+dgTARqeDEvCpavW4OBBT6dtfsfB6/4/Zz/Qi20aHtQ==","signatures":[{"sig":"MEYCIQDuxGMXFuVb3lDj2WyeSTQyTTV6e00uaDmp/7kZVZ39/QIhAP1cnnwoMMq4eh7g6Q6RapDBxLNOgoSkBI5J9wU8UdJM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8802616},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"9b4dddc6faae1d2b3253858e8cb2c07ccc6c8caf","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.250_1775430466242_0.3532089905377016","host":"s3://npm-registry-packages-npm-production"}},"0.1.251":{"name":"ugly-app","version":"0.1.251","_id":"ugly-app@0.1.251","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ddad33eac87fc8612ecf855516cb17223b52fdbc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.251.tgz","fileCount":1593,"integrity":"sha512-/1rnwryKAFDHynFCIP2tJmXYyBCH63QJW3vthJqM/N8mdJdfN2tV9LLos5tH4gCQzY1qDXR6Ed8dnrRRfzgcGQ==","signatures":[{"sig":"MEQCIHDLsSsB85eb4TMRdUhYYr5YLOGglNMeXihBYOyDjB7dAiAuENCsP+q0mAhKtYSGcDVvPdiPcpWK8GSjhfIl2QLgqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8802616},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"8c3a799a7d7262e9e9fda1cac9867bc469b14cc1","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.251_1775430539723_0.3924732671994122","host":"s3://npm-registry-packages-npm-production"}},"0.1.252":{"name":"ugly-app","version":"0.1.252","_id":"ugly-app@0.1.252","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f554193e69557f98069d4b29ae159ec60fa2c5cc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.252.tgz","fileCount":1593,"integrity":"sha512-sN9QjMgkxNkD6jFVXWEkugmmiB+KegE2+SoOQMBqUxk8AWITljcTuK2kbHBc7svakAmCMsMGkIXepHGw23y9kQ==","signatures":[{"sig":"MEUCICs038fzYSJuLFuXvzJRpVg2xpkqRJ0ZqkopYOjNciLYAiEAoStNyUWxc3sxP7Kf0pAY8pSaNTHKt/M7Y4o4Nlo5QYQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8810902},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"0f7db57e8bc96aa1bfd0b95858d84fde66ac8514","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.252_1775433285558_0.710860970851086","host":"s3://npm-registry-packages-npm-production"}},"0.1.253":{"name":"ugly-app","version":"0.1.253","_id":"ugly-app@0.1.253","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e28e6176762d011546d0020c28c87c34a791c226","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.253.tgz","fileCount":1593,"integrity":"sha512-S83V58e9rX+cv8A4UY2wFRpslF9+W8hphF1/JkC8JeYuXHGNYK3yytt1SjNFQZwFd8ii3Mp3vUSEG5qqwIE1Sw==","signatures":[{"sig":"MEQCIEwdVAQpSRBFqr2GQZ0wDsO8UnMANtq9ZWsPuq1ajdrYAiBijvg9MI4REH2qEipnnPIe42bixNhxY8ncBWMDD5EyUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8810902},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"13a11bc632572f9348481cb93c3097201cd09f84","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.253_1775433354753_0.2792508107017202","host":"s3://npm-registry-packages-npm-production"}},"0.1.254":{"name":"ugly-app","version":"0.1.254","_id":"ugly-app@0.1.254","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"64fa2f33bed6efc440c7805535f047abd5200185","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.254.tgz","fileCount":1593,"integrity":"sha512-9251nMVF1NZCdC1r/a3nlLtfzLOwzXPN68hAiC2MJe0u34Ti9obPaxJ6R7XNkxLIFjz2r+tpzFxgRhZNyrNTFg==","signatures":[{"sig":"MEYCIQCEyaC6lWdmjcgmph5EoCuqHxbDiC72urVO7dH8R/C+rQIhAMSbrrOOevUhj9IQauPXARx1i8GhnFVOQDtHiwqmZ1ch","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8811095},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"41d77d35a7248b88bc8dcaee890a856ea82fa299","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.254_1775433659637_0.8932556135665513","host":"s3://npm-registry-packages-npm-production"}},"0.1.255":{"name":"ugly-app","version":"0.1.255","_id":"ugly-app@0.1.255","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fb7cfbf4e6319d60bdbcd2f293b0759138a39a18","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.255.tgz","fileCount":1593,"integrity":"sha512-Z72GnvlfEMb/ebfL8c3CONbMXEpRcrFvSK+KsV4/Jh+KvLN52a9QW6yneIc/58Ymz3r618bU8lLkjAx6+4iHFA==","signatures":[{"sig":"MEUCIQDNDcwtyvP4e866pJdw7JznGV6oh55nsNJZ3RktwZC17QIgCM0Tq2gSYW8kNaFcxkaFROsisa5/kMGPu5PSFhcm0Dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8811427},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"a7a67ad0d3d0931b45fabbbfce5e8fcdf1eaccef","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.255_1775434254884_0.7709035510332891","host":"s3://npm-registry-packages-npm-production"}},"0.1.256":{"name":"ugly-app","version":"0.1.256","_id":"ugly-app@0.1.256","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7202ef1fb8b8197849017890beefa811eca597b7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.256.tgz","fileCount":1593,"integrity":"sha512-LsQZQwI5aPFfLU9+6QxPu4YKUjORb8/pgUAzezP1OTXoMHa8/zYa/gngXBd8xqL1g2wBk4iNunqqNukhwsIbHA==","signatures":[{"sig":"MEUCIDwmNbWfiCDH4p1KfEWWzVuoAlkXw5iPW55XRNnZs2JjAiEA3FPA0okNrmFjmQy3tqqQuKcokw4NT4+FVYIxu6igjQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8812430},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"cc097da7f5f668afb70b6668df0c8417c4a67e38","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.256_1775445644413_0.19666766824991222","host":"s3://npm-registry-packages-npm-production"}},"0.1.257":{"name":"ugly-app","version":"0.1.257","_id":"ugly-app@0.1.257","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b09bb61620b5c4b2cda1641aef76dc2f533e6661","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.257.tgz","fileCount":1593,"integrity":"sha512-9JRfbGL0DcTuiN+64ntYxR5M5xfAYUCDiJo6TAPbj3jH/BMhYhYHYoekMJR79rjrAWWRffTMmeJ+Mvd7zKCBUQ==","signatures":[{"sig":"MEYCIQCIa6o8PwFCmk4WGLwHXLswLlMzUPC17yNPJPsSkx7phQIhAIXxxzLXk4B8CV7R9PgB4fADaXABWc0kLhmSsra4SqbZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8812900},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"3bfea3a0fed407ab68e24c53b2c7baa5fee3d4ea","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.257_1775446180415_0.022068206377509725","host":"s3://npm-registry-packages-npm-production"}},"0.1.258":{"name":"ugly-app","version":"0.1.258","_id":"ugly-app@0.1.258","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"01fda35e2de2dc0c0dbea2333d6d5e9d335e5bec","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.258.tgz","fileCount":1593,"integrity":"sha512-U4MAMWFziUKjR459hu/gJlOUCp1XxD0RQWW/DaNTcPkqzpMkjI3ipn+hpGufDwUcp0u6q7NNeYADlJl0mB/qaQ==","signatures":[{"sig":"MEUCIQC779xgPsHGRkGIrB8iuZkCgNLFmZerTWQ65zqfc2I8NAIgB0xzpYWcZbJAcAAT2t57ktCQSzwb9S6r3JS0CeZQ110=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8812888},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"1688dd1a8954d2c75c0dc2547c4c9ea08ce06b2d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.258_1775446698461_0.09918473883486612","host":"s3://npm-registry-packages-npm-production"}},"0.1.259":{"name":"ugly-app","version":"0.1.259","_id":"ugly-app@0.1.259","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"40a699bb877f33a18e2356990bdca01e72165a74","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.259.tgz","fileCount":1593,"integrity":"sha512-v+p8PhfFaZxWIbo8CKDnb+ieKzIH/LzZLj08TGeAw1OB+p8tST8bLJRCnwwpLz5pNVSw+aPK6Xweiy0rvY1peA==","signatures":[{"sig":"MEQCIEvvnFitAheNM04PaKvqi4Sal9njNvszGUm8ZvhyPv4cAiB0QOWhkxMx4rbOu9BhKudTIUT9M3pYAPdhED+wP8GHmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8812888},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"d4089e0eb672a6a7859035cca45cac011aa5d9ef","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.259_1775446739465_0.5593668305158475","host":"s3://npm-registry-packages-npm-production"}},"0.1.260":{"name":"ugly-app","version":"0.1.260","_id":"ugly-app@0.1.260","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"14f005391c77285f1879d35d571baddbaf9b364a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.260.tgz","fileCount":1593,"integrity":"sha512-DPnFhPPpObZq+vv4XwdezhuZXfBu5EiWzAMm6lvjR+kXhJpzSr2686Os58qHQl9NBBFyFvMQTScyT6cnF8KyOw==","signatures":[{"sig":"MEYCIQCeRqbl54jXXhK63oj21/doeaM0NkNblsTFGyC4yQMzqQIhANA64AuPE8P/71s2XEp2U5LIQ4wSXvWeTyEulmC3+ZCc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8814767},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"8a613d31c041ffc7b0c09f9d7f4fd8ce8353c3d3","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.260_1775447254074_0.9359975578230695","host":"s3://npm-registry-packages-npm-production"}},"0.1.261":{"name":"ugly-app","version":"0.1.261","_id":"ugly-app@0.1.261","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"520a0cf8589dbe08f5c75df27ea4804420472946","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.261.tgz","fileCount":1593,"integrity":"sha512-hin75gqfzf5ieDEp4Qh78dUYGtYsetN+1U3R1jRpoyeA/szXOVepiZJumw31gs44xbJJB3TdukDLygCp9G6hoA==","signatures":[{"sig":"MEQCICqAsOuh7Ku1X5uSAcZDX0P0dOtUuC4nneWGVrY8L4u4AiA2x0lgPwkOQ4ySZ+6BNkuL/hneE7K0Lks8hJtIIDLVSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8815248},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6c34bf93da2a6f9e497e45a02e7937b56da782a4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.261_1775447873545_0.3706393947149673","host":"s3://npm-registry-packages-npm-production"}},"0.1.262":{"name":"ugly-app","version":"0.1.262","_id":"ugly-app@0.1.262","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1eba61a7e555b7422b23512fcc3c5cfb9acf30dc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.262.tgz","fileCount":1593,"integrity":"sha512-K1tfHANA/NqhvcwcuOkXPsQu8PMpbSLq6X2USGbiLZKi4uIRlI+vRyCDMkWl0t2i56Migia8GDzKGh69NbTrjg==","signatures":[{"sig":"MEYCIQCXUaJpK/5XpXjTQY+JpLgF0Jci0YYwM4as/7fEBpvjDAIhAMbKscgKqBqEihoEGMB4w8lhTKLtJm80T7yk5dizDKEM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8815248},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"28ed2dbd7a286fe96676d23ea1fef435c75900c0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.262_1775447933718_0.7315542780619988","host":"s3://npm-registry-packages-npm-production"}},"0.1.263":{"name":"ugly-app","version":"0.1.263","_id":"ugly-app@0.1.263","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"642ff549b578bd2ec6ef537e5d01d05a9b211dd2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.263.tgz","fileCount":1593,"integrity":"sha512-xvWOKAAosbz4A/UpYkIFZneeBHDySIGNQrXGe6B8Fl9q2X+5wXDGU0tg+ReC68fFSAhpCjaYNE9KmoWx5K4egA==","signatures":[{"sig":"MEYCIQDq9rG1NemGnUONoJSDaJCdoQmOqygz+AZDmvud4N7PuAIhAIWB7i6CIV6ovOQO0PuKIzuT0u0thOuPJkB0LvJSvuug","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8815824},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6df8636afeb870f8d2eb711987b73a90ac6ba533","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.263_1775448001066_0.6558616463556692","host":"s3://npm-registry-packages-npm-production"}},"0.1.264":{"name":"ugly-app","version":"0.1.264","_id":"ugly-app@0.1.264","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8bcd8ba183a49d1ad149f94a705163d64ddb4cc1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.264.tgz","fileCount":1593,"integrity":"sha512-DxZZoSRYiDMNkOpFlRhppSA7taxDpJwF9GsoXnra9AXJPIW9gSVpQuYavt/OwlYWB3g6DBTmJZojDEinkmLQVQ==","signatures":[{"sig":"MEUCIH4O9A/z48JZeKnbZw6P3FVmO5F1xDcedLq+1jf0b3UBAiEAk3auzIKwg102YW0J3OzuakYu/Hm4yzsP6EAyDBwSSIQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8815824},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"32bf9925326c567a8fb44ac55e9a0ee3b66cfe6c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.264_1775448053068_0.06743500322420992","host":"s3://npm-registry-packages-npm-production"}},"0.1.265":{"name":"ugly-app","version":"0.1.265","_id":"ugly-app@0.1.265","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"87f2ace7f0443028fee9962c53eefe3c8e9c9e7d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.265.tgz","fileCount":1593,"integrity":"sha512-909CuOV3CvA0JWzPblfCPknxNFLe8U6wu6ryqJw6rDJV8TULFnlXOPwoTyvG1hw3cwXTzS6laYTDx7PoLfXBYQ==","signatures":[{"sig":"MEYCIQDVsejJcluRA5phYozuui4sGaq7Wgz+nIH7XQ75XdRmFQIhAO/zS7dEl5yFV6wJOUrfoRQYIM2IIOLu6aM2jYlUciVD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8816391},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"c7798d31d64f11e4a03e649847361475d133a4f7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.265_1775450230892_0.32240527093850546","host":"s3://npm-registry-packages-npm-production"}},"0.1.266":{"name":"ugly-app","version":"0.1.266","_id":"ugly-app@0.1.266","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"642d29daef454df60f1347c0d300f89dd48d6d60","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.266.tgz","fileCount":1593,"integrity":"sha512-4F4gSaacNFn/OlToSfegdAYdGjl2O3QJYP7DdH5+8AE9Dj+tr7Ayw+iSQjiBWcMd5oloSmPzntfGRcHnTwptMw==","signatures":[{"sig":"MEUCIQD/S2fcH4ZzLBPy61LmHm/OPrzmwWyQDLlJg0KwsOMtDAIgYkJ2eh6CwBqwOkmTS/OKbn36N6iehun4uq3pR7PsA0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8817248},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"953e354c7a65f448e0ac15c8bb0e9eab50d5582a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.266_1775451955932_0.4450982824522334","host":"s3://npm-registry-packages-npm-production"}},"0.1.267":{"name":"ugly-app","version":"0.1.267","_id":"ugly-app@0.1.267","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"83f6b96dc5a7a4741c3bec0f228ddd06bc8d4e1c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.267.tgz","fileCount":1593,"integrity":"sha512-Wh7oWwgXPpFcnsrj3ue4dR0OCBSIRQwqvN8f83QdvyjpCynhwhAVJZU07Q/FeMBRQg5LzWIZUy8lkBPWpDcQUQ==","signatures":[{"sig":"MEUCIAyn0O5LRsIYHg+tLM/BLk0S8/0JeBxPS78HX7CT+bwMAiEAjNLaL++Gs7t7wlOHTWfPFgtv/UKxE4QmO+F7h99NaLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8817272},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e7c9e5adb23281e996bd1bb59af30de66c36fc55","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.267_1775454465080_0.5639084267771453","host":"s3://npm-registry-packages-npm-production"}},"0.1.268":{"name":"ugly-app","version":"0.1.268","_id":"ugly-app@0.1.268","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2049b47d9671f7a2c81fe01f48d4255b93862a06","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.268.tgz","fileCount":1593,"integrity":"sha512-HGn+d5bF3IZJ4u5mBtwZObsPkubEToMbTRHQHi6r8FAvrZZQXZx2388k2OkUm37v0+v9DzhOHsOUV470+ODP4A==","signatures":[{"sig":"MEQCIH1DRynZX79QyHL50lGNEaOOO5JemtJq2c7d++ez8DGTAiBgqdRGKNwDWei9oq3/4J/5BPga2kJ64MawacqTgsP9og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8814851},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"ec0f764754134ed8f43f7f9ccbf017a86c0be55b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.268_1775455066525_0.7740307993475237","host":"s3://npm-registry-packages-npm-production"}},"0.1.269":{"name":"ugly-app","version":"0.1.269","_id":"ugly-app@0.1.269","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3077cc50cc1e74ac993757f0a9067015fd47dbe3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.269.tgz","fileCount":1593,"integrity":"sha512-tzrAyeB8U+LJl49oRymLN1CgGWjhbbu7xIBFiVSyEySMFERTDSF40ZoalRyzx2DV2unB6IeDkjuq+f/UYMrY+g==","signatures":[{"sig":"MEQCICDk6cxyaguutNh8fU9jjPgew7LWjLP0yPo90CPrYdVLAiBTX9Nk9qn55eNJYx3vmZmIRKkqn+KWXMXqrrbjdSV2qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8811815},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"7ce1b155628f7111943521e91cb25171f55a3140","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.269_1775456136331_0.45842106575970365","host":"s3://npm-registry-packages-npm-production"}},"0.1.270":{"name":"ugly-app","version":"0.1.270","_id":"ugly-app@0.1.270","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ce487b83ef3b00e32400763f9c2c6fa36085d754","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.270.tgz","fileCount":1593,"integrity":"sha512-jphCCY92iwejL00UuT8uT3xIMNNqAXXlmF+/ppVMCFqNSJZy+XrtX8AW2wYmIubyHaxIUz6f/o2osnLAdttkDg==","signatures":[{"sig":"MEYCIQDcEysYPDYabyq8aVx8RZxg3dcKce+PkEn7ANY0l6gqQwIhAKO1UmB0406tW9qVG5yv4DOtKQVW1RwcwLGHYG7Y74/K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8811815},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"c242142a96e27ded9795cbd302953c10ced554ed","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.270_1775456369240_0.10810923519034055","host":"s3://npm-registry-packages-npm-production"}},"0.1.271":{"name":"ugly-app","version":"0.1.271","_id":"ugly-app@0.1.271","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"70638bc85e7369209fff53265358cc2c0f381312","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.271.tgz","fileCount":1593,"integrity":"sha512-UCZk4KoIOXh8VTGC7rPXkRjmXwJ8SgvbuKXpHw/wKSAFIfN9MxHS1untoSU//92dgrL9JwSs8rq5+lcdXQgCIg==","signatures":[{"sig":"MEUCIQCVhczmDQzbscNYPbibFFoGaD+D0fQ0flyoljWpPDCDbAIgV4CLmJvPs5vwgeoiHEUU1Mu6cAfdUmHN4pYrufUjloc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8812410},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"c19b390b18ae05d76900bba63bc575325b0124db","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.271_1775456470171_0.42157214708172663","host":"s3://npm-registry-packages-npm-production"}},"0.1.272":{"name":"ugly-app","version":"0.1.272","_id":"ugly-app@0.1.272","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b1eb42805eb5df55770947da28a4b927d5fc6ece","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.272.tgz","fileCount":1593,"integrity":"sha512-cCXQaXUAMlQsWNJrvp3VUESZscLfhofAesoa3qrNrI/ypR18JOUlL5UJxsjzCrXZoEUIjalxQ6EeBjREvHLOqw==","signatures":[{"sig":"MEUCIQC5F8NRdiOjLMwSt9pAtCAiYODeogQTCa9IbJZZd83nSgIgXduoCvPiak+dWjO2ogehXvM3/rUMycuunJrQHYKNsuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8813452},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"511049808e4b5c9c65ff48429e3822c4e998868e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.272_1775456704844_0.7482763289185035","host":"s3://npm-registry-packages-npm-production"}},"0.1.273":{"name":"ugly-app","version":"0.1.273","_id":"ugly-app@0.1.273","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ba6816f819c69b9188268c9227c5699f7f30a5a6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.273.tgz","fileCount":1593,"integrity":"sha512-K6x601VK2KgHcCe3YFLEaeKAM02OOCuH1lnXtTg2+Orf8pHWw9sjNLKJOHnad+e8nSPWroVJvu18qbvI8DuIWQ==","signatures":[{"sig":"MEUCIQCRasJNmN6K92C32jCOCwZNFYtydUzOQftkxAD3XnVcRwIgFdphVtMW9a0rgH9ls1QoKv6lVzO6GdJjETyzn7+VYJg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8813338},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"179c436abe59669733dec4acafdac45dac5cd226","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.273_1775457353807_0.1271088122399262","host":"s3://npm-registry-packages-npm-production"}},"0.1.274":{"name":"ugly-app","version":"0.1.274","_id":"ugly-app@0.1.274","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c11b324504d19a83af664ea076e08911537139c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.274.tgz","fileCount":1593,"integrity":"sha512-CPapLXoZ//alR5HMP8bHOen+1IazoOWEO2t0XHYMqAOVkdGGrzxfyA0HjTnAvaeLu+lt62Bu+Ee09JAhNnmaXg==","signatures":[{"sig":"MEYCIQDgiY47/On2KIKn/dArlYq7QIq84Vffa6ils+Uaz7XkHQIhAM55tC+9DCAwJnTlbJa37p509mKV2NznG48t2uojFOHD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8814551},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"0ee271bf1aab915fc4392e61d07ee7ab1919a22c","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.274_1775487219632_0.9611745965839222","host":"s3://npm-registry-packages-npm-production"}},"0.1.275":{"name":"ugly-app","version":"0.1.275","_id":"ugly-app@0.1.275","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"304e7eb49bf09f75e0036d39ca333d8279afe95b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.275.tgz","fileCount":1593,"integrity":"sha512-uLZvc9MdzoYcoz/3s6vPZyiFYrRD39z2VbApL2rd6iKxo7gc6ORIOsI4j7RqhUaVNoWh2mHOZWHNX31yVP+tyA==","signatures":[{"sig":"MEUCIBszClLTDqMlo4RmT//YpASSQmGYM5PHdkpwFxy2//SWAiEAu+hHH+n1IuPTJ0ep+AEfPfZOc2GbUu8Fdq1Oy1WZYqQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8814184},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6f9d5a439576ddc8214a678369ef9802bd2aa38b","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.275_1775487702032_0.66368111661595","host":"s3://npm-registry-packages-npm-production"}},"0.1.276":{"name":"ugly-app","version":"0.1.276","_id":"ugly-app@0.1.276","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7294a1b70a3b013dc414fd2fc3b0694908ed4c0b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.276.tgz","fileCount":1592,"integrity":"sha512-HQ3XJRJWM7JlzFCJk86gjBobQpQxYhadkh7bwpZ19eYY4fYf5/qR5UnNW7tRXycPXZtGzuzi08SUekJhBN8q8g==","signatures":[{"sig":"MEQCID5QmPdx6DnhGMWpqc6/hboCkLph99HZHoy4XcnWObRsAiAR7lGRWJH4aOdUCPyB5T0RwZk4JHwa2gcMmMZdMA9HZA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8805679},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"d9aae6896dfc18b4f4737ab82f9a08eb552b7791","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.276_1775489896369_0.4148309122325575","host":"s3://npm-registry-packages-npm-production"}},"0.1.277":{"name":"ugly-app","version":"0.1.277","_id":"ugly-app@0.1.277","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dc617830f6e176bffe4ee8192ce0ce9e03b8ce53","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.277.tgz","fileCount":1592,"integrity":"sha512-TGU0UYITpic3LzR3mu7wYn1PFtaonW7GIlYSL4JSZkOTrYFnCG+/I5CxwBi0wJz4zRF6316SLt2+bgldmXHFaQ==","signatures":[{"sig":"MEYCIQD2NnKGGItWK1JbJNXmA49YawOvDwdBLF+TtSmSxSc/nwIhANutXnkUIBWNlzOZsjyiIcf5U3lWvLZB1+SJV8M04Ozc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8805666},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"ce51109366ff3424640d609bb01564d46a69c7e4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.277_1775526563321_0.24389916568478198","host":"s3://npm-registry-packages-npm-production"}},"0.1.279":{"name":"ugly-app","version":"0.1.279","_id":"ugly-app@0.1.279","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"22f48d623ce777f2120649536e4ded988af3adee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.279.tgz","fileCount":1597,"integrity":"sha512-RmphUI/g4kebRWZn2PihDO1KzF0PxrqVL16fCMyBMcD5/VON26OMtpjltZGZlWi9EkqBKjKcLx9TnEzXC9tV6A==","signatures":[{"sig":"MEUCIBKFEPjzgl0FKeb2wqIX4Ly5ZkAEUmk5T45OEc5OuvDXAiEAskwIw8Tc6VBABfBrMaD1QttCDi1shm6dNpDgqw8Qci8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8819387},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"5ffa503557c198a3f8a1033150d1b53d30f04b38","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.279_1775528872845_0.4024326949316568","host":"s3://npm-registry-packages-npm-production"}},"0.1.280":{"name":"ugly-app","version":"0.1.280","_id":"ugly-app@0.1.280","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"893226e96848d7284df6c53d26e530f6cc0dfb7a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.280.tgz","fileCount":1597,"integrity":"sha512-OGPZV0BA7+iqTdb568WJ6BaoGdGmu9Ovbi+Zf+8Lu5BaAMlfl8/dHQ3fR4EVK5iwr7NukXC3ID8vU9ci1J+sNg==","signatures":[{"sig":"MEQCIFsVK1mCQ5pztSHYw4fKtcz+VNHPK0DoiXDmVSj00J0EAiBl8ULuOQ1FxFu4pWZsTfw+ejZ5bpM6jd78Hd42dLLksQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8819387},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"c065c22eaaa290a47b3b2ec413c23fc247a660c5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.280_1775528890092_0.6866966955483722","host":"s3://npm-registry-packages-npm-production"}},"0.1.281":{"name":"ugly-app","version":"0.1.281","_id":"ugly-app@0.1.281","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f33301caced7414e24e3bc7ffeaf36318ec165fa","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.281.tgz","fileCount":1621,"integrity":"sha512-NKnt54BMxDjcuSLV05QW71G2NAcrQ6sbaWJvZ9ExRgD00MIst8StD8M1h+aSXjsF8JuMzZYbv4+9+uzTzIu1xQ==","signatures":[{"sig":"MEUCIQCf9v+25hsnUbYdb7xifzilnQjESWlM4bMNFYx21Nz+VAIgTxOXJsPQ1KRrBRquFmbYBwX0UkjkwIbcjZMSDIILQW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8840159},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e81762dcc422842ee544dea86a0a50280b664f06","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.281_1775535166034_0.8286473783356683","host":"s3://npm-registry-packages-npm-production"}},"0.1.282":{"name":"ugly-app","version":"0.1.282","_id":"ugly-app@0.1.282","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"14c688846440dbc542a479c2b31603a21a2f2f11","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.282.tgz","fileCount":1621,"integrity":"sha512-gh8hAHBgbKsDVJDFtUhYEiAJUdoTPVOR7qPs0p2GdEA258ctlXXllA3CAQimvIDc72dDk0kFfx1azeX8tGIAtw==","signatures":[{"sig":"MEUCIQDdfcjo1L2v17TTU/G1zjGH0RScmu/pNDasF2wfM/1opgIgMu0MfCESGhqi2O1D7hjoTna3GItVNDEb3T8yKTdef2c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8839326},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"f52756287c2aee2073627da69315fa5d64d16787","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.282_1775537570003_0.9226173724457609","host":"s3://npm-registry-packages-npm-production"}},"0.1.283":{"name":"ugly-app","version":"0.1.283","_id":"ugly-app@0.1.283","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1670524be5b0c3bae228d3c007171fa71d58ffec","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.283.tgz","fileCount":1621,"integrity":"sha512-yhPTbu+5TComR1dxAvBrg8K+FS1mTq0BtBq31LoDN7hj9l/YTjGdIykK4w9Cz/Sf8KSKBASyB1p2RspX/16fJQ==","signatures":[{"sig":"MEQCICPt3uBc0CxT+rwPh8/Q5Bu4NRBl05BTy834knDgzp4qAiBgCxbBcBHTW318Ny2lEEgoGlFiF+imGd0EuclPSxkkcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8846545},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"145fc9299e9a47d4972789aceae707af259f8bde","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.283_1775538152683_0.5426292256954082","host":"s3://npm-registry-packages-npm-production"}},"0.1.284":{"name":"ugly-app","version":"0.1.284","_id":"ugly-app@0.1.284","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e42de3ac90d73298d6fee13a8bc20586625a157c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.284.tgz","fileCount":1621,"integrity":"sha512-4J6pP5NjzGG1yxKU0VM1G5T4goSy9bYUV8lAuepeZ3D2Hxh53+ol4KiH+OWpuzRr6uKTUBmlfZFotEXU0c3p0w==","signatures":[{"sig":"MEQCID7sf30NcfG7O3gOJPu6GfYsCJSgixm9C6CM0o2ZNjsFAiAs47siT/tNkHybu7eVDRHDBpOUDkjJYCekCp19V42vug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8852529},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"4713dd0b913529640890e24d3aba7459d0c6dfef","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.284_1775539635724_0.2945520884585673","host":"s3://npm-registry-packages-npm-production"}},"0.1.285":{"name":"ugly-app","version":"0.1.285","_id":"ugly-app@0.1.285","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d2412008535ebe4e2e96908fa7dea3a763fed485","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.285.tgz","fileCount":1621,"integrity":"sha512-OziRUR3zF+S6PRDWF0db4/FKn16sYHcVvMLzO8+YI6QI2GKkl3iGwxmo+TBUvfvwc3WUxOq1YyULCoMOXgFIxw==","signatures":[{"sig":"MEYCIQDo0CXy/zi3bN7WlQxPbgnnG7kOFAV8e+X2VS/qvUv2EQIhAN+e6xxSv5xa8vvTazYskhGxbA19TZqV7ZCJb2z7KWtL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8853880},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"1ab1763271263f37c6700b20f60342c726b0ca24","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.285_1775542474231_0.1515616486193858","host":"s3://npm-registry-packages-npm-production"}},"0.1.286":{"name":"ugly-app","version":"0.1.286","_id":"ugly-app@0.1.286","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"83868b14d9a19a005b7f70986e6132800a991cf1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.286.tgz","fileCount":1621,"integrity":"sha512-t9ZgcWcQ13PwQgs9vjTxCMANVAXSh70y1iRcZffwfrCzJVsOGP+1zFyMGKQwjKbrN5ARVngPR3mxDd29f4/VYQ==","signatures":[{"sig":"MEUCIQDmtJncO+XZISO0qCUyMhkmYbE1VDLWK4VutDSiaWOKCgIgR1Q4ORaHPMESXNfuwQ8OlZDFukqXmk6YIx4c+Dznt0g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8853880},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6a8056e979a3bf4a73891c153b8a5392f36043e3","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.286_1775542762621_0.17631358239463868","host":"s3://npm-registry-packages-npm-production"}},"0.1.287":{"name":"ugly-app","version":"0.1.287","_id":"ugly-app@0.1.287","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2673f067ad05fb4c16a394547827c2816a11934e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.287.tgz","fileCount":1621,"integrity":"sha512-F1nOYKx+ttD7AUwFdHEZ+JFj7akAypmYbNh7qfHqbgNNU8p8K8CEIcMC4JC6P9dWNkrHHJfsp8cfyqpeQt8ouQ==","signatures":[{"sig":"MEUCIDs9XO3KWJEtX0qHwiS+0T8HKcnf/by9Ft88yT99yemdAiEAowVv/+p4KoiLoAoFGD1lDrvGaYKlpQe7ohoqScVzluI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8853880},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"b0aef57243f5feda282427dc4a10b0a17ce03e37","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.287_1775543014734_0.6292302749261429","host":"s3://npm-registry-packages-npm-production"}},"0.1.288":{"name":"ugly-app","version":"0.1.288","_id":"ugly-app@0.1.288","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a711747ee6d3b94da206a382436f17510e1b1d8e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.288.tgz","fileCount":1621,"integrity":"sha512-f1Y3ILkqcp7AaNVxfZp0KvQ8qzoBzcqqtozqkynpzNUN23aAqxny54OdM9VO1aDp10wn5sxBuZaOEowXX+T6pw==","signatures":[{"sig":"MEUCIQC2Mjsi7gHiSMw/xhdkeuwpKJFzEbHLKS7l684P1W40kQIgXLxnshLzqngTfF06p+wj0WdNYk2G1q53uoWCzMq9zyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8854049},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6ae915664ccebf93339f28dcfbaeeb2771e5bb32","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.288_1775543610337_0.6571541722276821","host":"s3://npm-registry-packages-npm-production"}},"0.1.289":{"name":"ugly-app","version":"0.1.289","_id":"ugly-app@0.1.289","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c298be5de0425ecff83cb93a1f7edd8334f864a5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.289.tgz","fileCount":1621,"integrity":"sha512-Ln0Njd2y1Tmh5ekg37r9GY8fpirswFWW0DYNfmucGdSXCK+Dl4VblVYZNvCPzNkIdTDDYEsxN1D4soPDfrHGlg==","signatures":[{"sig":"MEYCIQC6KE+ZKveMoFEv8MuHIQU0rojDGMO1UUzyns1VNLxDIAIhAJ61BxGgwHXWvarAvHBY+FqfdlO6BmcFF/JHTKOK6lyu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8855786},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e87c0b19bef3917e9293d26114028512353413d8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","butterchurn":">=2.0.0","@types/react":">=18.0.0","butterchurn-presets":">=2.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"butterchurn":{"optional":true},"@types/react":{"optional":true},"butterchurn-presets":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.289_1775577193499_0.36603691491370594","host":"s3://npm-registry-packages-npm-production"}},"0.1.290":{"name":"ugly-app","version":"0.1.290","_id":"ugly-app@0.1.290","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ad26b7786a1aa976a048a3d75d89e4ba52707ce2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.290.tgz","fileCount":1617,"integrity":"sha512-0AebzS8ZHv5psKpFJmFlkB9aYLcXATt0IhZH+gXFW5QjfmzHzhhPZgUpsyMaSooRrHNoKlKvbz9XDyyZPzDApw==","signatures":[{"sig":"MEUCIQCYCQnFm7u6gkJRYNFjqjt4S779BWaYLUPlmoG1jPTHfAIgVQ8hdksMI4AoUkK+in42gU54sLrhZkBpeMhiyxFT5M4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8838224},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"00a95a83bf6cc4e4d37f9ef6474f583c4e0a0870","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.290_1775609522729_0.5733322827266707","host":"s3://npm-registry-packages-npm-production"}},"0.1.291":{"name":"ugly-app","version":"0.1.291","_id":"ugly-app@0.1.291","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"41ca75f83d96c10ce21fcdb51ed3171f91d22628","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.291.tgz","fileCount":1617,"integrity":"sha512-fN1+xSz51ABw8IACGZZQKnP9Q4PterDvYw4We+Qi99WfOsFXJHH0jVV/Gi7uUGPfbgRTk+D4U3P7x0kTN4LzPA==","signatures":[{"sig":"MEQCIDaYLTINtkj2I/2OYV9yExQSOIwtXuDdLDl3bQo9nzGxAiA0tR+EIynfUQFK8rkkamuCHfzd0HpgXaK/zqd9leEFxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8838249},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"254d9c0af00648a99e14515a7cc6476d2fa17643","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.291_1775610241824_0.8383670493055295","host":"s3://npm-registry-packages-npm-production"}},"0.1.292":{"name":"ugly-app","version":"0.1.292","_id":"ugly-app@0.1.292","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"61c5a6512bd7fb16ff0a1fa98a50efed56cab37d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.292.tgz","fileCount":1617,"integrity":"sha512-799Wv/GFz/1DrMMLBTx0XklNoBts0/Lido6A2JP7tndlzCgw4ure9VGtRv0cVFYY84WAivFa0IRVy7HXWoFR3Q==","signatures":[{"sig":"MEUCIAKIC/s11eIk1x0ZA3edPo0URh48Id63rnY7TAJYBGFoAiEA4yTC+l4d6PxXod/hnc2t1hQaXYpKMVVEs6VL6E5eJyA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8839484},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"84e924140fb69698dd5df874b1aa571989e2cd4d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.292_1775612069730_0.19726661157511627","host":"s3://npm-registry-packages-npm-production"}},"0.1.293":{"name":"ugly-app","version":"0.1.293","_id":"ugly-app@0.1.293","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"135cba2eda1bed48fe464593319ef9d5319e84a7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.293.tgz","fileCount":1618,"integrity":"sha512-fT7E1HXvdTgNoOTdyWkO3C8COXg1z668hhjGbtLXWATvZ79n9CvWJGyHFmFH2ouyghOYFeis43egyGiJ4u9CBQ==","signatures":[{"sig":"MEQCIFoakIJoGGqXIni6+MGnDLYg8p4uhqEkPOXjPWA4WGTdAiBnLscJM8IJ0ZTa6XU3j0JVV4sAh7py5ggwaPSNFi14Ug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8844724},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"fcf73c8310ee85ccb464d4a47e841b333ab24d9f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.293_1775618446208_0.7062316185767523","host":"s3://npm-registry-packages-npm-production"}},"0.1.294":{"name":"ugly-app","version":"0.1.294","_id":"ugly-app@0.1.294","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"824d9dd150e2d86bbdc6c04f8e03881b29da3308","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.294.tgz","fileCount":1618,"integrity":"sha512-WDfnHVi4NNVio3O+wz5eEHWAdPXDrQrLrdCIOVR0b5CdZv9fJeBDr8sY/SamRIm11DkOZmXdEFdzm4MtVXqouw==","signatures":[{"sig":"MEUCIQDgrLrp9CnhJsF+cIj3UYwl5BjdI64md+Q5Xl6hiKBn8QIgHLKCF5wd3cXBD5pcP6Z5SjEC+cZEFscF7hvh03zBH1s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8847955},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"85d456c601eb503c588b4f0ca43e7cec761951ba","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.294_1775621731799_0.2555119290724379","host":"s3://npm-registry-packages-npm-production"}},"0.1.295":{"name":"ugly-app","version":"0.1.295","_id":"ugly-app@0.1.295","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0d17e28a34f8e45be739cba119e3f32ec2dbdc54","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.295.tgz","fileCount":1618,"integrity":"sha512-pr9RfHxx6PYU1lwGvQdlSTQbS8phzjNG7fdx79DODvMnusa+Z0PtoTeZ/2Zn0RmxjSyooA8Y19RZg8+eeb2XpA==","signatures":[{"sig":"MEUCIQDxBnqK2CfjhDXEfCSaSlLXotlGYWRPnc+tp8VbFX2PjAIgEKdHN0W+Ka2CJlywFnuTPhZpD6zVfTO7z+lbPaRCW2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8861463},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"08e36f95a9c5ff6a7d6c722b1035f7ea62367ab7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.295_1775623800499_0.9131329022328567","host":"s3://npm-registry-packages-npm-production"}},"0.1.296":{"name":"ugly-app","version":"0.1.296","_id":"ugly-app@0.1.296","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3d5b6994751a2644e320d646c6b928b96f6714d1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.296.tgz","fileCount":1618,"integrity":"sha512-UNMXE+dhiPCl1OYyKWdkRN9cVqayfaPBMF2Tja7UnAAe1Xuwstl2ctVQ3ghyO6qPbvBNZF8eTkJKvbmrA0uJsw==","signatures":[{"sig":"MEYCIQDFZ5VJrj3EXlC2GrP0JTNDXTZLoDYVIMQG6CKviC0mDwIhANTioH2KXxb3eIzZNDz1PcGDLIExYbDN28fNw6I0HOEy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8861463},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"6f162be2b002dd922af4647e9af0473f2e3dc101","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.296_1775623982305_0.17886146620005738","host":"s3://npm-registry-packages-npm-production"}},"0.1.297":{"name":"ugly-app","version":"0.1.297","_id":"ugly-app@0.1.297","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"102953744b1f95b4489e0a543e559f5508a5c2ca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.297.tgz","fileCount":1618,"integrity":"sha512-JNfD4W9rjQ5L3g4AQObhwwExC4bqx5+APkOkZOTsgQx/SMV1M7eRURDmW+Arnd2eEVMnqYH5dsUDVnjZcxpfEA==","signatures":[{"sig":"MEYCIQCeVGwr3GMiii54eTXJpOVNZZQ5gXebp0UWiD9L75nRUwIhAMULIzdN2FawrlpLaO9BNTBJ+uh8U8z3Rt2sUN0O70cT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8861629},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"a3062f9b60082400fb73db5ca6eecccf2120e5e5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.297_1775626535041_0.34027687209081003","host":"s3://npm-registry-packages-npm-production"}},"0.1.298":{"name":"ugly-app","version":"0.1.298","_id":"ugly-app@0.1.298","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3b268711824eceb3b3e5987d48a6641d6cd0a250","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.298.tgz","fileCount":1618,"integrity":"sha512-l5dzMwrw3Y/BBSqZl+tra3jl8KLqiWshdshmDGurYTGxzn2pYlFZfe6BNGiMKhHPhvAuUDXR1FRsS92i7RxfCA==","signatures":[{"sig":"MEUCIBle0MmLFvXo91OrzNgmw7uTIXe4kCl/q9KOVfYzypI6AiEAnMaD3D9PuncX5uKqEuS97K5ah8DibmlpB8wxkMnPp5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8862007},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"720510e6227edff362d2a52771d2c0a3885211e5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.298_1775628158246_0.41221486976133104","host":"s3://npm-registry-packages-npm-production"}},"0.1.299":{"name":"ugly-app","version":"0.1.299","_id":"ugly-app@0.1.299","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"06ad250d8272cdfe32c53123f3fb4f2769539912","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.299.tgz","fileCount":1618,"integrity":"sha512-LyLV/ZEL8bDJQeOStGjLEeCYeo01VyN2ZdJ//GkbozJJiTzGVItbgrOPbHK7SlA7vGOQXnVxyXL6qJF5TF4WvQ==","signatures":[{"sig":"MEUCIHjcr5efPGABPo2FX7HnQFivuy7gUYWnj9UnSpUJ2h6LAiEA/X5v80sIgbakh5bxOkYI7Gbwamer6tp0HkKsgB4gLZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8862007},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"9db8588fdf0ae3bf714ab0a4a3d267ba2da8a9bb","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.299_1775631288897_0.27868697080264826","host":"s3://npm-registry-packages-npm-production"}},"0.1.300":{"name":"ugly-app","version":"0.1.300","_id":"ugly-app@0.1.300","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a09e6275d81cdbc84dc4c344aa3afeb35d85e215","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.300.tgz","fileCount":1618,"integrity":"sha512-kkF5ceJs7BNXlguLj5qphoNeXBTSELsx3c8ZnAzOT/c6KEKcOe7Th66nR53/q7Mr5X/fclEvjxbeTQeWwT7Fjw==","signatures":[{"sig":"MEQCIClOGNiavgmdWmVM8OhyckoYRlZxdNKxzD/sitET6q3PAiASZSwX/p+iPzfZ61P7SgFElg7kwHL4CMAnZrNMsB4opQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8864246},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"ac9634c9e8e901ed7467589f2ec667fb2425f1b7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.300_1775660655845_0.31698537259270565","host":"s3://npm-registry-packages-npm-production"}},"0.1.301":{"name":"ugly-app","version":"0.1.301","_id":"ugly-app@0.1.301","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"15c19d9169b51b1649b88a93babc03596ff67bb9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.301.tgz","fileCount":1618,"integrity":"sha512-as16NPj3hH9NjQA1S/CVS3eLK7KGL60Uwv4uvg7GMCXP5Hrgxhdoiezyu7Gs8B7Skszj/pFbbykrSOHxptG69Q==","signatures":[{"sig":"MEUCIBddHlVCRyOaHu3d3rXgYlcBP5IR8CYBwFcaAu/AIJmGAiEA+qil6V10+uzTpQ1CGmCEKQdKBiXYUlBQTcHC3SbAqFc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8860568},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e0c58b788f6bbad24424d8802b1589100b5876ea","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.301_1775660851585_0.5407887578057982","host":"s3://npm-registry-packages-npm-production"}},"0.1.302":{"name":"ugly-app","version":"0.1.302","_id":"ugly-app@0.1.302","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e0f856a892139ac291713ce668c00b1c63a38d5b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.302.tgz","fileCount":1618,"integrity":"sha512-eLBSnjNzvZpTfbmswA5tLjtVbtH4kfnEzWxdDpN6DuNem/06F4fO0hbHGlK/blbgjNyhkBcjnNnGfiiTs6SYTw==","signatures":[{"sig":"MEUCIQCYfx093OUmdsx7a5soQoYS1nzL9E6BYnnTyYuQBC8zaAIgVriJOmm4d0puZ1Xbd6AQPEWoH9M4/64szdxuZtjPojw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8860568},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"acc3f46441acc4e3daa6b94f2a30d6f44815cb8e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.302_1775661986731_0.47164028730244834","host":"s3://npm-registry-packages-npm-production"}},"0.1.303":{"name":"ugly-app","version":"0.1.303","_id":"ugly-app@0.1.303","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b03cba3835227ee1f479b18ae4d114e56a1b5419","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.303.tgz","fileCount":1618,"integrity":"sha512-MfdrqXfgdQpny4W5E8EVSVMzC6a2rjbH751/n2uybWuroeyol0Fs8YEyW50G1WBlezGAzasc8vYy4BBw1F2leQ==","signatures":[{"sig":"MEUCIAVQQneX+X4KieIKmwMwKgWGC1T3UrYRiWbvdMLH4xUeAiEA3g5ymqNnJbhHM5WGq2zoubeh2TY91Bdf1SeZsFSk750=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8859548},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"2690c01ca0d09a1863819034c429cbd078791fc5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.303_1775662553989_0.28931687476713996","host":"s3://npm-registry-packages-npm-production"}},"0.1.304":{"name":"ugly-app","version":"0.1.304","_id":"ugly-app@0.1.304","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0df4524822e1356d43507a10e74c14014a5a044d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.304.tgz","fileCount":1525,"integrity":"sha512-iLnT+buqD1g6+tDbpwr6fJXAEzCnd2XbJi7zEznAKsiXzZaFosIjXPD00UyutZakWUWt1qtCXAwJeqvCNndjew==","signatures":[{"sig":"MEUCIQCJsoGgqiGm0gf4JIA2YyZQx38TfNvS01zT5+omSmndUgIgFAfW1zo1z2Dl2Ev15cguEEDrQ5znvplHxf0h7al/fTU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5125762},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"da555e1f8937342caf60eb9aba4581a02aa6d139","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.304_1775663421224_0.0775745907858747","host":"s3://npm-registry-packages-npm-production"}},"0.1.305":{"name":"ugly-app","version":"0.1.305","_id":"ugly-app@0.1.305","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"85835580cded51f32e454231c5916fad0d4cd2bf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.305.tgz","fileCount":1525,"integrity":"sha512-qZKTNrpdjXWzduN0mPITgKzbh0K8JNuAPIyDdrzD6BJi5STHotiFb1YvPwfl7KxtrTJseTLTz2RpNtqUDX5EZw==","signatures":[{"sig":"MEYCIQCW0brc7eBAX4FmAUM+5i23u/7CNBSBMSUqazFhvwR+ygIhAI21HUunNKvGw3vfYAO60flHHS/itNZD35D7gnI/XVjq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5215399},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"65b663a1f3e4f045559894f91973b3b7eecd6afe","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.305_1775664571670_0.4501247384529592","host":"s3://npm-registry-packages-npm-production"}},"0.1.306":{"name":"ugly-app","version":"0.1.306","_id":"ugly-app@0.1.306","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a06df105c72bef86a572a7fd10d70de7e97224c7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.306.tgz","fileCount":1525,"integrity":"sha512-dD2xEbg/VDukDiBDBVdqf77ySfFmEr3RUhHQ9N4o+zVeQGZForuudUrbwLdA4dzYa0wJ4GtOcs5nuhLdyYdXbA==","signatures":[{"sig":"MEYCIQDDGJ6AuL2tJF6iB7riebp7/x7Wc6+P2s8HVnv9o5I55QIhAKLpZicgK2T+4yEg6qTXp68xHDbIzjjs7BKRrQ112o5R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5215399},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"f937ce7212d26be5c13f648fae3d8b534b87aae6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.306_1775700387593_0.822849626132377","host":"s3://npm-registry-packages-npm-production"}},"0.1.307":{"name":"ugly-app","version":"0.1.307","_id":"ugly-app@0.1.307","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6d40ea997de1505b755badb18383bb14b02e9341","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.307.tgz","fileCount":1530,"integrity":"sha512-xOWLWSdGRqTIL6I/VWnGddirt1nJ7CgzHnDcBF/ZVDb7v7X/evWvWBIPNkD91yjns3431dGFECAwud+fMv1EIg==","signatures":[{"sig":"MEUCIQDGxfgSmBG6Pgf58HopISIWJRlrGKEYIDHNiisKyhYF8AIgKurCvHM2I51Z9WK+q2p7KHDVGIRk02/LS1zIzX0viqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5257083},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"b013873447d672b55fda6649ac0062f8d56e5649","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.307_1775705033368_0.6691528745124016","host":"s3://npm-registry-packages-npm-production"}},"0.1.308":{"name":"ugly-app","version":"0.1.308","_id":"ugly-app@0.1.308","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b77dfa051fc4ab743abe0803d799b1e30117e24a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.308.tgz","fileCount":1530,"integrity":"sha512-wEjjKvSryThnCMy9Q7XydBpniK6LYpG9U9cEZncxjuZS4pOhsI3X48FGt5R2kb82kgfhJz6RiapyU4s+Xlcwzg==","signatures":[{"sig":"MEUCICq5OWg0rcoT/pKn5cg3k3iF/Q+YwGslgMdyH+QkAibMAiEAgoL7FArerkaU/O9QqT83lxkd6mndrGnfBHwcBx/6Wdk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5263863},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"b5056f4efa3e63272c2e195623186275400b15d8","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.308_1775712402035_0.23196488237089574","host":"s3://npm-registry-packages-npm-production"}},"0.1.309":{"name":"ugly-app","version":"0.1.309","_id":"ugly-app@0.1.309","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c7e39629657c68e7f57ec9afbca67da5f950854a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.309.tgz","fileCount":1530,"integrity":"sha512-mWNN0FhZoTgao212kfoUqYmKHc0blCUZgU220sxXlvgdDNgaRkvfHeE2R29oa32EKnOoHxFWQocnxrfZ0hwICA==","signatures":[{"sig":"MEUCIBGkDzk1TssgovUqdd1Zz6sunN4XpCMq6XU+muuTM4iHAiEA7aQhf6bwwmEEgRPRICZJCSmdgfqcOdKLXRoYPsXH2hY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5263863},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"4584f5875ebe9a0f279bdfa2dc7f200e2b09ae7f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.309_1775713325886_0.9623962266459414","host":"s3://npm-registry-packages-npm-production"}},"0.1.310":{"name":"ugly-app","version":"0.1.310","_id":"ugly-app@0.1.310","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2e0b3079eb82ed684aef7bbe3842786e3dbd96c3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.310.tgz","fileCount":1530,"integrity":"sha512-xAWEPko3tvmxx0gm3qQi/bsaPn1EMHkm3GUcYukBA+VnwHaITja/ucab+tO/VBhsxwkExEFjAxDHzsh2RRXb7A==","signatures":[{"sig":"MEUCIQCf2lKzeNgQw1cUSq6z70jy2ymCFZKV2p6UvbJ9h/95xAIgfBrgmAVdZicfq/pzjihkwgmdM1VL6ogTE5HvHiQXjXM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5263863},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"826b2d3042cda50a3bd38446dcf04142cf6641e9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.20.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@qdrant/js-client-rest":"^1.17.0","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.310_1775713367153_0.16587834353494202","host":"s3://npm-registry-packages-npm-production"}},"0.1.311":{"name":"ugly-app","version":"0.1.311","_id":"ugly-app@0.1.311","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f7797bf19e14c41217b6c31b66ae1fea37ab3f13","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.311.tgz","fileCount":1521,"integrity":"sha512-cgAXRpyg6ksrB1JrxhipBEy43xp8M8dJGaIij2wtKjOnXYg+fAB9X0w17RzFzKZ/Qj5XYJGvHAFDq3S4ik3svw==","signatures":[{"sig":"MEUCIHxklDAllpL2teaEwgNbR0VHfMkfHu3y1oHroPV6mrCUAiEAyAO+Ae3gZQYrVLIb+bPj5mARHhgIyAkSlL27FQq1A0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5221630},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"87c06397f3e9febb75cf93bb6b7d985db9deea77","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.311_1775714730064_0.21540009573973196","host":"s3://npm-registry-packages-npm-production"}},"0.1.312":{"name":"ugly-app","version":"0.1.312","_id":"ugly-app@0.1.312","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"89a510b6899f82fa528d39efe959e7e4e2aba893","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.312.tgz","fileCount":1521,"integrity":"sha512-VGMHVyLgD6snm4jABXPpV3xPEjljTdARgJry9GT6+bA2tOWztpcAFG9Hd5aB/Sjjq988Gd6WvHAKeUvU1bnsMg==","signatures":[{"sig":"MEUCIQDU8gE7K/oYdAsz9/BaqcAd6JLfHb2W0BTLQ1bI0xhxXAIgMm2yGkYDjOdbYiPY+u+F7o05H5lNjClJU3XIG036Izs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5221267},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"5ca5c70d8294aab6a53d6e8196b86490b12fe7a6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.312_1775716960498_0.44327720696011474","host":"s3://npm-registry-packages-npm-production"}},"0.1.313":{"name":"ugly-app","version":"0.1.313","_id":"ugly-app@0.1.313","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"30f20ad7af80f22886a7ad221ad1c7e0f95e11df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.313.tgz","fileCount":1603,"integrity":"sha512-C1DGyC2uLlOn6wOI/Wh6e6y3or6G96iTP+HeHTsg751/zUCNNnoEBu77t0i5SO47B3bimS6y5KxLumqyUonMsw==","signatures":[{"sig":"MEUCIDkOgtmNZjKoQf4+jXv778f335pJNgd8WL+84Bg8gOV2AiEAgSaPYpVVo4bt/KGWwA1v2djSwcABppkJrKjffS3QCss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8423042},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"d115cdff9b710cd6deb5b4a1c389207b3d3b108d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\"","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.313_1775747277971_0.41263082884967184","host":"s3://npm-registry-packages-npm-production"}},"0.1.314":{"name":"ugly-app","version":"0.1.314","_id":"ugly-app@0.1.314","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4034f15781cea8206e8ef8c7ced76a7b90d57d4e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.314.tgz","fileCount":1307,"integrity":"sha512-W6C/XhZPIk/mcn8cbVF/19A/B/XHgqUwddPOxFoRIti4Bb9LP34qXmIxuU6rH59R/C6PqlORh+lOMeSNZHNzZw==","signatures":[{"sig":"MEUCIBlmwxAJkSk+GinfJUN8ESxT96VR8f7DzkWhXFz9w3hTAiEAsF84jUEGIf56JosRpC9o+LkrarwPdHbVG6Ou0y1ttHw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7537383},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"1a41c71c6297ee894adae6b31bbda03a6048fb9d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.314_1775751253259_0.5150714776941698","host":"s3://npm-registry-packages-npm-production"}},"0.1.315":{"name":"ugly-app","version":"0.1.315","_id":"ugly-app@0.1.315","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d6703ff6d19b90d491681ed26d9bf46707a02a6f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.315.tgz","fileCount":1307,"integrity":"sha512-D+qZmFyTYsL8X8/v1Y7XRCDQbEMLWA9BBxPwDj/il7+FZFvINtyZNirn0lfkn12GsfZiBQgLTfMyZw4zCZmUhw==","signatures":[{"sig":"MEYCIQC7JnBw0sqx8AR96UpKNX38bVB8p/Zgo+Ydf9KS1YscpgIhAJKuPQ6clZwjKlehTxgBwTURXRWP79qOOrkHf3xP3yMy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7538635},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"738f9315d6a5cc8b397a6e475634b95cd89497b0","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.315_1775753323627_0.3461091123143234","host":"s3://npm-registry-packages-npm-production"}},"0.1.316":{"name":"ugly-app","version":"0.1.316","_id":"ugly-app@0.1.316","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"239a86c1db035b20f60c9d005a46db7a713db333","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.316.tgz","fileCount":1307,"integrity":"sha512-VKVvuf+934v6a6Prg/6u/ZeAhMBP6WHP1kiQbzzsF4cG9dfWMT1U/jLCdp9sudIRlMF1BNsoln6+ROkPKimzSw==","signatures":[{"sig":"MEQCICmmOWEeZY47eGwjmafBZ5RMXwkglzy5Wq9mMSrAQYvoAiBrBmwUKLqB/8UBlwCsGaia2IkBOVfvrUhlIFBeA0wTQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7538635},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"68c5a2c1aa5886622ca4c798725edbba6ff71ab7","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.316_1775753701005_0.6555814521719583","host":"s3://npm-registry-packages-npm-production"}},"0.1.317":{"name":"ugly-app","version":"0.1.317","_id":"ugly-app@0.1.317","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5db19a0b8e2967a4779efff7cebf55a7f3361956","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.317.tgz","fileCount":1307,"integrity":"sha512-uQ5vAeCG7nIZoysYvRFfU3Qs/OfM/QGW1kCXxciR4YxkbhrnwkgN32z190E7O6/+6TGSf3CZrFOd+ZVx1b2jsQ==","signatures":[{"sig":"MEUCIQDWZVbyxdkGjKM48UVsbKwiQ0elydzEtXu3qy/WNYixKgIgIMcXaZiZu4+KLL8m2jCVKls1jzj3AA19ocUurynjxS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7538215},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"9995b8ffa2e2a92170ccb1862bd4ac40e11481b3","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.317_1775777926854_0.6810216025926341","host":"s3://npm-registry-packages-npm-production"}},"0.1.318":{"name":"ugly-app","version":"0.1.318","_id":"ugly-app@0.1.318","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2975c96fca0b5105c44c520d3499cded88f2540d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.318.tgz","fileCount":1307,"integrity":"sha512-TWxRqElF2iE/lMD7uRPKrKq1YP4b5gjq+ltZh/KpoZqnEaE5oeLmn91nEYNOPGYqlTYuPMqKgBJA/TCdE9wVvA==","signatures":[{"sig":"MEUCIQDFCl+zPgzKYqQ004oasfepVx3eKEdfbQ2r3n6KVbvYNgIgC8MtB0Z2yLISc4o8sJcGDjcTXAz/s8sCTFR9nhvq3P8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7539185},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"da45f51d3e5bdcb4a2cf57332d3b7f6bb912bb9d","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.318_1775778783317_0.29965306931496105","host":"s3://npm-registry-packages-npm-production"}},"0.1.319":{"name":"ugly-app","version":"0.1.319","_id":"ugly-app@0.1.319","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cad6a29f61f5febfea399547ec7aae09b1f6cb3d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.319.tgz","fileCount":1307,"integrity":"sha512-SPcHvv2+Jrr7Stvr/sutBj60I2lWeAkDpiunhbfOTDR1PTZZh5ADzYgD1znWleb6t1FizmJdBJoc3BRvyJKfqQ==","signatures":[{"sig":"MEUCIQDq6D7/3YJgKlLfymR7yDp9kbmnmMNhp61L3I/W/FhjiAIgHg9TIXSbhXywCoZgShRXMzYB+8EEbhuRHmA9rs+o2h0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7539143},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"03eac256a3611bb7052b379b7f21f8634640f34f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.319_1775779011721_0.22402248875770003","host":"s3://npm-registry-packages-npm-production"}},"0.1.320":{"name":"ugly-app","version":"0.1.320","_id":"ugly-app@0.1.320","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7352550c3feb65a2da0cd3577022a7d4aaa5fb6c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.320.tgz","fileCount":1307,"integrity":"sha512-ZG+lw326uAYQqpOXvueBRJza9WF+7+4mskX9Kfnuex1z1FK1jPlG3wohe8cBeP1hg6ANRRBTzkcKK0lHIehPtQ==","signatures":[{"sig":"MEUCIQCdl7mPW/fhglcpvglKv7pEqp+cZtHWq2k074+S7gd1zQIgCnRY7OfINfL+xN3H9YyBp1diMdMRZNcOP+5Q/xBv7AE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7539143},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"62a565ca78827453b88f2d4e84f5b80bb229ec91","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.320_1775788212559_0.6549763434043305","host":"s3://npm-registry-packages-npm-production"}},"0.1.321":{"name":"ugly-app","version":"0.1.321","_id":"ugly-app@0.1.321","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"67baed32145212099055db94c525e9f1086ade7e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.321.tgz","fileCount":1313,"integrity":"sha512-0XoZnFhDirWR92BAIw9iJtQgC2UqRuxsL4TdV1HsQtpFnwo+hAvX+c+nqNk27FHcDHyRwJYg05qaLlPWXJisug==","signatures":[{"sig":"MEYCIQD/LQlgQLyiXdU8MNtKznjdbGwToFTDKwu53se4IBEgRgIhAI33Cb/8HCtDoANmkoq/MHQh4yTLus3JMme5MXTaVouw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7559550},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"206dd67f16f738b232de3f3caa217e28deb70063","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.321_1775834917632_0.6908637234065009","host":"s3://npm-registry-packages-npm-production"}},"0.1.322":{"name":"ugly-app","version":"0.1.322","_id":"ugly-app@0.1.322","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cc997de361b3e49e161420b87e1cc1c214d2cd2a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.322.tgz","fileCount":1313,"integrity":"sha512-EDl9NiEMS6lS3J2q+Sb2+QB+e8OU1uU7kBMP9vKtedjANYgJrzkys2kznoddOtsCfS0ap7iaJdym0weUtdJVfQ==","signatures":[{"sig":"MEUCIQCheS0pVtqBxJiMZeMZjocnQ24TlHFfGXSeH2ARoBJonwIgCEKh4gZwSjeXOiid35+/46i13H9kpM6vkoxzAdp82XE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7555281},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"dc64c5c982ce1dbc7b17e89e0a605c4fe08c83ca","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.322_1775840191231_0.08317738895163429","host":"s3://npm-registry-packages-npm-production"}},"0.1.323":{"name":"ugly-app","version":"0.1.323","_id":"ugly-app@0.1.323","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a53c5f69e7f9e4dcf590e281632e4972b6ffa029","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.323.tgz","fileCount":1318,"integrity":"sha512-x1sHBSJ9ljpz8zbpcwL8EchmBuIFRwPzJV+V+8IkJmVmSKcYqy9bpBA3Zj89K/y+qLtfSbUh+4mefBPzuDhJqg==","signatures":[{"sig":"MEQCIB2FgokAdJNm6EAcnmwWYoPjj+/X6igNP+Rl7mjiPSLHAiAnIB3lVjEPJuvOjct3UDok+6npioWxlu4De8+X73zvzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7572333},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"9add1e0d948f21c998b6fbd5133b882a6e44f325","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.323_1775841184736_0.7264392395005081","host":"s3://npm-registry-packages-npm-production"}},"0.1.324":{"name":"ugly-app","version":"0.1.324","_id":"ugly-app@0.1.324","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bc71d40896bea8e79d20980abfba5562bec375bb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.324.tgz","fileCount":1318,"integrity":"sha512-kaJSOoL7soQK/u5GmLmC/lE+heTukJTwXt05awlVWVMJT/rUEIcsz+15Ax295zO4PQVrQTM2G178xStHBKSLaw==","signatures":[{"sig":"MEUCIQDogqkRxk8uss7Rz5tWYOHhgFOFmg9aHOu+d21+fQW0zQIgQJvupZdyFl85yTrVUG9H4obD/jSZYBcS8sRm51nb/vo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7572587},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"47d308d6051b4f67f30dc45ca9d5a98455d319db","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.324_1775841505401_0.08033131770870527","host":"s3://npm-registry-packages-npm-production"}},"0.1.325":{"name":"ugly-app","version":"0.1.325","_id":"ugly-app@0.1.325","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"35ad6aebaa63d5d0d0fd87da27170867721be26e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.325.tgz","fileCount":1318,"integrity":"sha512-sd8JaMclmcBbDLKUcdpliFauviiAapYiO0HBlEOmYa6flgp5Xa4E+HXvf3Bl28Oszbqr4G6hcBIDOp+w0Zb1IQ==","signatures":[{"sig":"MEUCIGfV1LrwP2WqrzRV4Y9GJcS98lpognB78HFA4aBvgmu0AiEA+2OiWR+Y/hHqE/605gt0pZuL5cqjlKRQP57Xwy2kM3M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7572366},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"e0e6fcb1e7e2aba6738f99371025d7b262903cdc","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.325_1775843834413_0.7278127174209588","host":"s3://npm-registry-packages-npm-production"}},"0.1.326":{"name":"ugly-app","version":"0.1.326","_id":"ugly-app@0.1.326","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2f2a9a59c3e8c39de0ccb1907b2635d7ce6fe9fd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.326.tgz","fileCount":1318,"integrity":"sha512-DfIp97I+3dRvLBDd6BxeOOlrTo5wqw9qAPJuon0Rb+8sPyd/JSgS0vHAZiwUg/3Ev9Vl97y/8WP4LTJmZy4HyA==","signatures":[{"sig":"MEUCIQCslWA0RYqYtrKtWWFGu4t6xpMSb/3JUIjz0vko0PEwtQIgAnf/7XiG3dC8K+0gQSs1hFNLObwKbcnMVzzm3O5hKhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7572410},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"cc604b7a23e6af5d7d9556db4062f22959ebe8c4","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.326_1775862312784_0.6004551301139682","host":"s3://npm-registry-packages-npm-production"}},"0.1.327":{"name":"ugly-app","version":"0.1.327","_id":"ugly-app@0.1.327","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"98e6cd02861d791814f841a650879fbabdf4895c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.327.tgz","fileCount":1318,"integrity":"sha512-VhKL0UWUSDBu3UzqQjGdybRPM5m0hOYHH+HG2fgHnsjjE2txJwld1JCMdmRiq1w1XOnKdbivNeDCXkjVOIGuyQ==","signatures":[{"sig":"MEYCIQDHzA0G1J+KxMzagrzqR1cp/bGCWlLJjMp9MXKdPhTogwIhAKaZzaOzpW04Nse9fBXuYTlxd/jvtUUGxdaqvAE4eDLW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7566528},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"674957d4b84d6a257f214250c0d1caf01ea3b06e","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.327_1775863015675_0.1779108371617164","host":"s3://npm-registry-packages-npm-production"}},"0.1.328":{"name":"ugly-app","version":"0.1.328","_id":"ugly-app@0.1.328","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1e8747062e4c0727691aa33a932f0f8b5097807e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.328.tgz","fileCount":1338,"integrity":"sha512-hrNXYVCnGvOyGQ1e/6zyDCh7ewbdahm3RFxmT5J/rtcm8ewB7OwPGR49NF/BtRaWfNgI1LctnbAO5IkPVvD2jg==","signatures":[{"sig":"MEYCIQDg2ikr5Ce4+2MdlVh87FI4ANxOr/K7tKNNgLNLp4rpTwIhAKdfkeM4l9fvzBTN/uTul+68xqVA9tcHbumD2CCubLqq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7623548},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"7203304fdfe298eb862dbf2f2eeed30be4efdab5","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.328_1775866463723_0.8943276106609741","host":"s3://npm-registry-packages-npm-production"}},"0.1.329":{"name":"ugly-app","version":"0.1.329","_id":"ugly-app@0.1.329","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d8b2318f7239ea0cd3bb763adac9f9c4875a1921","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.329.tgz","fileCount":1338,"integrity":"sha512-HF7jhT7I89oOiB/WZa9T5i4km8vQTjPCmUk/Va9sFa5LyCZ64H5tmDY2wunw27kxn95/qN2MUA8l7xZsrPUWUw==","signatures":[{"sig":"MEQCIDc7pXgZ5ouDMtVjByQuJ3dO7Sn03j+Qm3xjL5osid7ZAiABphgV7slXK7FFUGyoG1Iou7j3J6JYRK38RORuKt5uWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7623655},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"f327e5b23cf3564006c51546f3996c98d983baa6","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.329_1775866863264_0.5310237490756164","host":"s3://npm-registry-packages-npm-production"}},"0.1.330":{"name":"ugly-app","version":"0.1.330","_id":"ugly-app@0.1.330","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eeabe41643ce63b66d850c3179d8236eed151101","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.330.tgz","fileCount":1338,"integrity":"sha512-13Hwc70PmCTGckoAqS3Toc2sFiZt+2A97s2Xlw0cy+wk1X2ih0rBYPpV4wf4774HteJdzm8Xm60FiKVBenVb7A==","signatures":[{"sig":"MEUCIC2kFOMqvPr4PR+vMLrynQli5wdXcFcjI/Xy1bVwoP6yAiEAvFeKmn3WxDVZ3Wk464E0dn6lEHszVsDgQV7V0fh7KE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7624203},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"2eb6f8346dbea6dbca3d53c272251952f6034799","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.330_1775867018058_0.21177999455993013","host":"s3://npm-registry-packages-npm-production"}},"0.1.331":{"name":"ugly-app","version":"0.1.331","_id":"ugly-app@0.1.331","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb356d1f8c937ab2c88cfbd86ac10c8935afb065","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.331.tgz","fileCount":1338,"integrity":"sha512-5V7LZ6ftRhAHODPRZnEIy3ud+ZuVWQJvFkkZQpOoOO5RWp8mS51zGBMymF0H9LNB3vHJmN6xxRckuf5nkm1WcQ==","signatures":[{"sig":"MEUCIFFhaU6MPCkwuuBgM1XOQ+2dlg+fTXq4oxXs0UnjR6/uAiEAm0Aw9niPf7UIWdJt8fqhvpqKxieMBWaBI/bsM0inKQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7623717},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"cb9a09242b6d5b5056ccdee626152122088ce8b9","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","@aws-sdk/client-s3":"^3.700.0","@types/jsonwebtoken":"^9.0.10","@tanstack/virtual-core":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.331_1775867151213_0.5578409823629671","host":"s3://npm-registry-packages-npm-production"}},"0.1.332":{"name":"ugly-app","version":"0.1.332","_id":"ugly-app@0.1.332","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6eeb94a82fe0cb0dec85dc1484fb6e1ff9690d37","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.332.tgz","fileCount":1285,"integrity":"sha512-xuwss9cF2eEzYvzfor9QQ+MOLTLoeeNt0e09KWwHRGYQC3hrN1Hu9vCFDdiMzGfO5okJkWk6663qaobsXn/yDQ==","signatures":[{"sig":"MEYCIQCmV174wuN5OdGJ6COEYkVDFtluQXFVCPG1RKbRTaBkoQIhANJK9mzjrssrbQmSU9YJ1rNqnSDPKfzRhT7LQKvsy2Su","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4504182},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"239ef68afab0daf703f2c041379a0d5d2850cb43","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","fs-extra":"^11.0.0","commander":"^12.0.0","lru-cache":"^11.0.0","handlebars":"^4.7.8","html2canvas":"^1.4.1","concurrently":"^9.0.0","jsonwebtoken":"^9.0.3","cookie-parser":"^1.4.7","mdast-util-gfm":"^3.1.0","canvas-confetti":"^1.9.4","onnxruntime-node":"^1.23.0","react-datepicker":"^9.1.0","hast-util-to-html":"^9.0.5","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","@types/jsonwebtoken":"^9.0.10","mdast-util-to-string":"^4.0.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","mdast-util-from-markdown":"^2.0.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.332_1775870064340_0.6389283665898149","host":"s3://npm-registry-packages-npm-production"}},"0.1.333":{"name":"ugly-app","version":"0.1.333","_id":"ugly-app@0.1.333","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a88dd10702c92e9eb11a5414ad01827f5fa4914c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.333.tgz","fileCount":1550,"integrity":"sha512-0v0CXS/pnMQcY3S54lvEGwnrY/TvhFxgN/TdNmMRxxy5OnEh3YsfRCOcbOLv54n1oywmsU2dYhv1pvjwiMnv5w==","signatures":[{"sig":"MEYCIQC1864YeFcaopeDAGtvkSQSkDf8O+xvzQlFDGbUtVNbgwIhAM31e/p5YHeYo/ZsZlcEfxJVJcbKAkWZafBFYVrQXo87","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8950373},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/server":"./dist/conversation/server/index.js"},"gitHead":"2045c015c3f42158f73d009fe0c6e1f968c0c94f","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.333_1775871733670_0.2546271516352665","host":"s3://npm-registry-packages-npm-production"}},"0.1.334":{"name":"ugly-app","version":"0.1.334","_id":"ugly-app@0.1.334","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2560b71d4f9f07958b7cff6d8674460ef342fa01","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.334.tgz","fileCount":1610,"integrity":"sha512-EVKSXJNsAEMMk+rCXrWrtVLCtFfcFEFT/JuIq5bFIqwdZeE2Zn/abnQxTR1cNi514HAOpClqSHZ0g8Pb994D+w==","signatures":[{"sig":"MEUCIQCNHfWd5Rpdt/BDOpgZy7vXYIRRdtjdgxXCkESWmx/5cgIgOZHQccUqgI11U5p+6sZmkJpUflOXaH09VJTW9/SPToY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9026971},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5c51ffcb33b21482fb4ff23facb2fabebc180a2a","scripts":{"test":"vitest run","build":"tsc","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.334_1775872160757_0.5662691969411375","host":"s3://npm-registry-packages-npm-production"}},"0.1.335":{"name":"ugly-app","version":"0.1.335","_id":"ugly-app@0.1.335","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8a9c47f3de7c07b5be72a90faea897b033ab8eee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.335.tgz","fileCount":1613,"integrity":"sha512-B1qjEhYM2VvUgx84z3M5lki95q7jMmJJcXMuH/k6da91mgtHfdFjiB6axZ1AzQygM6Jf8LVt8PRfBkgtdEv1AQ==","signatures":[{"sig":"MEQCIBE2zZnOuhN2pRkCLeIJfASbSD55gWgqLnsDtNxPo5z0AiAj1dNvUOeX3aI7fPFQz1MZgHB+f5TaRsEJMlztowJDfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9080556},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fe5bf8fadb5c8bb3d3b5333d096b9a63a33b7845","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.335_1775872596556_0.2664857763100319","host":"s3://npm-registry-packages-npm-production"}},"0.1.336":{"name":"ugly-app","version":"0.1.336","_id":"ugly-app@0.1.336","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c877c77c0735fec07f7ec5782f39aaf61e9d33f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.336.tgz","fileCount":1613,"integrity":"sha512-yVk7T/mwlWX7tQQyoa9Vh5u+UYmJYvdXf6n7P/Yek7oXj2JMioIar7rF1QhhWTer9PGiyxyVb4pI8kjA+PzDXQ==","signatures":[{"sig":"MEUCIQDW+6i66Z7dqs2XuSghihzoBpHwAA3yKrxtv58I3QZkYAIgT4NlFp2WixppJ2Q97DJBvW0XN25Xnn/zddE0P7Rekjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9080556},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e0e6390e854e9ee55f7e9d1c9e5b6b5cb5f5b5ad","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.336_1775872766265_0.12831070171681813","host":"s3://npm-registry-packages-npm-production"}},"0.1.337":{"name":"ugly-app","version":"0.1.337","_id":"ugly-app@0.1.337","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d27dc0ee4582890f54bd048a5b450d62fb91142","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.337.tgz","fileCount":1623,"integrity":"sha512-7z2p0CIKEODnQhvKGxSEyrc6Sn746xhW/h/tFex/AgSXNj5VlxH8pSdnislPjocSA2yC1lfKWqts0FGx9zpJKQ==","signatures":[{"sig":"MEYCIQDjMTQAjT3howH8W87ET5Mh45k1HKpJZLjX11ZnVa6J/AIhAL2TX4fxGbfY/sCz6NsR/y6lUaNrANgCTTqRfIFTiy1H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9143049},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4aed6a075c2147fd9c83584702229e07b7f65181","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.337_1775880556136_0.49565208946290706","host":"s3://npm-registry-packages-npm-production"}},"0.1.338":{"name":"ugly-app","version":"0.1.338","_id":"ugly-app@0.1.338","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2dc8d7e34695f71b1bd62b74dfad5b1f4453655a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.338.tgz","fileCount":1628,"integrity":"sha512-4TWJBnpIJ3BkQY2QKXmuypJ3JL87T16w75vPDf6m3U2kIrc0YmDF8ahFKP8HeUr4rinTS4Ar9wIAeXVALk8oGQ==","signatures":[{"sig":"MEQCIC6fzrirKinypiRcwl2BHASvaRv+kvAcqLr0nfhgZeNuAiAtsqMtpHuuItBKUhqbfFo16uYtYgJdHHmp6NRYSz8K9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9146029},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"77affe24e70bf9bf1c830d8be42a31f438760dab","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.338_1775881631059_0.22464544660011243","host":"s3://npm-registry-packages-npm-production"}},"0.1.339":{"name":"ugly-app","version":"0.1.339","_id":"ugly-app@0.1.339","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e1f7b69a9036dc1b55ab19bd23f90fa05f1cf567","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.339.tgz","fileCount":1628,"integrity":"sha512-xZi6RRMe76N4ybHlRKXBsmCPFfmLz4abP6+LFhDJ7D882TAEeR/upP28VifQAQehbLIAsZkHRkGTUEC5Pqa57w==","signatures":[{"sig":"MEQCIBpsGljR1wIQ/4FhCe2D7nhXDNjZoXqPRWo0BoK0U1xQAiBBCm2kQmMnMfQj/d7tGu+9ozR9oCPXnlHZX+x9SVZizg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9146260},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"60c0f91e80a2c3b4d79bf2c3db3fec830fd4e4e1","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.339_1775881938451_0.717951916146329","host":"s3://npm-registry-packages-npm-production"}},"0.1.340":{"name":"ugly-app","version":"0.1.340","_id":"ugly-app@0.1.340","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"25a64b134d8f01bb9a70b0b67d22b32f3c6766f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.340.tgz","fileCount":1626,"integrity":"sha512-S0Z+R0oypg5Q/W9pYgt1aifp5bWl+6iI63VuZ0SdoC6F3/2TqcbM9qymFHHLrGJFjpeobm+b+IXIKSyVZcN6IQ==","signatures":[{"sig":"MEYCIQCU8NyN25LQYxUAUeW0atuLOjckpn43/sNUYf3WGnv1ywIhAIPVOUaeDMUEjtK4LGjtBNkxLhhPYDB12IGPjKPaetbH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9095955},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"971f8e536d778009ffa927daccbdc54497ca5412","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.340_1775883734997_0.7888071398103198","host":"s3://npm-registry-packages-npm-production"}},"0.1.341":{"name":"ugly-app","version":"0.1.341","_id":"ugly-app@0.1.341","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"651af6d1f174c301cd7d9b0ef706254c579adec3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.341.tgz","fileCount":1628,"integrity":"sha512-uHouWQpe1k5rPk9SlcV0HWstlRQfA++M2WTF/0g+PiLj7jciw9O3wtTrOniNEY747lmB7wwpHRi6/rm9XIJ/4g==","signatures":[{"sig":"MEQCHx/CJNYoQdQJdF43YJGCRgdkzc5mQlc0luLZwyBJ5BcCIQC3Lc1zk6yzicMbDW8r8mt8QBOhmDb5ZN4zeKtOFgCKAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9142198},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"92b7e9e98d166e6b5964ac15a59facf2ca315dca","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.341_1775885695620_0.7154528875198616","host":"s3://npm-registry-packages-npm-production"}},"0.1.342":{"name":"ugly-app","version":"0.1.342","_id":"ugly-app@0.1.342","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0b7859b9d0df14c63b1489941d1b4ca997bf3f8f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.342.tgz","fileCount":1628,"integrity":"sha512-wtpZXpb7KhThh1shO2TMv0DEG/HcnbLlpYVstgrNEu0N6JydzDHMyJ354wFUg2TSbIGjFuy/nyUGFuA+ySiauw==","signatures":[{"sig":"MEUCICQKWUSnz/hzEQh7gXEKIYoUQhxy8e5JL1CaI8xYeCeNAiEAsTB7W5RX4Q0Jau3IsSvSZPz2+rpg3zo/GL1eM/1W+Tc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9142198},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"03a75b18aa0f45617359c94e8275a2ce12e53c15","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.342_1775886096039_0.6624950246834316","host":"s3://npm-registry-packages-npm-production"}},"0.1.343":{"name":"ugly-app","version":"0.1.343","_id":"ugly-app@0.1.343","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"da47d8f0019a8aea7df29d0eb5e03b5b84db2928","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.343.tgz","fileCount":1628,"integrity":"sha512-niGLfELXmbh2hUUQrUmIu5CkzAmyasegc/4KqS4GPhNods5+2MG5qBRSoSLuzj+xTtSpJCwDw4c3ZhC7u0bF5g==","signatures":[{"sig":"MEQCIExcJ60QOYEK7aToyZ8tG4/g1bAo8RouOvU1rrzKhVzKAiAcZ+kYlbiSyCxX4hinr7r8rYYdW3tAIu/cK3EZwQifeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9143515},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"c0e42e0e48fddc28367a1ebb2a312ee738dfa5c9","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.343_1775940411971_0.9255719215966967","host":"s3://npm-registry-packages-npm-production"}},"0.1.344":{"name":"ugly-app","version":"0.1.344","_id":"ugly-app@0.1.344","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fbe16b8ad04aa74841008339b555a4b0665f7801","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.344.tgz","fileCount":1629,"integrity":"sha512-55ZOWVR13par+KOntGSpFyrDqcrv51v+RQMcP4OMQs8BELG11JKITxLHptIxqkl3skZ4JWiuuHbh9UQAFkOfFA==","signatures":[{"sig":"MEQCICuhFBebZuXPXiVoWNGVquy/10QtLe/FkoULFHw9GFlIAiBlicaK5NJNZ4ixGOh1nwjmvKYPi3+jE20CEBKJHxn1LQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9375648},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5a9db82ae5da9d8cb2d712cdccc7f458a83447dc","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.344_1775941880306_0.25536085176576373","host":"s3://npm-registry-packages-npm-production"}},"0.1.345":{"name":"ugly-app","version":"0.1.345","_id":"ugly-app@0.1.345","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e051c6e39a6841382c2f07caed01e0871444a215","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.345.tgz","fileCount":1629,"integrity":"sha512-E2dFrCZVvI4I0BP5EFsKxILxk+HMN4gqT3dxdsDiBhoEI8IRyRkrkzMDIYY/25KJpLAPV+aPjGWF0kHOf65KYQ==","signatures":[{"sig":"MEQCIFhy9soqgvWVFF4YTtu/BzhB7YJdpM3KBwzUtxpdonCnAiAowWnYQ0jXghHZDHLl9sGicmsEOBtNvg7Ue5c+ptREMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9298324},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"af9913bcec33eca47b0d6e86f0faaf811729d0eb","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.345_1775944063036_0.3823746011216287","host":"s3://npm-registry-packages-npm-production"}},"0.1.346":{"name":"ugly-app","version":"0.1.346","_id":"ugly-app@0.1.346","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bd8c0c9d59117f6dc6bc965f1af304c26147ff2b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.346.tgz","fileCount":1629,"integrity":"sha512-P/iMBoFaVkes6+abtDe7PEdZ1EkcYG0xqYK4KWmGOSrwqkAqc2TZpS1R51KX7qZqjDxISjvA2tAgnFoILArSTQ==","signatures":[{"sig":"MEUCIE5eeSpOKT9PDuagnqM9H92Uv+XjDgeaDqFIZR9hMk5tAiEApgXguEby2SIPsQ4jWStBtnVaBwLtmy+DhhYHswg9j6k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9298940},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4746909bbf84a9237483861ad78478344df9a1a0","scripts":{"test":"vitest run","build":"tsc && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.346_1775945003622_0.5208744139059256","host":"s3://npm-registry-packages-npm-production"}},"0.1.347":{"name":"ugly-app","version":"0.1.347","_id":"ugly-app@0.1.347","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"13816c711090264e845ff9edc00eb5f8feb0217b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.347.tgz","fileCount":1629,"integrity":"sha512-U8DY1hFR0s6M9AnuTH9ox94Qw/Byfip9QGPNmdLPi5eC95Wh4YWtY1+zZMcCdagoZ7GgLKKirMsKHGTlC6bXJA==","signatures":[{"sig":"MEQCICLSOLB1uTkKAwurVtLio+r8Yqdk9UJtUrF/4+hzArGUAiB2VuRBDph4GMvLBI5fGWVhLu446nQ2hBNu8L0yRT2xUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9298970},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"38339971e92cce63fbf4dd52fa83a913026d2fff","scripts":{"test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.347_1775945692471_0.777192753852173","host":"s3://npm-registry-packages-npm-production"}},"0.1.348":{"name":"ugly-app","version":"0.1.348","_id":"ugly-app@0.1.348","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"78cd7623dc0d3a711a78740dc88779b4fbe82f6d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.348.tgz","fileCount":1656,"integrity":"sha512-0IhzHi+ZQrEqfZU8bn9pzBm40/mTEFXCSCwaPNmoU3qDeqOC3NZdwYZF/Z92HX2QQw3qQ14tm22qZ/fsbl/mSQ==","signatures":[{"sig":"MEUCIQDtxgy4NUQKfxVI12MR3wtjR561mpB1F0nzf5otI5rQYwIgO9f+W3iTqK+OR5/6jOxKxVHku3zSn/DNRpX0oGBykiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9861972},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1c2b7b3992aea2597f0ecadf5d98c6da1a870ade","scripts":{"test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.348_1775950408625_0.4929933824117134","host":"s3://npm-registry-packages-npm-production"}},"0.1.349":{"name":"ugly-app","version":"0.1.349","_id":"ugly-app@0.1.349","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"aa33060b5e1058af69e1ec79c92602a473435531","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.349.tgz","fileCount":1656,"integrity":"sha512-vYiAnPwtsHgmuAqchFYmHv59xcEghmexhbsjp6XAFjLEy5PH7m+9BV9lY6Bx4SE5yZ6aKpEV42/5KiIAl8qpmQ==","signatures":[{"sig":"MEYCIQDcTTtGxV8sPtTnKnTDHbefdrZOOA1mwfCxdwzR99oQzQIhALh/SD8bib63eixVIJuRbKI8RuctfrMvo1RJOQiIZJqn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9862045},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"d2252b2da6371c637a4054ba3f8cbf30a009aff0","scripts":{"test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.349_1775957604463_0.8986169992975266","host":"s3://npm-registry-packages-npm-production"}},"0.1.350":{"name":"ugly-app","version":"0.1.350","_id":"ugly-app@0.1.350","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1115b4171a58f2e2ee02f892be8b5feefa7ef064","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.350.tgz","fileCount":1656,"integrity":"sha512-jcpUjRRRH7zNCPvzpRf6YakGBdc7+sUIGtZCE64A/OcFC7IO32smxYB1TtnS91hnN2QfI+qRob6dIxb+/xEXJA==","signatures":[{"sig":"MEUCIQCK4jz6yOlALAd4uuLEyL7CRC65kCFmS1jRI0l1t292xAIgUZ1W/s/GRZdD40LCB+fYM/0IXiWghcUxh+EwwlZlq6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9862045},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"ce2ccc7b2b366beba71ff079b53c83778245fa0b","scripts":{"test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.350_1775957660020_0.809256410575359","host":"s3://npm-registry-packages-npm-production"}},"0.1.351":{"name":"ugly-app","version":"0.1.351","_id":"ugly-app@0.1.351","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f61b9e5d1ee6de08045ee947e0ed58946232d8c9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.351.tgz","fileCount":1634,"integrity":"sha512-6++4SMeFzieFAo6takOKswnNCQM7Q7lCMPhPs1ytjBJLkkQF9OjpTYDcx8wd7NeF9dzvhOkM2NMHT5Jm81k/IA==","signatures":[{"sig":"MEUCIQDTtx28rgxkhzMavQF5WIN1ofJtz/elXOKwfExeTVWPwQIgb5GDClrKHIUPmrlUiHXkoLUADeiZXEMaeXG/JrNpwII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11566734},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b5218fcadfd8a7128bb94656ba1455aae4571533","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.351_1775962359096_0.4353607370384711","host":"s3://npm-registry-packages-npm-production"}},"0.1.352":{"name":"ugly-app","version":"0.1.352","_id":"ugly-app@0.1.352","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dc162a6ff287e44c98dc28a999b73a27f60baa7f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.352.tgz","fileCount":1638,"integrity":"sha512-MejqL6flGPBktJIoNdXgTenUDopEm/mokOh09BY8a0H4JZvlgH5Ii7lXo9UC21HqAlFWVPxFfyjcq3MInxksEA==","signatures":[{"sig":"MEUCIFlJsj//JlY2bhVbAW9eYHO4jsrr9yxLcckQBGmqKdm2AiEAqAFdnn/783hGjCM7CjVMHWluYDF3QaQi4dIw3T0n5EY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11793325},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"bf908e2a6d44941e772d0d65b2860edcfa5ef4f6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.352_1775974030211_0.07986218056018424","host":"s3://npm-registry-packages-npm-production"}},"0.1.353":{"name":"ugly-app","version":"0.1.353","_id":"ugly-app@0.1.353","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9422da561e3c19e150fe3447be941ac07111934f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.353.tgz","fileCount":1638,"integrity":"sha512-afCTfEMiprNpsJkxl6ND8W0fXP/OsEdaQnZLz+uoXb3vUf9rLggOOaIDU2r3Tvoov87tLrjVCRpyiPBSSUO0rQ==","signatures":[{"sig":"MEUCIHJhnKWq81VZ4JLSR35Y/91bnbXvJ3hPgHyZhfGLn925AiEA1fqCqQO4WPxHjjGTEdHhiyjtq37/qJOVPY4OtSGqEiw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11796427},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4c075d9b306c88498a2499e9f75f25b44e5f50e5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.353_1776011146198_0.7675057537780956","host":"s3://npm-registry-packages-npm-production"}},"0.1.354":{"name":"ugly-app","version":"0.1.354","_id":"ugly-app@0.1.354","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9de3046f5a1a33da32f2cb97e44880e5492ec498","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.354.tgz","fileCount":1639,"integrity":"sha512-9tOiNggqYmCkQ9KQueOkz2otT0Jn7o2Ndwriibk7zDNcrKdJLiWY9pF09azSYD1PVkmiKjyqgqvOcliyE4c/Hw==","signatures":[{"sig":"MEUCIHdH+wV8DxqiZfPeFNNQnEXInMJtH2GvpvWfUxfZYewJAiEAmCISdlynGb4gyEaNrZoJgr65lEqN8qMXNDwHIu36BBQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11864018},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fc193de224e40af44443575ebdb77f47127e6045","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.354_1776014506779_0.8141061937517229","host":"s3://npm-registry-packages-npm-production"}},"0.1.355":{"name":"ugly-app","version":"0.1.355","_id":"ugly-app@0.1.355","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e521bbe4c45fe7386543fe13fbb187192da6f3ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.355.tgz","fileCount":1639,"integrity":"sha512-wjxAzqv3nMfW3Ebhkrzk9W9bBSEJt1PYVXaKmnE5C80ntX+bO1+cNaG7spIzD9i4KavDRKVWt6mnexT0rw115A==","signatures":[{"sig":"MEYCIQCbLSghSG4dHz3NDd8vdpbVHDww3ECD2JZwTrMzde4/DgIhALouVkHQQ/ITo8U8ioB4g02iC0L61WhwRfM27wh7GCG/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11864897},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"3b48ee9faa25e5f91d424cf627bed8ca78748468","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.355_1776019690537_0.44409785476462704","host":"s3://npm-registry-packages-npm-production"}},"0.1.356":{"name":"ugly-app","version":"0.1.356","_id":"ugly-app@0.1.356","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4db25bb2a63fa6eef44427ba49d38683910b41ba","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.356.tgz","fileCount":1639,"integrity":"sha512-zeOI8dv2NplSq5k8mOzniLMyzDONaigGgC3ZO9y4KksZoYhlCWLhN8U3xI+Fcy0wEcNl5ZLfmF0s/F3O8BGVhQ==","signatures":[{"sig":"MEQCICxjWAoMR0ad6l60X8x+fCprwoZFDDpd3AHD9WlFUj4lAiBQiOSqkcKh7PTinr3HbrcxhYSkS/GGcfjLQ3GNH/iWnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11864897},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5224659deb3901d3b2db61bee6300e67c5cbfcfa","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.356_1776021366016_0.8630499512748466","host":"s3://npm-registry-packages-npm-production"}},"0.1.357":{"name":"ugly-app","version":"0.1.357","_id":"ugly-app@0.1.357","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9f5611a6a9f6302b8c9266d61e4ab19be33a8734","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.357.tgz","fileCount":1639,"integrity":"sha512-mrsSjwXj/ji/uBQdYCmG1PDw+8bZ3hzL/HTnS29YN2CossrWMcfVvegP9TQ5laI5qg5S1NFVkBvH5sDb/O6QDQ==","signatures":[{"sig":"MEUCIGbc/Cn+7yCwFkNrQ318e6qtfxLUiy8ilq7kb5dsCHv4AiEA9h1+Qn89J4spkp/4+O/oaeaJXCTXCTbe0usSmIgAgXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11866119},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"31e15ae5df76ed3819dc2b0f422a514d32add8f9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.357_1776021614038_0.2267808258785622","host":"s3://npm-registry-packages-npm-production"}},"0.1.358":{"name":"ugly-app","version":"0.1.358","_id":"ugly-app@0.1.358","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"605db47eee3e08d50169409befe8f98c8d6d885c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.358.tgz","fileCount":1639,"integrity":"sha512-L2oR5B6m3hiDQfmyLuWpdfrh9gyovkqh5nLju6ji5ecrjN7IrY0sh80L8433up1O6ukzvS8WB/eln2LxrF3IXg==","signatures":[{"sig":"MEYCIQDke5u/sLdV/97Wa6CbIZez8pSSsoxHnV1PpS6RniQ/wgIhAM+jHWLskAtWfB6OKoGNowIspWVJKem1JQEOVZTcPG7d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11867990},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"130805d79330f131a445a4be057ad64daee461a3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.358_1776027842495_0.0889519354963948","host":"s3://npm-registry-packages-npm-production"}},"0.1.359":{"name":"ugly-app","version":"0.1.359","_id":"ugly-app@0.1.359","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"21fb66c531cd40801926324f86eaec3ee34a51d0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.359.tgz","fileCount":1634,"integrity":"sha512-Axtj33V71lKwtTuSv7tKkhUMQzphpUNGzt++r23e4aWBhiu1tl9HwTOJ87PNOyyGr8xh9KnejrqIn/xU1Qei2A==","signatures":[{"sig":"MEYCIQDve1RIL2jrlbQLGQF7K5WiXPPpTE1KGiSOee34rWw20wIhAMMptL0CjPNKnjgg+1NDDVG5oN9fp3EbLQ0aHAcQihN3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11855294},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"788631b54964755bfcd67de54933fa8805080cb6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.359_1776033226878_0.318295826523316","host":"s3://npm-registry-packages-npm-production"}},"0.1.360":{"name":"ugly-app","version":"0.1.360","_id":"ugly-app@0.1.360","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9ce681e27b6fd246382d11a1357dbdeb7abb624b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.360.tgz","fileCount":1634,"integrity":"sha512-djkQv6OUbdhkfE8thFILBXvQCCmEjOecfdnj2h4JQn+Lr9J81C53zFdtDtOxbJvaoCxd7qMgcxEwdie8QmRvug==","signatures":[{"sig":"MEUCIBK60WBYzLyHnn09CRoq9OSrx2HFKB8WBBgJCDNSG0abAiEAkJnWCskL0cXwHoy//DWSSlfmwSs6i+MBYmCceqUGQZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11861639},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"febd11ea2929b5675406ed58f6a3f75a85695fc9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.360_1776033812345_0.4815725338925405","host":"s3://npm-registry-packages-npm-production"}},"0.1.361":{"name":"ugly-app","version":"0.1.361","_id":"ugly-app@0.1.361","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c7710cc5c9e7b0f7eb63dfc70dda0a40990ca82a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.361.tgz","fileCount":1553,"integrity":"sha512-+2fjQGTGad9l5Sf8+/tPXClU64zDNyhJ/05pgH2NlROrQTgaKB8Q9zj1Efs/k2vCGzWBH/yRoG39Def4VP5BwQ==","signatures":[{"sig":"MEQCICExns6vIi7FUjiepMw/2bR8acSjnSfBdH5WGwj7ep4rAiAHZwfNZUqm2G6vx9jKYCQhfW5IU8pDOycSnSh/CTYkcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8575249},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"016388dfd49727789dccab33c321b283e91d1a90","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.361_1776033827042_0.5385074458898067","host":"s3://npm-registry-packages-npm-production"}},"0.1.362":{"name":"ugly-app","version":"0.1.362","_id":"ugly-app@0.1.362","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"70864950ec40e4f605f8a687b3f1c01579190953","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.362.tgz","fileCount":1634,"integrity":"sha512-vIntZn6BHwe4fBmptRr6IpmXutuPw1TOEV7EvvLPau/jH39iXQGY9cLiRoZPudDLkNBPgJF38M9g060qM0f7vg==","signatures":[{"sig":"MEUCIQDcpKPYFIcxkODlrZU80HVlExOvVSAqqBD03rBx3hB2+QIgXsT11sKUhfg1mRnKD92lSwAMS8u6XRHmYbxXpwG9SpU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11865254},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"93f44d01b58e45ed25719488070402230aa4fe61","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.362_1776035051089_0.9684821547067877","host":"s3://npm-registry-packages-npm-production"}},"0.1.363":{"name":"ugly-app","version":"0.1.363","_id":"ugly-app@0.1.363","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cfd43b1c2cbe8d1bc5e5d9558ec191148b89f8ed","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.363.tgz","fileCount":1635,"integrity":"sha512-S2CSFTgVlkNhmLkiwqw5txhSMg5Dc6GjSgfl79rgrDzgJN0o/I6WKfWEW4C6qtw4dXucVFx0Q8AqGI+e0zXpPA==","signatures":[{"sig":"MEYCIQDUINud9EcgBGfWDbXIOjE4LGuYSviA+DKyADmtTiVLlAIhAOL+AkN96qYDhusD8WpG5Q6IAm43BztBuFSlaVRJy/Po","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11879627},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e649bc128e095b208422aa921471a24c786519cd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.363_1776045900541_0.46601352415212594","host":"s3://npm-registry-packages-npm-production"}},"0.1.364":{"name":"ugly-app","version":"0.1.364","_id":"ugly-app@0.1.364","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0bc78500aa40157c30a884aa04993a2b593bcd9e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.364.tgz","fileCount":1633,"integrity":"sha512-E4d8SpBxm+CsQEt8pCFyZ7P84zn9r30n7hkOmFslXZqKLi148TXRMecoVDdTYc/B4jDo7XUK+knsZW/pOFoE2w==","signatures":[{"sig":"MEYCIQCh+fD1BXCDO9kGn2HvJY2KMk0xL3MNxWm8gD+MwjzTagIhAK+DuP51RtSPxQ3IOjJVEzls16z+28VmHeS3LF1VHY8U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11834866},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"85e466f5c93726b504e1ba094a7320c2bf96978d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.364_1776051075980_0.7419105484724877","host":"s3://npm-registry-packages-npm-production"}},"0.1.365":{"name":"ugly-app","version":"0.1.365","_id":"ugly-app@0.1.365","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c069177c017f5a36e14ae1585424663b227f53a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.365.tgz","fileCount":1633,"integrity":"sha512-5/VetT+RX/fhO5hiD9wNsUCE3SPrbfBOgxu1x3uA+3LgDjpL6tmMzd1bs3i9FuvIIOYcODLp3RSogqMUlkhAaQ==","signatures":[{"sig":"MEYCIQDped7WlYw/Ml1mnSuGNxbmkKDlQr0OW29Wz0DG6f/DZAIhAKy1sfVrnm5pUl5HwPk/mYo4SkgLVK4ja6CFxliywjOI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11835131},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2a0000b5ab88943b18ce4a26e8f3f712b91bb77c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp -r src/markdown/client/*.css dist/markdown/client/ 2>/dev/null; true","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","lucide-preact":"^1.8.0","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.365_1776051760282_0.800263513588789","host":"s3://npm-registry-packages-npm-production"}},"0.1.366":{"name":"ugly-app","version":"0.1.366","_id":"ugly-app@0.1.366","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fef07de659d345be34badf50b245b261eea1314b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.366.tgz","fileCount":1635,"integrity":"sha512-Az4OB7q9IAhgztoLjn7hV0wTEOCsa36JLK+frPKes6ElZUechxYVwnwa3aeWMmh18NEr6OXgDOaRHj37sS8s7g==","signatures":[{"sig":"MEUCIGDPGF3elphr2dwyUqNN4cFbzrj6bYzx4EFK+4Y27sFJAiEAm+Y0YCkyHAQ4Gmy9vsCIPNi5YKh0rUTfjmbR9p4nvA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11880000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0a0c475debfde5e973cd4697b7107b15a9da2963","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.366_1776053286557_0.4771876935310968","host":"s3://npm-registry-packages-npm-production"}},"0.1.367":{"name":"ugly-app","version":"0.1.367","_id":"ugly-app@0.1.367","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e26b66f7cd3feb165101415d7744cf42ef4a4d9f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.367.tgz","fileCount":1635,"integrity":"sha512-glVZoUZtxLC2I18mPhWs+ionZtI/d8CPWEKwJ2n6jmKyuhazVF8fKIrzxaGGIYj0oWpUsTMLSgRDaDy2LPU+7Q==","signatures":[{"sig":"MEUCIQDXV9ugVa2xSmDOK+1IVwfNRth2k8jSpIIYn927mN9jDQIgZK99aYBWT/N8vKNU2AT6+pkTpb7QbDF6t7eZZCFwVmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11879741},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0bded9510fc28b65102d3f09fb9dcc8ba2bf4428","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.367_1776135681951_0.5278634018394694","host":"s3://npm-registry-packages-npm-production"}},"0.1.368":{"name":"ugly-app","version":"0.1.368","_id":"ugly-app@0.1.368","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2069eb90352a8cd5f6386763a349ea4db79f1d01","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.368.tgz","fileCount":1636,"integrity":"sha512-Dq5qCM0kbXUDVLPPd1I9f8IPquQogaHaSG1qd95ILLHPX8ZLvK41KUYJCjdFM/ZsqhLcuN+BgO4SpuejkVCdWQ==","signatures":[{"sig":"MEUCIFPwNkos5o09cdRiBMjBQfjMuwOmg4E5HS0QgArOwcPqAiEAydLtb8tE53XjbgA7Md46GyxG5S/L9hnLGud7jhaTeXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11910716},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2f3b6128a1aa35592a61e48366563ba38d484977","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.368_1776141421151_0.6284369232955627","host":"s3://npm-registry-packages-npm-production"}},"0.1.369":{"name":"ugly-app","version":"0.1.369","_id":"ugly-app@0.1.369","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6d556be9493f253a6b6dc9d62e58b90605061a4e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.369.tgz","fileCount":1636,"integrity":"sha512-Uun4vshe+/EEeYFICqg1PMK7c+/4We7dNHCqAichMUsbbitCCrg53YmYWVcso18Mxtkkr69Qijugo/oIMN4uHw==","signatures":[{"sig":"MEYCIQDhvj1z6+8pvC4mOBZNoH4IbGgXyw/w3kGEYtjYzRv8VAIhAJmwyxQCESm2i4F/BOqU9O0eE5Wbl2nlUX2rhyhFqvma","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11914096},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fa98f034476779f64e9d1b6c4b934029f22203b9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.369_1776143521902_0.9452278644390675","host":"s3://npm-registry-packages-npm-production"}},"0.1.370":{"name":"ugly-app","version":"0.1.370","_id":"ugly-app@0.1.370","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1e752b80ebc7c15e1d7a58963bdb58f4c9d61d96","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.370.tgz","fileCount":1636,"integrity":"sha512-N9UdWzkvek+fu2UNSuJVATt25oggXaKMO+C4ICwjiRhkZulT/h4jaNVHEne4/M5XJZxBNbb7HXNfNEOrfRqMtQ==","signatures":[{"sig":"MEQCICVRM5hCN2K/H31aJ8+HivhVcNFYWfHHpQ/7ebi1QbymAiBJBaekp3krwGqOtzF9mSe4z1a14tR20BWO6+p1l/ai1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11917982},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"7b658bd1777e4d76bf6cab423bc57315cf7a9bec","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.370_1776144850601_0.335958206810399","host":"s3://npm-registry-packages-npm-production"}},"0.1.371":{"name":"ugly-app","version":"0.1.371","_id":"ugly-app@0.1.371","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1e3ef1afebb2709e715e42f7dbe4b47931987032","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.371.tgz","fileCount":1636,"integrity":"sha512-6gN2aPqIVld5X7NGxV3F7wrqanrpFwpLdlgO4/uMc8f5Ql2i0u4bX9sDbtKU2COY67He74mRuf9IoApoOd7nbw==","signatures":[{"sig":"MEUCIFqYGRwM5Yyl4Q7KeoT2dhXEVFMt2gBQPRlSErhQSBJ5AiEA81suXwDHjUwBbS+csKr57wAAQU/G+w0wou86rtI2EWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11921263},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"546d0841ab7d3fb6d53fe68c9dc33c3bc990aad9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.371_1776181024466_0.48037067230598773","host":"s3://npm-registry-packages-npm-production"}},"0.1.372":{"name":"ugly-app","version":"0.1.372","_id":"ugly-app@0.1.372","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ef9c36c9e901796372ad5c39134d18651a848976","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.372.tgz","fileCount":1636,"integrity":"sha512-TieKVODEmH+sbWwgPXPOFxSAXuUVe4y53Kft3pCFVTQwGDxkLVRFhg4/sTbKPptjFq81afBAY8u3sNDNhaTVBw==","signatures":[{"sig":"MEUCIQDwhbZdRKF15lhkoSG/8OcvTJqyp3KMHsdwHtqpGgkX/gIgUzCNtlfO7+rQuuQ8oUSTd5/4a5B+/OPFC9ndv2tzNvQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11943759},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"111d4328b3c34f447682967d2aa124196b9e12cb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.372_1776214578169_0.590973875023072","host":"s3://npm-registry-packages-npm-production"}},"0.1.373":{"name":"ugly-app","version":"0.1.373","_id":"ugly-app@0.1.373","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ab5f76b1e28c45a5a21c395097a31244af1f7a64","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.373.tgz","fileCount":1636,"integrity":"sha512-oVnByhhn6URn/94GatGI45Y8EVylNDloj/P1pn7KkUa16QyefBdxTd8JwVJF4AFu3tym/gCvBIOekOfGKhZKdQ==","signatures":[{"sig":"MEUCIQCIMOhmY+48xBb5wpXzZnbegBnMdyF1ETyWc2Mjx1IjQQIgTNJq9iYhzo/lYwR5CIPMTzU6bQzI9dKN5YcbLssQJEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11942923},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e016dc4f4184ee894ec4e897fbdd9d7f6ccca063","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.373_1776217045932_0.8742766594109215","host":"s3://npm-registry-packages-npm-production"}},"0.1.374":{"name":"ugly-app","version":"0.1.374","_id":"ugly-app@0.1.374","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d29fbcf40a216a2b919a11c6685759c68abb784e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.374.tgz","fileCount":1636,"integrity":"sha512-4JJ72XEtRPhVKDT28w7khdfnDRyFDRIcn/mig2qfKz2MOpDRHdWE6v5BfQk8FZ+9tKwzyxpGfO5GnmgH8Dhluw==","signatures":[{"sig":"MEYCIQCU0ildKy4v6Nax8DjrvMtu5EL4SNDic7+rNyAdM4oz0wIhAOU9Tf3WCg6xmGhkDEgQsBvR6JU0B/RInyZXzVy0QmCb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11943149},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b399297878b03f64c20323d658a0df979f4a0845","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.374_1776219955985_0.264980996193644","host":"s3://npm-registry-packages-npm-production"}},"0.1.375":{"name":"ugly-app","version":"0.1.375","_id":"ugly-app@0.1.375","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2cb3e78b118089ba915cb820954b460998679a45","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.375.tgz","fileCount":1648,"integrity":"sha512-KfUiftt5Sn5LoSaKxzckc6sz00kpMVoPKin1GZ9rxXiOVIGl1N/sbr7gnsfJdb4POMtdQw9LHsv7H0mPpfoyjQ==","signatures":[{"sig":"MEUCIQDwqBP+DQJK7GwBWuDKCFlodaeWh1PgFmqfEpkMFwPi8wIgWCE7Rterz9hlqkObQFiBuIDBfcDt7WL2CTeMTb3DYtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11987659},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"12d7401f55ba39d9b17a3be3b32eec3871b6c128","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.375_1776299779381_0.6055651702114355","host":"s3://npm-registry-packages-npm-production"}},"0.1.376":{"name":"ugly-app","version":"0.1.376","_id":"ugly-app@0.1.376","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cdcd418534300ac1ed294746b99acf0ea322f1b1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.376.tgz","fileCount":1648,"integrity":"sha512-+ynwmQ17d1RzCUQCdjSWEfaFhm1BMNbryZSwkuaUSIQFoOmDQ/uz/GTv8TgOPrc0QpvNmWX9mFTIhkhIcz71IQ==","signatures":[{"sig":"MEQCICpujmozJ31tA2ty/1mu4BkzJEr8ex/mbOQQpKPOnolUAiADb1jabZHt8x9/nvFueudFzndKqxW5nUnx/Nf+o+5Onw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12013554},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1f104cf36b4a0f719a0ee93cd8fd244c5c76d47b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.376_1776473962370_0.21722906304243783","host":"s3://npm-registry-packages-npm-production"}},"0.1.377":{"name":"ugly-app","version":"0.1.377","_id":"ugly-app@0.1.377","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4772b4d5e0a5a109d699c594e91c97556c5913bb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.377.tgz","fileCount":1648,"integrity":"sha512-TCOepolYgQwRE1jzctXde5fZGHSaRbw2MRVOYdAHVglM+MN0AHYKy4J2k/2tTVVHGCv01wmkSvqaLK65mQFm7g==","signatures":[{"sig":"MEQCIDTZKpRXo4GKrj126KqgpDzsQcxtwXbJKjWeEiTjeaReAiBJX914VZOloF3X0suItV7hg7ZUbjbw2v/3i9WZDPtdoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12016053},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a50731b7d13542098322f3ea447039ef8a9f42c4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.377_1776475221918_0.9302456266410251","host":"s3://npm-registry-packages-npm-production"}},"0.1.378":{"name":"ugly-app","version":"0.1.378","_id":"ugly-app@0.1.378","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3a48aed0783754d7ec4a769f286d855a97d7de72","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.378.tgz","fileCount":1653,"integrity":"sha512-YBthb4uhrzqhtZvMHYp+8ixLKyoL+EfXqvEfOkng/Sa6kTzToEERIP8o7XqSNhaOip/tVMFR64LuC+Cr4lzzaA==","signatures":[{"sig":"MEUCIGWdGB+gW/1G9/lSGmiW7Qm2HGr7GF0xT1LedbXNy6c+AiEAssdLnK+ESsOfv/ZdwFzfKA2NThbWRQh/oJ/yr23ZEuQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12019157},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0d7f0c4a5b263c82e873aa5299079c973712fb0b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.378_1776533689472_0.2831151366703484","host":"s3://npm-registry-packages-npm-production"}},"0.1.379":{"name":"ugly-app","version":"0.1.379","_id":"ugly-app@0.1.379","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"055625afa0e3675ab5eb800775bc79e4963bd6cb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.379.tgz","fileCount":1663,"integrity":"sha512-vNJqMFl/m3zkUul3aCABcubBVeDBBg983MW/B+ZObXEOK0v+TvZg867Bth6kwPj2jWgOh8YZ+4UPyy3RgKysZg==","signatures":[{"sig":"MEUCIHSEinc7WiyeWkqYXNnnmhMmWohbZoptG3iJ3ncl1oMnAiEAvsUhiuSTjP+rVlS30jqGRbMIdeCJXGf2mzsjDxN6Yrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12078806},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"c78952309bbad52c7526ae9dc6ceef3146585a2b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.379_1776537087534_0.2709879923201821","host":"s3://npm-registry-packages-npm-production"}},"0.1.380":{"name":"ugly-app","version":"0.1.380","_id":"ugly-app@0.1.380","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f6893ed8e11b1286a2d855a0f3ece495eec86125","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.380.tgz","fileCount":1663,"integrity":"sha512-b2+9FQJcx0Iej1QDxNJ/GSZiE/va59l5a4v+NQtDnuLrRYkqwpMt7LK2OZbHqfwJIwxHsjgGdfaCmpCrFoqdlQ==","signatures":[{"sig":"MEUCIQDTWYCD53Yd2kBsf8tUQIIQSlAwcSxaVDcl9D1Ko/kaLQIgOICz3ZOaTObVJhdBmHdcj+993uR2NvXLW6d6Ms5uHk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12078806},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"73504a06f60daa6efc1cb7e82ed29650dcf34775","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.380_1776539419979_0.35753992805218715","host":"s3://npm-registry-packages-npm-production"}},"0.1.381":{"name":"ugly-app","version":"0.1.381","_id":"ugly-app@0.1.381","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9c94b92058dc183abcbdd640d0e6e203ec078320","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.381.tgz","fileCount":1663,"integrity":"sha512-hDUirbsPUwBuu6XveIunE8T7qersE3NXB6zpixzOniQIRNNkh1dXOWBTGE4XEZ2IJC09FPtbfSR2GQcDGy+DGg==","signatures":[{"sig":"MEQCIF2r44Cl2Gq7RFMkKyDQYaUjlyE5bamOuESa828AAAe/AiA2kAHs1Truzx4lu+hLFi0ZlyPH63mwt5JB+IixhwZWpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12081285},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"f30f2cbd6085478df7e03b9451bc75113f83fc1c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.381_1776541440080_0.7657216345210456","host":"s3://npm-registry-packages-npm-production"}},"0.1.382":{"name":"ugly-app","version":"0.1.382","_id":"ugly-app@0.1.382","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"58d21de1019715191ec477b99afe7b63567dab0d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.382.tgz","fileCount":1663,"integrity":"sha512-5KqZypqjHa7wA5uWB228FXyT6Hj+sQ0Ljr/k6qfdlvbNxKHlFLhyZ2e8VJm51hc2azEHM1mPCgeVeziJrJl6HQ==","signatures":[{"sig":"MEUCIGaCGxfrT51ktZplv0Bo4o7SZaaZwpJyJxEInkdPr4URAiEAk8FTHkWIkmS5vHZmf321tO0IQYUOLZDROsTRSntscD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12084381},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"733b21abe15622111acd3b20ca1f6674f436d502","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.382_1776546905019_0.5676036190693436","host":"s3://npm-registry-packages-npm-production"}},"0.1.383":{"name":"ugly-app","version":"0.1.383","_id":"ugly-app@0.1.383","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"edb143f598d51e6f58306a80cdfbe8238e8eccf8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.383.tgz","fileCount":1663,"integrity":"sha512-UvciP2grscmswN2q/Vu1QExovgdg9hjQ/fGUCBRrnD2oN98i5x5FFfux4+50mkgNJ22HVi9iZxVX+S5bIXhb6A==","signatures":[{"sig":"MEQCIG8QgS2rhXeYi3RUaOHgoUbKjmnHKvzTyCj+V89JILm6AiBMv7sHmvSQgdKG0OTa3TKqehMhRs804P7txnmfsP6rWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12086437},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"3f20360fcb37ff8aada939cf8fade36aa023dbd3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.383_1776554044038_0.4987320030414377","host":"s3://npm-registry-packages-npm-production"}},"0.1.384":{"name":"ugly-app","version":"0.1.384","_id":"ugly-app@0.1.384","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"aeb31c3777027aca5b3fa1ce38573edfaeda8aa5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.384.tgz","fileCount":1663,"integrity":"sha512-lm8UgcLwGYpkbKIYTXKwC/d4ke2PazAWUr9AKEYlC21d29Qyh4CWWC+1yAgKWWG5Gw+kGtPZWneA2GB1TIooAw==","signatures":[{"sig":"MEQCIGFbDEPVFH46WIgYnOtcA/fPH5cnVDt8fVei5Vih71iLAiBaWjtl50l9t4jamxcVzyf+O4eUwhUwJAZbGkBIEXYqsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12087091},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5156e2ec4b6717f844c80f73d6747ec2ae45b657","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.384_1776554594922_0.7568076955719794","host":"s3://npm-registry-packages-npm-production"}},"0.1.385":{"name":"ugly-app","version":"0.1.385","_id":"ugly-app@0.1.385","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c20eff28052cd3f2ef636b8b3ca90134b58339a9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.385.tgz","fileCount":1663,"integrity":"sha512-dhXM87ojghEXnoECNuW2OZbJgdjESCTGBE5VYzKBP+lEO9BvxrXJ/LMMugHeLtgy9NN+cizEX+JNFgcJe4KXog==","signatures":[{"sig":"MEQCIFfU4QrQhIF7vsOHIm+5U1Ch6x0mDFC+oxDzVKIiZUXaAiBd7Qhw7D7AJkbOSwUYVMqchgVBx1Mse5/IE1Oq/NNuYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12088029},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"40fd1d7412adaf007e6da72b5e5a45118ac99c8f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.385_1776555253667_0.7103624247232829","host":"s3://npm-registry-packages-npm-production"}},"0.1.386":{"name":"ugly-app","version":"0.1.386","_id":"ugly-app@0.1.386","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e686e5431001adc52bda8f54c3ae0d92d4ec142a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.386.tgz","fileCount":1663,"integrity":"sha512-mBq3wVNcWyZL35B15DcPL8w1sKGMDb1Ke3RaXWmSXPN/WX7yE1uHTktxfPqG1+HYBHuxNdjj6mpvog7vG5mqXg==","signatures":[{"sig":"MEUCIQDpliACNpuBJ9nwl+BAkKJ/3/YMbNVrHOmLspmDXh7YDAIgbI0uDo4hs/ARQV9glH6wCAvLOUpUsZ4ZZdHcKBwggKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12088029},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1cd165de30bad5279bc22c4a33576f82092efd56","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.386_1776555404967_0.02351765768269165","host":"s3://npm-registry-packages-npm-production"}},"0.1.387":{"name":"ugly-app","version":"0.1.387","_id":"ugly-app@0.1.387","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"247f2a2c00a8672e985bb5b1b6e1d5794e5e7d46","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.387.tgz","fileCount":1663,"integrity":"sha512-cuTBBg/Sha/Ae8FFSVSBs86XF8Up3ZKlZnKr1atjQeOJdy9qLrcm3qfKwqm5BWpcaGdNMPAzwdd/xDQgOAPKXQ==","signatures":[{"sig":"MEUCIGThtKtYIFzXFoQQJpk6ScaWxmQI4cO3raNsYtpomaIZAiEA6Zy7Guu2DxJqif4vCZuC3832nABRuTsoGGn4BmSmSwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12094895},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2991ed1d83d124bb5108b3e2280581e5d6c5d31d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.387_1776558488624_0.6588839588957245","host":"s3://npm-registry-packages-npm-production"}},"0.1.388":{"name":"ugly-app","version":"0.1.388","_id":"ugly-app@0.1.388","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3e5bc0e75cd0f24e6cda748385d4d0c6f9f4d177","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.388.tgz","fileCount":1663,"integrity":"sha512-iQ5r/SqL0atwXJAAV0+uwLFqq10/c2bQvp4UNWgYr+WPL6AmRh4IxvZLuqzp0Yy0QfmQvU1UM4cPBrN4D6LASA==","signatures":[{"sig":"MEUCIQDvgmZvdhLAftXhU0hpcz2rnM8p8jXwh+WIjWI1HR7Y6gIgZ1aklQOhVR19nIs3cwG4BkJ60Dwx4IQqA9saAtM2f3E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12096036},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"9e77d6c0f217ec36f0ce4e3984a685050341a1bc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.388_1776558667604_0.28777134529175874","host":"s3://npm-registry-packages-npm-production"}},"0.1.389":{"name":"ugly-app","version":"0.1.389","_id":"ugly-app@0.1.389","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4178bce3cb21a301a0a00d9b18931977d7f288ac","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.389.tgz","fileCount":1663,"integrity":"sha512-hMzy88OwHL86e1UjSpb76SkMqLniRJE24SJ35OXmKX4pKA8Mb9DahHh6rwcYFcfqcHVxwJk2uOXaomGp3i4JiA==","signatures":[{"sig":"MEYCIQCLPtqn6n5WjKugrsFGJRrirK5Fz53qRt5v9eFxpyx4zwIhALqk8I/ZfJqTzriCflzJ5JllSlWBMTpxy0/TzoO4Aniw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12096028},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"72b5f71bccaf93655a91e55c9fd173b028f5116c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.389_1776558748298_0.7481966822684079","host":"s3://npm-registry-packages-npm-production"}},"0.1.390":{"name":"ugly-app","version":"0.1.390","_id":"ugly-app@0.1.390","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9e8b4c863130f34c4fae9b04428f561a21620935","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.390.tgz","fileCount":1663,"integrity":"sha512-7z1O/ImJ/RrlPgln0kWrKRqOOMXhPZOuki0leVoKUjOU5XPP4xSS4OiFz0d0Srb0knpPq2Juzou6AyMqGgo3RQ==","signatures":[{"sig":"MEQCIDELRaVR3gzE9SKtuyWa5QSxYhicDEKjmEfMcHqyDJQdAiB8Ys4lBTZmFwbfui+zSqjxMAAz4/Gnh0UDDAeNHn6wuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12098673},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0326807a34da898dde08b99d2adfe9179849369f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.390_1776559308042_0.8853239987934021","host":"s3://npm-registry-packages-npm-production"}},"0.1.391":{"name":"ugly-app","version":"0.1.391","_id":"ugly-app@0.1.391","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e459483119ae6a5be8a258d14277a36df383b087","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.391.tgz","fileCount":1663,"integrity":"sha512-IoYXZdfwVMFfxGUqAgrstZ5r1RQDvoc14sx/xk3jB1h5CGwQrcsWd7aeTxnD/KNVZ2tUbnLM4TsXOJcmj0lPKA==","signatures":[{"sig":"MEYCIQCTfes6KrCjGL2T5edO138c0iYJNsnYa899bi0rkWZ+XwIhAMFjteMlfORG8gBBT7Qt0/jRmcBm2uJ1DNBsMZ6K3kEc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12110353},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"ebdfad03551a367250d8752d161cc96f5b6fa1b5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.391_1776560160603_0.035585442776890464","host":"s3://npm-registry-packages-npm-production"}},"0.1.392":{"name":"ugly-app","version":"0.1.392","_id":"ugly-app@0.1.392","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"94bd64ab7941a3c0b746c94646eb1ec7fbdbd134","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.392.tgz","fileCount":1663,"integrity":"sha512-v7z5T4nSdgFbQChRG7zs0ZEQeZOuWLts9pLhxwV+2/V4sjrqNDuEq/NJB0MeWvdhC6iF442TyS36OuxWEnnsqw==","signatures":[{"sig":"MEQCIFswmWTbCn4S+nw2Ge7NzDRHY/t9t1OwMU4kV2tejvZgAiAq9G7gS0LoFFE7RCdGhVhHxpAAT5+PpNfnHAN/MpuzaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12116899},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"69d53dd9a854bf500baff50ea00347bf06dff9b4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.392_1776561063792_0.7794819808666926","host":"s3://npm-registry-packages-npm-production"}},"0.1.393":{"name":"ugly-app","version":"0.1.393","_id":"ugly-app@0.1.393","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8814357828cf3fc35d5bca1c9435269462a7e851","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.393.tgz","fileCount":1663,"integrity":"sha512-YHYkWDTgChYFJ2o1LdeBbm4XP0rPbqVspOGOyJfH2wOjz5ktF4aeOM4vxYQeb4GWHD9N91Y3zmO2RuDWAT5rXA==","signatures":[{"sig":"MEUCIQD6ZznNc0fQgO3siCXLdjy+lkgrVlocwcYluLzL1XMM2AIgTgKqF+UPaIzCDqUtEvMrebNnysVNTqajuIsf+54XHJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12118206},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"c3515a520da0e3997c823e1e5a4019e25a7f589b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.393_1776562831757_0.34668285744492655","host":"s3://npm-registry-packages-npm-production"}},"0.1.394":{"name":"ugly-app","version":"0.1.394","_id":"ugly-app@0.1.394","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2b3c99f53421c90c68cfc38ae3a32867070517a6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.394.tgz","fileCount":1663,"integrity":"sha512-5MtSDbcOnORhIHMv+gYEf0oknYAL0im1EOmKnWHvJDiAqTP8dDhbithjQ9Zy3Ivpppii1lg8v4NVlsRKKevWFA==","signatures":[{"sig":"MEQCICVWfzaMK1F5N6J6C3MP1x011uN0hAsEn5QFebYFfA0qAiB9YY3tox54GfGebZZCDU7lN1PZUFu6dcW1euyOSR4ZJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12118206},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"6191d606157bca58b9b4b1dda96dbeaeac63806d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.394_1776562991776_0.8162212741313863","host":"s3://npm-registry-packages-npm-production"}},"0.1.395":{"name":"ugly-app","version":"0.1.395","_id":"ugly-app@0.1.395","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"75b3d31d3a43c05ccd375584775ee3aabac590f4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.395.tgz","fileCount":1663,"integrity":"sha512-gdATlNDEFP9jvRqbHq4Zl5nVQr8Ocodzcj8m2Um4htlCmUSR1tnznTzG/cUbv31NKY0+RELkR4X6zPqjAL77tg==","signatures":[{"sig":"MEYCIQC/ciBfUepl1B5saa770ZPJEIzOVhH+/mWrB/MlPZBGqQIhAJFXySDx2J7Cpqix9YUs6212BeYYFhKalaOr6YmKCmmi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12119280},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2b595ee1bbd2f6b5f13f90f330f56351d3f1b7d3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.395_1776565023979_0.45340174691178614","host":"s3://npm-registry-packages-npm-production"}},"0.1.396":{"name":"ugly-app","version":"0.1.396","_id":"ugly-app@0.1.396","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52768eae417f786bce217e19b7aeff74d231c6bd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.396.tgz","fileCount":1663,"integrity":"sha512-cy3kkwBKPLHXukem7AV3OIQt2zUM9+RPc05+kRlDGwafMp1PsrxYB/7q3X59UHiVG10TqKQm2QoZhk0foD+57w==","signatures":[{"sig":"MEQCID/fxjBMga6mliCfI+R/AxOqtPs/kdDVV0lttGYj0zFaAiBIAptr2M9dgCPJKqv68ovfLAuFwLIzT9ylVA61RqDZYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12120468},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1925f945637b4e52f6d5050935ebfcfbf1a4a48b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.396_1776565589118_0.00047373474751277733","host":"s3://npm-registry-packages-npm-production"}},"0.1.397":{"name":"ugly-app","version":"0.1.397","_id":"ugly-app@0.1.397","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4b90d649004128cb726747ba7c2608418b962ba4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.397.tgz","fileCount":1663,"integrity":"sha512-XUHaSWfHSqe4492P0i/cU4PAUb2FcPaSfxATiuMu/P0mZMPnEipKi7vF+7QtxRAcdDC/cx4rnyu+vCAy3E8VWQ==","signatures":[{"sig":"MEUCIH8IDSIWQyGsDFg0E74GITdaZsyauQu3KNNoAHGjK5HXAiEAzx4gTB6/a0JTVXt89EvysZq8vaMFdrSTIrENEPjy8D0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12119123},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fbccbddd29ad366928c211b5bf9e03fc1f10697f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.397_1776565751632_0.7533044143224035","host":"s3://npm-registry-packages-npm-production"}},"0.1.398":{"name":"ugly-app","version":"0.1.398","_id":"ugly-app@0.1.398","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"38eef6a965335cccdb27eb6bee8e3649399d51eb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.398.tgz","fileCount":1663,"integrity":"sha512-7bRkmg/rRGJR+Ql3j94/il1XgXEMmRg1Ny/8YlWyvEj4+2b4905TlJZuNvMcu2umHGzWKusCpLreB1gFmo9ooQ==","signatures":[{"sig":"MEQCIGJm96TVYKAhDRuuS49wiCJjFiCG9fqRQW0KpzJRLDYFAiB4/OFbYnCMZTOJu2efEzKlC5hmx1/oYB2ij1FLeDeMtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12121381},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"950ad82ad7e73e44e3c63387a24db9acc2e5d60e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.398_1776566592859_0.5244470911043551","host":"s3://npm-registry-packages-npm-production"}},"0.1.399":{"name":"ugly-app","version":"0.1.399","_id":"ugly-app@0.1.399","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cf927272bdc4ea4cb455a8522086bd5d9e244383","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.399.tgz","fileCount":1663,"integrity":"sha512-XdzBktoQ4xH7rD0r2IB/vxANnIpZYH43xgHyWnmmSzacLgHJMnstsNhYORJnHNBEKGLMUGKUT4hdNlKjV9pfSg==","signatures":[{"sig":"MEQCICbwD3vVtLKb+ibj2Q9/70uHZ2+GB+7BNgNUmpahgT+5AiB2loOY/xbzKYkjLtaFn1zMUWSTMdudJp+Axk9VVn6q9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12123048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"444e23436fb1e772820551c6e89ced44f22c556b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.399_1776568999069_0.7199976909522243","host":"s3://npm-registry-packages-npm-production"}},"0.1.400":{"name":"ugly-app","version":"0.1.400","_id":"ugly-app@0.1.400","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f61b2b6b3515a2d8bdae8e4f215494a9482c4626","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.400.tgz","fileCount":1663,"integrity":"sha512-5/1WBOxdh5n/+AnsUhGFIjSsCg4nyqqTNPJWEK1TpQ97Vvvci488qgAXhQXjpctBrJame+4lPclkBFbpjo6R/g==","signatures":[{"sig":"MEUCIQCv0o4+5db7i9wNs7Qu7fQI5OV15uCCIFDQgAQtkOnxrQIgRUpSKSCaeEhVOQBVIUpI3IiB3kWn34XgTD71Ke9p7BU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12123048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"ed1891271369e592707f4d5428efbcd405529522","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.400_1776569030815_0.29162978056440436","host":"s3://npm-registry-packages-npm-production"}},"0.1.401":{"name":"ugly-app","version":"0.1.401","_id":"ugly-app@0.1.401","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a6e94236e14b9b3a79d613610c2b36893ebf9d9c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.401.tgz","fileCount":1663,"integrity":"sha512-EBFpkNELoiGG0hm3uE3lLeAd9kVO+bsRCMLUm5nL8JBBTgZyqsE0jdUTBLdOPQhg07lGHf1WzEl+iPlUYWe9AA==","signatures":[{"sig":"MEUCIQDO7/YVxcjOHgxh0QmGxin4OSXYx5GqYxmsdm6QuI00oQIgJH6NdMAwRmEKkqC4FMue0ayleO47tC9GWxBoRAGY/UE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12138565},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4ff9fcaa51f63039f957b892e80077f701293182","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.401_1776636666390_0.9996325521871741","host":"s3://npm-registry-packages-npm-production"}},"0.1.402":{"name":"ugly-app","version":"0.1.402","_id":"ugly-app@0.1.402","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"03f5c232ac90ebd13c5c5dfd446b53a739e1c08d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.402.tgz","fileCount":1663,"integrity":"sha512-GHkYczKOhqUdEXbBM/4UmESI5FDpF77Ek0bngawqiS+bo5ODkiQjTO9/i3RdNYQXtfD9acnSIbtHGOwZylFZxQ==","signatures":[{"sig":"MEYCIQDE05xOWIGOcx8JMWjF5zGIef3hyEOo+uGO0AnPm45DsAIhAODG6udGmFQN2TSfTG1oa57mRwNlorq4bdLqkDOlIu1k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12139268},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"39ffaa36eeafbb0bb334747e1695f73b5e08bdf5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.402_1776636911815_0.534175680625179","host":"s3://npm-registry-packages-npm-production"}},"0.1.403":{"name":"ugly-app","version":"0.1.403","_id":"ugly-app@0.1.403","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4bf8def7e137cefc02aa2ee7a65e3f79ad30fcd9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.403.tgz","fileCount":1663,"integrity":"sha512-7a2n60eojyQbBA+1Ju4SFVoZB5TrnsZt3vxBmJy2/6dDI1YvQizNx36FDk7EU0KHclTaNxsZZCxdjTZSWzljIQ==","signatures":[{"sig":"MEUCICpiVfLLhO9PwOp4mKfwVpvaTeK42dQL4j3Z/mAbqo96AiEA16PUkNzlr/6aK/yomitlkMatjc7mxqK5Vx0sC1QtNYQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12141239},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a1770e4060de3b13c3426f036c1b4e2d00f54f0b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.403_1776662685453_0.42924553096996876","host":"s3://npm-registry-packages-npm-production"}},"0.1.404":{"name":"ugly-app","version":"0.1.404","_id":"ugly-app@0.1.404","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"05bcaf4b243991fc7943b5ed2ca18d26ab0b54a2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.404.tgz","fileCount":1663,"integrity":"sha512-U6nlzqREC2Upm+6csUUGxU/s1piGnaqW6UW26YByfwvlOSCFCDvWWzhbNmYue85kjP9FJ9sLeLXdhowtrbIMhQ==","signatures":[{"sig":"MEQCIEBQ5zSiOj/gW+r0bjhb26h00WVQGUbN304LDr9gd/EKAiAorqt39KT0zrHxWiJQStM9TXoxLJq+Ht+ecVBHQLSpTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12148402},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b2a5202e45e4bb5abece66e0a68dc8af78d4af13","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.404_1776715951078_0.5094196288527078","host":"s3://npm-registry-packages-npm-production"}},"0.1.405":{"name":"ugly-app","version":"0.1.405","_id":"ugly-app@0.1.405","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2aec2d24743e08fe2a715148d4476837de1287cd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.405.tgz","fileCount":1663,"integrity":"sha512-PTbaDng9Gc53CO/P79x95483R5ujxtGuduvJptjTO7SOS+YTN//4XpVcBG1SVGFVp7eSHvfv3IqoT3ZVwvmFiA==","signatures":[{"sig":"MEYCIQC30n4WOb8XLPRRv9DwaEaiEnMPpeHIRIABRdaZQ3voBAIhAOTVwR1XP0GLh5j15BUpsfN7aIqDwNjmw4Gv9Ia36J3f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12148402},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"849e6cb562d85dca1cd66366acbd85ad39521d03","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.405_1776753459687_0.05233685371408492","host":"s3://npm-registry-packages-npm-production"}},"0.1.406":{"name":"ugly-app","version":"0.1.406","_id":"ugly-app@0.1.406","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3f6c7da513fd67bd1f9929ab910f984627c0c9ce","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.406.tgz","fileCount":1663,"integrity":"sha512-Upot7ASZquFrn59RQ2PLcbwbtIt98FtkDVItvquJM3L9wRuTL/bDHlu0bnhTqDdrYepFpArcUsuqiOH660VOIw==","signatures":[{"sig":"MEYCIQDjW6EQ70Yhvbq6UD+Xphjml6G689/EUjSkHM2d4WnaDwIhAMZGzToGhzutGVjGSUus7QrP7MTzJs/MdsUPxhY7BxAt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12163943},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"48e3fb5a1c1408a6e3bc15e8f85f18e185acc8e7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.406_1776869256964_0.18134726769015708","host":"s3://npm-registry-packages-npm-production"}},"0.1.407":{"name":"ugly-app","version":"0.1.407","_id":"ugly-app@0.1.407","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fa168d017be585a501ff6fe25ad4cb939ef1291f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.407.tgz","fileCount":1663,"integrity":"sha512-IsFJNMIox5C040hFfON2b4njNAR6eGHhmejgmyvmH6o11X3pTWFx8OV4/9hO3nG9dQ8q69rZuD9No/3eVCjZtw==","signatures":[{"sig":"MEUCID1GV+1G+l6io7WMqWG9I4obTMCDX6JiESimtJZFXbB7AiEAr346Ca4OO+UwLjU7/TMB/qHVivtEMGYKRHgT31Q+IF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12168451},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"dd9aacaa4687c777554ec86e4330bd5dd3a755aa","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.407_1777059450251_0.4573806177187052","host":"s3://npm-registry-packages-npm-production"}},"0.1.408":{"name":"ugly-app","version":"0.1.408","_id":"ugly-app@0.1.408","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"723123daa57ddd7e488350b7bcae611cdd07b5a9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.408.tgz","fileCount":1663,"integrity":"sha512-iGfx8kY7U1Wb8gbKOprPVnUFhmKRDcOM9orGXVJTz+jXjELesVPKqp7Zhxe2kYfMup7TvkvoWM6GlmUhTC6TtQ==","signatures":[{"sig":"MEYCIQD7jf0qi16Mn9EHeGOGtt/5PL+/it97AAYjQU25UoghXgIhAP8ftTDOoi67MCzSos82u1ZJ2uNIKAm4/z2/2dNFk2Lw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12173335},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"eb7c7b7231ecf1a823c07f62b749a27d0037adcc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.408_1777071460939_0.7284235667742025","host":"s3://npm-registry-packages-npm-production"}},"0.1.409":{"name":"ugly-app","version":"0.1.409","_id":"ugly-app@0.1.409","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b1f873d73d61ad5fdddca29aff3c4d14ca22cf4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.409.tgz","fileCount":1663,"integrity":"sha512-YMmaBs+eWzNd6HvQ+pXtv7usn54W+LxmwEzhAhhJ/Dssifyt6LJ+TwrbgHMXsKdJRvJ5g446yHxAbk5yvpI35w==","signatures":[{"sig":"MEQCIDALZIZMoyBglwnmH1W15PxgLcByc9nH+tLKPzH+4GPsAiBBg4CSf+RcUne6Xgeydvh8sePtFbYtq1njhv2xNfTpkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12174262},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"28ee116dd61ff082f5298869c056a192d0e72675","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.409_1777086124641_0.8482141434683115","host":"s3://npm-registry-packages-npm-production"}},"0.1.410":{"name":"ugly-app","version":"0.1.410","_id":"ugly-app@0.1.410","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"323452f4863e89e249213ad6f5ff86bd93e05e95","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.410.tgz","fileCount":1663,"integrity":"sha512-gCA0xTrmezQgesVu6K37jMMfcK3p/FhqenE0hbqzJStQ/RW0JD6bN4pBSNe7kIsXEWWz6062R6PqJZCre3Wq0Q==","signatures":[{"sig":"MEQCICclodmHe9UmRpvZ4vwphY3Gg6DYgHpWl8IeP7XLEzoHAiAfEpIQ68p67gEft22vFKVcfNCEPrc3Z7G1Yk/cS7P69A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12175367},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"3ceb55a2e4b7c9a56f38bbd26805bbf10e523cba","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.410_1777088182145_0.37555109485316884","host":"s3://npm-registry-packages-npm-production"}},"0.1.411":{"name":"ugly-app","version":"0.1.411","_id":"ugly-app@0.1.411","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de43f9c58b7f160b4e03550b398683fcd51487c1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.411.tgz","fileCount":1663,"integrity":"sha512-0vnRY7borZoUKwNRax7t9MqOXJawLzG4coWK3La5aG8FE464AWIS/qb+ihyilKD8Z4i1YQ+Y6O8gfCZTkSha7w==","signatures":[{"sig":"MEUCIHGzCup2XfJSU3no0UWeRQBDstKV36cQJ+APfeGQysxeAiEAgbQlVJJPesyOlObhiS3xpkI35DkMCHgRGnNNTHXOTII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12192289},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"6408358ab097469a7bc2261530ccd8dc775d74cd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.411_1777131271052_0.3360368430164382","host":"s3://npm-registry-packages-npm-production"}},"0.1.412":{"name":"ugly-app","version":"0.1.412","_id":"ugly-app@0.1.412","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0e26305c5a6436aeab38b8bccab2702e139539c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.412.tgz","fileCount":1663,"integrity":"sha512-x1JYFCSlC4XMVZI1Nvjve67Bjsc/RbKJjya+bHmF0jTkKdQBcbSsk5izI+z8/hbQJfVXgTbLM6+sD1ANi/XXEg==","signatures":[{"sig":"MEYCIQC1bVTlXaB3UA1r1UraR74Y3hqUzPDwSZK1bJ7r+PCV+AIhANRVak66M/DwAb2VviR69q2hFfIOSdFjHqLwW2ix6SuA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12197240},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e9e01320caf5e3db55efd601803096af132878d6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.412_1777139970565_0.1479584240036893","host":"s3://npm-registry-packages-npm-production"}},"0.1.413":{"name":"ugly-app","version":"0.1.413","_id":"ugly-app@0.1.413","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a30895da0e70d5f406e026ef793ad40a50c05ff1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.413.tgz","fileCount":1663,"integrity":"sha512-vctulekn36veFsRlmWu9RMUyXUFAKBAQAmKM2A08qIELaZjbyOAT+nG1O6RlSAf5vbI4tCGgquSODWnwSTJ+bg==","signatures":[{"sig":"MEUCIQDLm3RLnrY0N4y/8isLoHcmjHqkxGC9IhKYRMLGQs8EygIgMDeG2JvCrXxD8t0dMXuG2gxQpnPurrlBOXOrT2cHirk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12198624},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"19fe2e7a5722bb08c4c81fed54306c176b5a7336","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.413_1777142802599_0.19839638757231004","host":"s3://npm-registry-packages-npm-production"}},"0.1.414":{"name":"ugly-app","version":"0.1.414","_id":"ugly-app@0.1.414","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c3b4b2d9abdca611debb01486c9105decc5df3a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.414.tgz","fileCount":1663,"integrity":"sha512-+ZbkH9pu3bUnpqsSPbQweWkW1/XmQDw48uE0nZDL6ebL3onmt+bYKclil1w5pRSklgOeUXzlmcgpf+5RmUuxsw==","signatures":[{"sig":"MEUCIG3bQiTS9MNzDpXKPJ9VS1Ej577pLkpQfV1hppZ1aYA1AiEAkSS9FUZ5vWtFuCNUuFETwfpfeV35b9XB5xj6pvtZKow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12205111},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"84223323af08a076563abbce23991a6dea91070b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.414_1777153648001_0.6494345445420349","host":"s3://npm-registry-packages-npm-production"}},"0.1.415":{"name":"ugly-app","version":"0.1.415","_id":"ugly-app@0.1.415","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a28e98c1be793c1bd1066c4c3e08df09b9c395c0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.415.tgz","fileCount":1663,"integrity":"sha512-MQOvUEyKuYJ1YNLKGMIUJo9E7LvWhgwstC4MF8vM25kQ/LT1UXAFHwmTb2O6v67rX5Ng8YBHbiLHjvpAY5I1RA==","signatures":[{"sig":"MEQCIBCbKOJpcM5yN1etzJAF21wObj3CS9sb9dLXKU+1Yo1SAiAoHGoBWDUoBsDCC5Lt/J6fwAzHHD3mShuA7kYYu4QaYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12205117},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"82a146b07a6ee6d606ef3c6303b743c39fa3e2eb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.415_1777319959308_0.2744614866666957","host":"s3://npm-registry-packages-npm-production"}},"0.1.416":{"name":"ugly-app","version":"0.1.416","_id":"ugly-app@0.1.416","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d57c46176193cef9d555e13ea38708226ef74470","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.416.tgz","fileCount":1663,"integrity":"sha512-jEVHmfcau1pgDl1Ryk8/l4UAo94dfzPLf4vN+Mupf1EcXHqWNXZmxs64YceDk0fQz0HoOf5kK0WtoePZLUWp1A==","signatures":[{"sig":"MEYCIQCz7j5lUXYrrHTPSOb4QQjO9g1+RpmIFakczPN378T7qgIhAI8WadvcS8LqUP4aucwmCynMbZwax6vUCDbuOLOm6Z8L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12205117},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2573a70d79f2d23ec3c2235d7287d0c940a89ab0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.416_1777320012717_0.18084062679601987","host":"s3://npm-registry-packages-npm-production"}},"0.1.417":{"name":"ugly-app","version":"0.1.417","_id":"ugly-app@0.1.417","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de29dc6ad46b7f7f72a8c24f8bbe4883c5937436","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.417.tgz","fileCount":1663,"integrity":"sha512-7E0/wHoMrxB3Y7qS4IVMGLp8JcDLAgjg5bfw3lb3W6YaEMv1goNp18QQFZl5gp9QcHZGgqIKQH/8+WdL0RtQjQ==","signatures":[{"sig":"MEUCIFUQ5zJtwGVELrg2dx2AYyepAnG8DNGnA0rV3bRX0+xQAiEA2tXtWCziGJC9PCZ3aZ//4qCO4PUeYcPKqFtRXSGsSFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12208242},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"acedab5366b01efb985169857cd0e117ad9d9a71","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.417_1777389522448_0.5664233688080951","host":"s3://npm-registry-packages-npm-production"}},"0.1.418":{"name":"ugly-app","version":"0.1.418","_id":"ugly-app@0.1.418","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fbc13d02140535dd7fff3f9a6f938308bbacfdca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.418.tgz","fileCount":1663,"integrity":"sha512-3jsg2f8kONgT5/gpQpa0C5UvS4SRdkRlDqlRyWaxMv8hO8UrMa82oFNxNjZk60v3MBaoAUV0p8BOyb1BlBnVKA==","signatures":[{"sig":"MEUCIQCPmm04XLUJSISLJELytuwEW8CvomZ12FI4QJZQSuLHZQIgTVdt8Ei+9my1/bKGn1cvOiPbMymu0oWZoVK8dM2fIvc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12210591},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"9e4a187632e96ba1755c4167db09d837d23a4e49","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.418_1777390601189_0.34314718158639024","host":"s3://npm-registry-packages-npm-production"}},"0.1.419":{"name":"ugly-app","version":"0.1.419","_id":"ugly-app@0.1.419","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7e8a621e270b7bc6c32b75d4ab49d9d81f0a1d51","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.419.tgz","fileCount":1668,"integrity":"sha512-hBIw64itxTBMxIN2ZkqcCtnf4yPHSRXigzRMbtkq7cgFxRtuXv72HDY1HUv4kZ2tjFLieJKLxjzIQhK32Az7WA==","signatures":[{"sig":"MEUCIQCle4TLSkE8mg+X1nOwXnD1Q7cP/FYp7EyMHV/HX9KT3AIgHQcukiWaGTBxN27d3fX8FMdnlINwH0PyqUSkxO53m4M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12242155},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a72d93c4bdc0f1d14f7413db5b0a549b56426b2d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.419_1777393663459_0.6778859719652406","host":"s3://npm-registry-packages-npm-production"}},"0.1.420":{"name":"ugly-app","version":"0.1.420","_id":"ugly-app@0.1.420","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ec4616d24d9475d97238c3a07f79c7ed04410753","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.420.tgz","fileCount":1668,"integrity":"sha512-Jxnfr3axrAoUVd1k8ElxYTGNyB7zopjN3Lvl/6ffFqH20xVzkLCDrCPhBrtCbtLjnIBjXlGrOKf+vWqdojrUDw==","signatures":[{"sig":"MEYCIQDcsxW1M44gXynC3fEePT4yk9fCNSoHtCaR+BLqDllxXwIhAOEkWHDtqDeJ2X4+tpvYvRH7j66/xt0s3newKPFNocaQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12241965},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2f145d2af3232b29ed0700b10e5c93ec9f01084a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","eslint":"^8.57.0","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","typescript-eslint":"^8.57.2","@vitest/coverage-v8":"^4.1.2","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.420_1777393733339_0.009881947107925892","host":"s3://npm-registry-packages-npm-production"}},"0.1.422":{"name":"ugly-app","version":"0.1.422","_id":"ugly-app@0.1.422","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8c298234107d82c516482018f77d0e4adcc1f104","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.422.tgz","fileCount":1671,"integrity":"sha512-5Eubj86QyFgzp0/lPxLIQxgYd1oe4eGz978QLTYuVW3cVdDXixbsqgaNuZreK4+2M1tjURLbNWYzNLl1g1iFSg==","signatures":[{"sig":"MEUCIByPt+CDRU3qAs+L9oCsfHvOXLl9/Al4LVfgViJ/AWbTAiEAz7W/28j0yZxkN+fKVF5gpWJ4f7wEF9NzX0mhYveDgMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33976438},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"11dd9991548e40e35e1b30bb1abc70c48e23037d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.422_1777506871957_0.2770375474138336","host":"s3://npm-registry-packages-npm-production"}},"0.1.423":{"name":"ugly-app","version":"0.1.423","_id":"ugly-app@0.1.423","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7e6d3da8ad419afa7f3b955b54fe7fad4d70760a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.423.tgz","fileCount":1671,"integrity":"sha512-ljj5wMIwX3SQRgBH9ISeFaT04DBqcL2Nkp+MBpjGx67gQ6RoIh3AJ4AmXm+qHiGGU0RLrz2GIB25WJPe5X8c4g==","signatures":[{"sig":"MEYCIQCWiGLPtHA/IkpyW+QigcMs/ojbw/WenTgBMX7TScjULAIhAMXu2UoZe4X/MhEeb81x+O0s5NX8QVEP1P/gt0HLr3D/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33979858},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1291e35c1b91a7dae675e72506dd7af62998aa46","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.423_1777515768662_0.5882324592286619","host":"s3://npm-registry-packages-npm-production"}},"0.1.424":{"name":"ugly-app","version":"0.1.424","_id":"ugly-app@0.1.424","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de1d9ba811ce0e5b967c42c3c44c36c3f5164fe5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.424.tgz","fileCount":1676,"integrity":"sha512-yWsQXdGIqrkeoyh85ehQnnlS7TjJG5Isvj6lKllj1rSNy2Colnk+Q3hEfWOjZAUcaPMZG1+qlIKgIzyUWq2D9w==","signatures":[{"sig":"MEUCIQCy37J4/XD7m+dhlkvLGCQ4kY8yPZHnSCIAsKXAOXlc2QIga4DqWvIQWyShLEg6kBu8yiI+3CWRvQ0xAbQ/nkAxKT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33987656},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fcb4fdfc14b003142293a630a29ae99af49174e1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.424_1777515945365_0.43048471279959455","host":"s3://npm-registry-packages-npm-production"}},"0.1.425":{"name":"ugly-app","version":"0.1.425","_id":"ugly-app@0.1.425","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fdba33554f744d186a5e57f5feffebf83de160ca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.425.tgz","fileCount":1676,"integrity":"sha512-KKvwgkJ/Df9M5V3TjPOs8e5iM3Tm2qTenR0tn3gdy314kNqHG8DDbt0bbthVKYzs5t5n6hU0A3f2zlErYrIJ+A==","signatures":[{"sig":"MEUCICLvuhffZp0TjctTZb7cgrxAdyXSGN4fuPEqeVNyeWZvAiEA8OTWZDfsRaASpwJXO26poRw0mNv+q60Ndd3sP2pJIGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33988676},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"31c60f5b5df53ddba667bea444476a01a331a5da","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.425_1777516354594_0.8290647022368929","host":"s3://npm-registry-packages-npm-production"}},"0.1.426":{"name":"ugly-app","version":"0.1.426","_id":"ugly-app@0.1.426","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b5b7f2a4933381c1ab34babe66f897148294a4bc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.426.tgz","fileCount":1676,"integrity":"sha512-Hz3xRK7ELBpe0F5kNKxrPpdeqgva03d+BCQIPIpLSLVmqWoz2cw+YrLyu9e4ZFMpSaybDlNfGAZRSNvkMxMNJw==","signatures":[{"sig":"MEQCIARfbsEllFpuYux6c6VHkr7U6kQb5LnM8BUJsBwpgb2rAiANmudCAc2dhaXR8o4L3YAPoJ6K9rhqFF1pOubFDxKoiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34002779},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"224be65e0615669f29d8d405e3813a394dd799e9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.426_1777532374774_0.8363864843979858","host":"s3://npm-registry-packages-npm-production"}},"0.1.427":{"name":"ugly-app","version":"0.1.427","_id":"ugly-app@0.1.427","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"48a87e0f54fcdf5159394e03ff55630885963b31","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.427.tgz","fileCount":1674,"integrity":"sha512-I3bjkcPMHOb5LkVAMJ+2DLp4Gvr1vDNVSVsUvOTV9PqL0WNUtNO/Dk+y8TZINIFZIPUo4ZRi6q7hbSgddyvwoA==","signatures":[{"sig":"MEQCIBM+4TXLwkLfX6HkS3IB6OfOpwBD1z4bAmHNxMLLeo75AiBbwCWOhZBhZZd2vRfKXeMULgQcJcBfWi+IT/lQQrc4Fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12284076},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5bbe8f282acf25c1e76b974140ca982f59f16bc2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.427_1777838438213_0.03720171729844357","host":"s3://npm-registry-packages-npm-production"}},"0.1.428":{"name":"ugly-app","version":"0.1.428","_id":"ugly-app@0.1.428","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bdc4931f5bdc625c4c783fb27107e59ec6e5e90f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.428.tgz","fileCount":1674,"integrity":"sha512-hNRBdAeQzm/r6hF72+I3GCseWR7Oo9SYkztbGWIxeucnK0aW3IWmZf48dyqBU9bRw1j5bW1z1szwfEcs5NVgtA==","signatures":[{"sig":"MEUCIENHTvHeC9HeshGt1AiwBRnNwVnJT0p37hAWg1IVOsFxAiEAy70V7htp9Avcrfza+Btb5fYj6R1suvoA/kWO9OP+B0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12275672},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"371ffcc00f36e6ae545b329e9c52ab633e546d27","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.428_1777841374475_0.5168617495812278","host":"s3://npm-registry-packages-npm-production"}},"0.1.429":{"name":"ugly-app","version":"0.1.429","_id":"ugly-app@0.1.429","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"321c8c89d4d6164d4df3036cb3511397b2f41e13","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.429.tgz","fileCount":1674,"integrity":"sha512-+1Es4ZeclOvRHPR2Qmqm9+mzV/20kSzrG3fqmEGyhI6LZkZ/jkyXImQf7QagCwQ45eOABq45elu+ygrUbb128w==","signatures":[{"sig":"MEUCIHjzzEl+voMpsGJhkkWhhVWjs/WZZKybf5DhXQy9lKAKAiEAgijYdKs4RvHhdCJJMmdTmhfLl26hjUErd+Ngtv4li5Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12276654},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"801f6b9d5ead3c2fd0ffcf84c173f5774988186a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.429_1777842033994_0.30485192214987356","host":"s3://npm-registry-packages-npm-production"}},"0.1.430":{"name":"ugly-app","version":"0.1.430","_id":"ugly-app@0.1.430","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8e868581951e007042950ff4120bb9865251bd8e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.430.tgz","fileCount":1674,"integrity":"sha512-p1YnFcS6U3cAKAOULzGO/K4TqMF8Kv+tISmk3v3SE0hTGxbSlz01dzrYqa+8X2NW/LunSXEypfr/0gvdkolOeQ==","signatures":[{"sig":"MEYCIQDmIlUSvRLXsbrsJ5PSphnNPAhWUKAWzuIqhujxnWwVVQIhAJe57ghG7bE/4E5v9rBQYESm/hA3Ptu+8yIoyux2aShK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12281937},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4ae8461bc72e53e6dcee3cd082297053c27b52d2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.430_1777843531788_0.545823347998625","host":"s3://npm-registry-packages-npm-production"}},"0.1.431":{"name":"ugly-app","version":"0.1.431","_id":"ugly-app@0.1.431","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0c810460308aae284a57788f4efc7d7ae6c2e483","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.431.tgz","fileCount":1674,"integrity":"sha512-py4K/ZODnIGV1Yv6Sk2CqVnPpS+H5mFWz1qDVtcZjeaLpqT4WcXDiatmyFKQfIgkvLqzA7n0OYTwPxg80cnxmg==","signatures":[{"sig":"MEQCICUQQTSkRku10c5kc1v0ya9S0KOf+Dl/T7gFpNL8QswRAiB1SM3DJ8Gen+3kIULOFiZ1f0Ui2RTuOuFPk1fk8FOeLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12290307},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a8401902319e9ec99d1064144d8a23ac0f5d6ca2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.431_1777844641056_0.9618205803799094","host":"s3://npm-registry-packages-npm-production"}},"0.1.432":{"name":"ugly-app","version":"0.1.432","_id":"ugly-app@0.1.432","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9d6d0e48c25e17a14fc495dee02a833be4161442","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.432.tgz","fileCount":1674,"integrity":"sha512-k1xdXm/MuUyqOOpw8obEINznJJip/q/WWVNYtKOYo/9rNIQotmxiCNNv6WqOGMy38QBReQgwtcetkn3gerluOA==","signatures":[{"sig":"MEYCIQCFcxb4CF2ig19u3D7E8z8RpMXKTolsG/rHT4WyjurA/gIhAMYzn2q4aCWFSzHx+IIIT8J5HUNNOQivTPmmrsl6sbeb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12296426},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e9678f8a969111c87fd8e1b11d9f8330979b9e02","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.432_1777847501871_0.3742087119049089","host":"s3://npm-registry-packages-npm-production"}},"0.1.433":{"name":"ugly-app","version":"0.1.433","_id":"ugly-app@0.1.433","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"06c1912842c26e2d408b17beb73299a6e164523e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.433.tgz","fileCount":1674,"integrity":"sha512-ddyhQfs05hfPvoRuqTQKnAEjCZEeqjqsAk0gqZKW5xFRLrhF/Ae3rxvjQtmwkedSKh93rVwPVtpJv076a2bKdQ==","signatures":[{"sig":"MEUCIQCP/ZdTmRMj+Sulgke52BfQL/atSmGlyUAVSReeAFSE1wIgW4L0IWElfRmmLHB6R3h6pPC+/Cp2Mxq97sbaIT5qjdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12317472},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"8ff771580655e5cf9c746ed4774874f90e82c6b3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.433_1777848728873_0.09372737816495813","host":"s3://npm-registry-packages-npm-production"}},"0.1.434":{"name":"ugly-app","version":"0.1.434","_id":"ugly-app@0.1.434","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3f1e9154711ebb2de8b69b54319b83dc979e9741","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.434.tgz","fileCount":1674,"integrity":"sha512-yQZZ5IZceyDywHYsdmV+CJpiyoWbMFEt04hj4QoMFkLb7OMJeG98DmhkpVq/1UIWNKNFOYOxb8QyZECl4fpH6Q==","signatures":[{"sig":"MEUCIGN7GSfDTg52ymi3rMTy5Ysdgv5HY9uHx8Js1jpw6CifAiEAr6LoyHZ2JdTZisXRVHt6cCT1E3TM8q/xWKYKkru5xlQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12322629},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"3ca9820a3988183183a902f70432c9b9d8324047","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.434_1777849928701_0.44990538003499214","host":"s3://npm-registry-packages-npm-production"}},"0.1.435":{"name":"ugly-app","version":"0.1.435","_id":"ugly-app@0.1.435","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"735f3dfd12fda15077627eb5f062bb887e5e2e0d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.435.tgz","fileCount":1674,"integrity":"sha512-8ttljGVRjc44vJ79VDHmCnAFYdTYdScj2hUlSReWoa337iHojARGuHzwj2YZ0Afa6ZcTVUeUZG2ptzSD6JNnjA==","signatures":[{"sig":"MEYCIQC4wayZnxoK0vKXusVYkUrM6cEDBUAwWHJmz6+uQ8BzNwIhANlC7o0D6E45iHxCedm9AgQCy9Yzx4QCC1MGNL96n4eb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12323344},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"64b1fb3ffdf1b561653264aae77d0019aa90c541","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.435_1777850597147_0.32860696100050424","host":"s3://npm-registry-packages-npm-production"}},"0.1.436":{"name":"ugly-app","version":"0.1.436","_id":"ugly-app@0.1.436","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"57254d018cb701ffdfc84df59c4795462406d695","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.436.tgz","fileCount":1674,"integrity":"sha512-Kts8xgUSvRgbhW4wATJmF8S2myWzse9sQVS1GlGI/HBt7Oh6IW4lMOxeFx7cRn1XUOPm0PE4uN4wldSEg81F4w==","signatures":[{"sig":"MEUCIAx/unD57zVb9yrdQsnFz6fY7WCV2++YXgDvUuf9VVaQAiEAp57QkaEYahCEIwaGmHWZtIvz8QRF2Z9vgjmqlLsHhJA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12326227},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"9b0eb380ac1b9a6a46ec210258776f6267e7ab69","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.436_1777851291954_0.017495806060185304","host":"s3://npm-registry-packages-npm-production"}},"0.1.437":{"name":"ugly-app","version":"0.1.437","_id":"ugly-app@0.1.437","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"15c4a4dd99c780e0c414c6d168c1a873e626b83c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.437.tgz","fileCount":1674,"integrity":"sha512-0WFG/00gwxI2auBdYq6XidonKL270gt5tkXaNmkKf1qodJ+IzG3s70jqKldT+r2/LKRjTFVfX8Dn3sqGdrPX7w==","signatures":[{"sig":"MEUCIGD6DfUIPjZmu07fmEYpqGS56UhA+6g5j7j0tqZZMZHgAiEAxMtb5Jvl03c6w2MZUqWENiWXQbIAUmjm0kanNSNn7jY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12180448},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"8ee289016b800038f88f329916f417ed9727d990","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.437_1777869353373_0.06313542914756409","host":"s3://npm-registry-packages-npm-production"}},"0.1.438":{"name":"ugly-app","version":"0.1.438","_id":"ugly-app@0.1.438","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c984b047e0eb837ec594bcf3c5f842eaff7a4607","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.438.tgz","fileCount":1674,"integrity":"sha512-IUsOOPd6SGyXauZEh7nP5g9Jwtw6dA7RNR4z7IHjT9Mdlg1XhzFPh9PTUHw311GhYkU2ar7y2PArcypVBN0x6g==","signatures":[{"sig":"MEQCIGPolchG7y5CfxnxQ8VOR6bMz1//+4DvsOL4ppgl2RaFAiAHv5pgex2yvg1roO/lwelEixlBABRzuuHO0DVmqSkhsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12147493},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"bb330cdd3662bee6fd6474df65418df1d6df0d74","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.438_1777869981975_0.970876009701894","host":"s3://npm-registry-packages-npm-production"}},"0.1.439":{"name":"ugly-app","version":"0.1.439","_id":"ugly-app@0.1.439","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"df82e58cf9996ee33d12d3c09dd065e802e3e479","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.439.tgz","fileCount":1674,"integrity":"sha512-VmnrvA0hHP4wx53ZswPbpX+hU3RSiP4Jt86ahXh7R/UmGx0wcIfa7y91xEFBw6gu0Vaai7t3YnPbOVgHRqzIRQ==","signatures":[{"sig":"MEQCIAkM5iJlOAl02LdEs3jqs8R8ttMyHspaEHHMAYROdBkmAiAriOYQqeAuyNvromj7pQdT+LfC6pTnu8Jjmpeb3XFA4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12147980},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"8fddf9f74af1a35b167e7c7ae579af4df35c3c53","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.439_1777871893813_0.2636883620559307","host":"s3://npm-registry-packages-npm-production"}},"0.1.440":{"name":"ugly-app","version":"0.1.440","_id":"ugly-app@0.1.440","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de0ae96a304cf55587b06ea351421fb8761363ff","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.440.tgz","fileCount":1674,"integrity":"sha512-kWngquS4s5WkKzi9A9AG50sixdH7qaLfOMLyMJqhSH1I4+2wxB0Rk4S+rFv2oPpWjrm77Tm13M3SVdaaXh1C3g==","signatures":[{"sig":"MEQCIFjlOZIo8wbEH1CcObxDCiPOXct/oHDeB/lCQWFMEn4SAiBZm3w/4tadAN8apoa3OpusdCmEgv6V8QRCdjKWPoFwnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12148014},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b2d1817dfa4895c6f3a021aaad3bad8e7f52c7f2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.440_1777916014994_0.34871210317726664","host":"s3://npm-registry-packages-npm-production"}},"0.1.441":{"name":"ugly-app","version":"0.1.441","_id":"ugly-app@0.1.441","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"586ba5b284d5e65963cf217fb70ada4112b38864","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.441.tgz","fileCount":1674,"integrity":"sha512-mhE1B7DgPXu7KMxGTCKjlobrn9MjG2nTs105bQIsdzpwSg1v4LaQgj+kZdtu4XZ9meBNKeBNVeuwOkUEuwOMuA==","signatures":[{"sig":"MEQCIB5RiQyXrlwmmdI37IW/mPZ3RNjlaPS7w1Yxagf7uXEwAiBYLxz/q6Y4Mgbdno+4aiiT+2+oDZwBqFF9ets9xXMaJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12149454},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"dbf0ebe60e9e0d5f80a498310aaaa242f0706522","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.441_1777942235010_0.6943067815288995","host":"s3://npm-registry-packages-npm-production"}},"0.1.443":{"name":"ugly-app","version":"0.1.443","_id":"ugly-app@0.1.443","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"42b8f834cb27abb42b7ca297fd7ede952b64217f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.443.tgz","fileCount":1575,"integrity":"sha512-jra4BWggCwLw4KdZTuYx2u9RnncXYjTkYHYtn+21AR4mjgvFSm97eNL7zAj8Z6DcO3E23AU6G3TfsJbyeUFM0g==","signatures":[{"sig":"MEYCIQCic7027i4mnbAKPbF0u2r7hOQWI8naS+wMkKMFa1BY/AIhALwwTTC3CDOu1/jp/+tloNTEVnS844g++e63wvLkIF9k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8525988},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"103c289c7dbc4c7ee540f7e17e1007f722fe5cba","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.443_1777958366911_0.2414792502196017","host":"s3://npm-registry-packages-npm-production"}},"0.1.444":{"name":"ugly-app","version":"0.1.444","_id":"ugly-app@0.1.444","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5b285afc536169df2d04c4ed68b42db9878e2474","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.444.tgz","fileCount":1575,"integrity":"sha512-EVpklsSiW8tVWmj/LQGFz5U8tjpgWKNomE84g52t7+moj7IiLAjdskh4nG9ScI1+2FvvPYuh5o1yXGpa7wwQLg==","signatures":[{"sig":"MEUCIQCE6x9YQjGZtpMViwdRetR/cPiCizMMjs/AoQeXtY7XKgIgG5s8iezbW5BLRHb+E2OrHCmK7R38BfoTexZLrKPup1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8542579},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"18bc4f8088e7e03d88cef85ddd0a2047acf1d2b2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.444_1778026163934_0.40315557973042404","host":"s3://npm-registry-packages-npm-production"}},"0.1.445":{"name":"ugly-app","version":"0.1.445","_id":"ugly-app@0.1.445","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"821ff2e9389997a5cadceba241fdbfcba6fa6218","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.445.tgz","fileCount":1675,"integrity":"sha512-kecQRlHRz+cMt/D512mZh1Kf2ZjW/j9rdZs6T/+D/2Q8zBUKFQYw2TqECU0N1e913cMg9VnHDPo+j64QbB9wLw==","signatures":[{"sig":"MEUCIQCEuutv6k3+Osk6yWz12+lq1+KP2l6QPzSr1FB8ijuFsAIgS3+qcAEqZoPzLwdpXgPKrRIJJ/Pxn0IdEAAq8UVFezk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12216919},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"9ebc6a5158fae596d2e7e1953c0d3099a2ca1f94","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.445_1778122476994_0.8336403140393738","host":"s3://npm-registry-packages-npm-production"}},"0.1.446":{"name":"ugly-app","version":"0.1.446","_id":"ugly-app@0.1.446","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d6dda837d4130b37cca842b1875653727d16c5ca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.446.tgz","fileCount":1675,"integrity":"sha512-8oVxtVoHKZOSMOymQFy11KjR5gX95ZSFRdIkG1Onk6j3lMz7PvRZJLsCR591p4qwpiN49FgjSIw0iGQ0HsjYXA==","signatures":[{"sig":"MEUCIQClTIskzl0g4gNdV5fMvV3kyI1voIdfDdF0Z6TDw36W6gIgYED8juL7sH3uLKhJ5q2pmn6JOKxx+H6l9hmiyfauH5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12226769},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"131b93f984c793509bb501df415e9f28c35f5ed8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.446_1778123118159_0.20653617048071427","host":"s3://npm-registry-packages-npm-production"}},"0.1.447":{"name":"ugly-app","version":"0.1.447","_id":"ugly-app@0.1.447","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f9733bbe21b7f981319e870decdc8e2617ddfa63","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.447.tgz","fileCount":1675,"integrity":"sha512-ho/vLz/muV9kuAKBKwn/d/C1nTz6D6jk8zgKXQuCpR9odGHntHIPO3D+zH+bfiCo5PVSHU/qUmLQusbY1hjSnA==","signatures":[{"sig":"MEQCIFckoJA+LCij4U6cDcBEqZNhWZlGGNiFHUSnkIGwTLdwAiBYNWWgrHfygXejmqKos5qGxA5N7P17eQ3HAs3xgDHegA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12227790},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2ff8e5bea26d593346a3b126427e68c24b5a3f57","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.447_1778126271908_0.496440713244539","host":"s3://npm-registry-packages-npm-production"}},"0.1.448":{"name":"ugly-app","version":"0.1.448","_id":"ugly-app@0.1.448","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ab543684d6ec774cf6a184305916266eae477d1b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.448.tgz","fileCount":1675,"integrity":"sha512-OQl/ADYSZUdHMQ+QPK2WZqZDq1w1VUV1JBzpwF8fH1kanXEO26VSaiLwiKT+RRDFdRCU99f8HqQ1IHqc1QVWSQ==","signatures":[{"sig":"MEUCIEsTgdGLRKVrjuVzN5k+edX79rfLIL9lHkEQM159dzXLAiEAtPJjgI06FLVXTP13Bqx7LfiZ7mZIX73S5Sg2tjDWwi4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12227790},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a975b5f8d48fffb78497ecc182f23eb2a7ed41a9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.448_1778126523835_0.9629159912115148","host":"s3://npm-registry-packages-npm-production"}},"0.1.449":{"name":"ugly-app","version":"0.1.449","_id":"ugly-app@0.1.449","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"02ccb1a1d020306b1bcfb234c086672a37956b93","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.449.tgz","fileCount":1675,"integrity":"sha512-PJyq8f3ihbgk4/mF1AgtvO5GwovwyE83/EI5n9HT4Fv+yJh5ayNZ6pVz5Yg7FNRELz8lTNCJ+HIJopmXJH+OoA==","signatures":[{"sig":"MEUCIQDvpUdRwev4+AyHM/lJNXWd/HEFJCsGUksl4VzBo04gogIgPK611oyqvNnBwn7TkFUSK/qEZAWvx35uKUsubJMjR+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12228611},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"d71ff7849d568e7b8603980c151fab5d08f66ad0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.449_1778132529818_0.8071257406229553","host":"s3://npm-registry-packages-npm-production"}},"0.1.450":{"name":"ugly-app","version":"0.1.450","_id":"ugly-app@0.1.450","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"75934cff99fb5c23aec9e59ba10103bf0bec175d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.450.tgz","fileCount":1675,"integrity":"sha512-PhOGw+krSV8luaKalopk9bBILn7e4cWibGmL9RrENgZgXaklm3KZI/jak52TagRJDF8OS0G6vwYyZmtt04qyOA==","signatures":[{"sig":"MEYCIQCqt3CFD8VyxGUlQml8a6IYMTVtbPdzHIBm62LGxvacIAIhANVk3KzH/0D3JMh53GW8sEWYA7jXdFaNkJMq9/Dc6PYr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12227645},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4037c1fa850e5f72a00f2c8f46742235b7dace1a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.450_1778132834268_0.3483040486550044","host":"s3://npm-registry-packages-npm-production"}},"0.1.451":{"name":"ugly-app","version":"0.1.451","_id":"ugly-app@0.1.451","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"547e6fca6de7cea91a439510021c67f091676897","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.451.tgz","fileCount":1675,"integrity":"sha512-aHRBniqgMzGPVYMAxau2lHoKCa2bf1VyBmWM6og5B5QCCqOyLv8AuEldedfVmQyUPSfPUBabB82d0TE5BmhJMw==","signatures":[{"sig":"MEQCIASWJ1qg+61ob2o4J/HgK2FD5w7ZT0QqGFyRfOOA7B+AAiAWKwMa8V2oHCjvSIinyfQH09jjFnTLPmj/aFBMbql54A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12229187},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"c6885aaa7c5f0c035995263f0276ea38f9b8ac0e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.451_1778214899032_0.8188401096491877","host":"s3://npm-registry-packages-npm-production"}},"0.1.452":{"name":"ugly-app","version":"0.1.452","_id":"ugly-app@0.1.452","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e0905a9d796caf59013ebf71002ad190308c1174","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.452.tgz","fileCount":1675,"integrity":"sha512-ZLAiJwdlQxeveuQM0uSrV3n/CJSomRqjZlz9EW4ZMwEyyxEa2aQnRtEfwFnBRjKtV/ve2VtYDaoZcXge8qDzTw==","signatures":[{"sig":"MEUCIQCH16KtO9utpTwztlZPSHNUdZLqIdY/Gd3UivC+/GHs8wIgFCpvtfO6J0rErumrkQSy1gkcsV7qfrwIHm9mI7tB+7Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12232501},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b701b4e2fdbd0c3a3ef4d5dc6e82b3dca07b9358","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.452_1778222093719_0.10675549801623885","host":"s3://npm-registry-packages-npm-production"}},"0.1.453":{"name":"ugly-app","version":"0.1.453","_id":"ugly-app@0.1.453","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bf78248ece579b0498ae438816e1f31f0a51ea77","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.453.tgz","fileCount":1675,"integrity":"sha512-rHl02MMPXN/JsTw7W+MMzAXayl8nfJ+MI1vB5YxkrMTjOADJKR8BW0l7//s7isjKLy32XDNI2UdO7TItuqexUQ==","signatures":[{"sig":"MEYCIQDZ7GW2TpKUY7FZZj+1+pX6KbZpdWPY+kZ5SyfiGu5OcAIhAIQZLyrd58RNuhnLTGr369PXH5GY8W9CQ2CbhWIlD+UG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12240816},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"df619581f105dd1cc9c603da30a3f7c306287ee3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.453_1778223229975_0.3417478778907177","host":"s3://npm-registry-packages-npm-production"}},"0.1.454":{"name":"ugly-app","version":"0.1.454","_id":"ugly-app@0.1.454","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f89f3b900ca813611e4cb4a67e273f3f8f851f34","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.454.tgz","fileCount":1675,"integrity":"sha512-yvpFgfINgKNAa5TBjKnT+67+ERdOQhyb5aYp1e4Mdo6TBWUetAMQy4BCK+y5ycas50jhvvHKE1kUFD9sEJpoNw==","signatures":[{"sig":"MEUCIQDpA3lsxARilCK+SJkBzb3tljaXLSsKttqw4bd2m+Sh+gIgT+R8dLv5nSVymtCKibgeoObw37kwqrwWs05BMvJzyVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12269862},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"9f55d534b7d3568b126c5b3df7037e6f20877178","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.454_1778255474097_0.5282322352501572","host":"s3://npm-registry-packages-npm-production"}},"0.1.455":{"name":"ugly-app","version":"0.1.455","_id":"ugly-app@0.1.455","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7d8b21015a804f415a75d8cdf1eb6c9353bbfd1c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.455.tgz","fileCount":1675,"integrity":"sha512-CpekLzRl30L01htWQM/POPliiId5SzwkDiZcTq+DPs/lDGSCeJWPQMrkCI7HaMRdlTXcwMhatYJf7YWRhcHa2Q==","signatures":[{"sig":"MEYCIQCPBF6QyyzFq++ECxk5aMFz75kGvzstdLND8OpWOC+/5wIhAOeuGyjlV6HXLTKbRiXb2j21VGKhJoV00jFRnlV8WNmK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12276257},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"7f717bfc47a0799e721fa891461945ebecba82fe","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.455_1778292750351_0.56334996209671","host":"s3://npm-registry-packages-npm-production"}},"0.1.456":{"name":"ugly-app","version":"0.1.456","_id":"ugly-app@0.1.456","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"12a48b3cd513d0ec9530e95cf8fb614244c305fd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.456.tgz","fileCount":1675,"integrity":"sha512-qhQP+5NkkMn06ZWUhTGsL+1CF/j9ftktvRqbeIbZ0C4w2ToOVWbQiNMlvuf2kY7aP+QunwkSVz+lbKIDFhiqpg==","signatures":[{"sig":"MEQCIFO8DRs/l6gXcbi+3HGDNFvXgHEXtZk/wVDTGswLoj+uAiAJ/AKLkNKti5FLhutR1BzqfcnpXL7yC07UCItf8Xht5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12287278},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"62f7b0bc3646218979beb49d7932d5abf587699f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.456_1778293237683_0.2938234682536389","host":"s3://npm-registry-packages-npm-production"}},"0.1.457":{"name":"ugly-app","version":"0.1.457","_id":"ugly-app@0.1.457","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"579d15c6ebabea02527e96a790ca7e8f2788fcef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.457.tgz","fileCount":1675,"integrity":"sha512-J+LcPfTKzn7wbLY+CVtd1IgjYLIVshay0LXFKQuPOyoPlZaaFiJ89wll4cp4e053cReZXUNE80b7AqvQSYDQsg==","signatures":[{"sig":"MEQCIHosFLv7z+Hxdr/sQUSZWdJdtDcTU+nRBaJUsAZx+I+VAiAyEraRpgIgEIDbpgeuknrt2LQtpgTlbkHWie5oCzTobw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12297863},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"bef03dd9ff67b028dfc025f198717e488c56fd99","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.457_1778295793206_0.3236854061976262","host":"s3://npm-registry-packages-npm-production"}},"0.1.458":{"name":"ugly-app","version":"0.1.458","_id":"ugly-app@0.1.458","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ec0462eeebef8465d6af0483a37dde3ef761714f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.458.tgz","fileCount":1675,"integrity":"sha512-9Y5BJlTDQlFEP0Qqpx+QyPrqOhFpQBxfVUZDmOoslXg6el0wPAjwBcM9VR0Uzuwm4g26UK5sVhY0x7TYbnIujg==","signatures":[{"sig":"MEUCIFcUSPPsEZVnMEZYIwKahY9s/nFCFhdW+P+WyBvWyB6LAiEAgCjXdtJ/N01wdfbkFIGpSWeSdQSKz+lIj5iT0dzm5CU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12313004},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"405e1e75ad512496e4cc95e157e3b3a88d1c43a6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.458_1778297937099_0.8608504135409689","host":"s3://npm-registry-packages-npm-production"}},"0.1.459":{"name":"ugly-app","version":"0.1.459","_id":"ugly-app@0.1.459","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1379950dcd6c6618f8c45c95691bb329a031e74b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.459.tgz","fileCount":1675,"integrity":"sha512-c7eLMrYhM5OXF+buLh2YCys/b6cCXm++n4d5b5A0ofGzxB5sbGlOtIPsPNlSeS9htfaC4JRgv9Dy9MygrX1pdg==","signatures":[{"sig":"MEYCIQDOtMm+YtWNVBIGwdnQbjoE5JjD06qKF3+3rrGsnSCziQIhAMWu5GgfGKA1Ab18/eW5tkursUK4YbzWaeV9kMC5AST9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12314941},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fb17581834fd6395844bda2bad9e8ed8850bab7c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.459_1778347062728_0.8754348259457938","host":"s3://npm-registry-packages-npm-production"}},"0.1.460":{"name":"ugly-app","version":"0.1.460","_id":"ugly-app@0.1.460","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4466904a0e5575597723e150f30b43bf8e8a261e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.460.tgz","fileCount":1675,"integrity":"sha512-iiGHRxPO1PXHjb3ajfwu5jZ6Saqz1e2/dQVn0btya7JyuQ1XQaoI10tB1OnFgJ9LWWjNBpWeBZPO7Y25lGEtAA==","signatures":[{"sig":"MEUCIQDE38B21GX9fMZuAlRZqx1QizCn+fMDr4PS/LFw+rG87AIgfWVpUid3o+UyhWsRV7lMNMgKM7UiCNGT+SyomHhtt08=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12317928},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"62ad51e8ccc3a5eef068a1922a920e8cbe17156b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.460_1778383331067_0.7153260082777784","host":"s3://npm-registry-packages-npm-production"}},"0.1.461":{"name":"ugly-app","version":"0.1.461","_id":"ugly-app@0.1.461","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"693297243d2b8b00b41f64ab602368fff6001842","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.461.tgz","fileCount":1675,"integrity":"sha512-Raa8GeoKU3K6q79D5f19uKyJ3ct1w+//FVuCf4Si07WMOEUlXaqDMa2yN7J3nlbpo3J2y6pQtP8CJk4p8s0c0A==","signatures":[{"sig":"MEUCIQCXBWrLJAa2Zcg5z8viWzqztecrJaxL3588L+CfqeriWgIgUppp+g3HEG6rV/9EMGe4o1FMgesUa62jkk3P7p/E7dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12318424},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5d3c2b6505301c055637597b60edf1456f45ff9b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.461_1778385524986_0.4582523992384211","host":"s3://npm-registry-packages-npm-production"}},"0.1.463":{"name":"ugly-app","version":"0.1.463","_id":"ugly-app@0.1.463","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d5d92943909805abdcd6e2023fd5c58ee7adc308","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.463.tgz","fileCount":489,"integrity":"sha512-P2Jo33ks1GYFgjenQROs3QLtzZ5cJzphgiJ3X6LMHZt2lMHAeI+gC7/q5GV/NLfJsa8zlZGiGnFjJL5EA5/4fg==","signatures":[{"sig":"MEUCIQDYzTQvACRDgZPOrvfH11YZqJqLGfmiOyRks8hE1Fds8gIgCoPHndg1VNgNIIfFojXGplJisN+MVriZWGGOs5BmA0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8552250},"main":"./dist/server/index.js","type":"module","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"4d864e563982bee52ae40bfa946efcd0ba3696be","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for building production-ready web applications. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + MongoDB stack with built-in auth, real-time WebSockets, AI generation, storage, and a CLI f","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.463_1778436216069_0.7902482273734373","host":"s3://npm-registry-packages-npm-production"}},"0.1.464":{"name":"ugly-app","version":"0.1.464","_id":"ugly-app@0.1.464","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0915a0bbe950d9d044f14117bd62629d29e5e2b5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.464.tgz","fileCount":1676,"integrity":"sha512-XWSRxI38+daIVGhW1io2Lxtks6r8FAuK3YW0O+TdTOa0483Nqms4g8+3LW95bxdZrFK2xgb8iIVsaV688WsfFA==","signatures":[{"sig":"MEYCIQDVYdiIbuYfiK1L8CglG1ukn17TxhbkqBk6Lk8bJT/yQgIhANlRBDaepQhfEfcPlynbEsorlEYWA7CXy7av5jTcPcpp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16731246},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a5c60468907fecdbf672a3801157774516c3d9cf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.464_1778436534715_0.88173583399155","host":"s3://npm-registry-packages-npm-production"}},"0.1.465":{"name":"ugly-app","version":"0.1.465","_id":"ugly-app@0.1.465","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d950b365d81763048fff1ca976551a704b35bb8a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.465.tgz","fileCount":1676,"integrity":"sha512-Grk0uY82KHY33CjOlO44s6oAIYljbIR8/EX2TV/iq4UZP3NA3SzZY/yLxpXHlQu7MlxljhheoYS7xb3z5abTHw==","signatures":[{"sig":"MEUCIE7/+sloI7GCX4EvuyUE86k86lOlHabNyN8+08GCC3OaAiEAtL383MFI5zrmwAMNfx70MVLH0OIUOvQ06yNmrIKt3AQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16733202},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"586a7b8744c604f81c9d4a937ff37f9fb4e228b9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.465_1778436727960_0.2849951684005212","host":"s3://npm-registry-packages-npm-production"}},"0.1.466":{"name":"ugly-app","version":"0.1.466","_id":"ugly-app@0.1.466","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"976f14a3ed3c9afd05835d951a1fe8b086df0c3c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.466.tgz","fileCount":1677,"integrity":"sha512-C1Y8PvdCSBtXMgnsPp0fzCJ2gPzo7Bdguy8KXVijyppHu/sMn/Qk18nfz/71VmOrzz/T61zsUHfo5fVBTsSovg==","signatures":[{"sig":"MEYCIQCA7AN+EFr76EFYELpkqYMDnaQZ2KJXGG0oyMLMRUJxPAIhAOHQqpJYymJrBoWXnNYw9/LqVW2xlmCcvX5nUiuTmgQx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25494230},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"ba7e43ff10294dfa59183b1a9ba0575a3ca60931","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.466_1778440871830_0.5313411204980427","host":"s3://npm-registry-packages-npm-production"}},"0.1.467":{"name":"ugly-app","version":"0.1.467","_id":"ugly-app@0.1.467","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6fa35a4bc8c864d39957069235a00998214fc28f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.467.tgz","fileCount":1675,"integrity":"sha512-FU5FHA85qDhheB4KGVB48ma56qKy8o0eEXCv6lMfmdujiaVX+SVdJjNEhQOhCztYTBXsIFXgNT23vWW7A7/+vg==","signatures":[{"sig":"MEYCIQC5TQrqPT7HBp1GgaeofDEgpsY4cYlj4JuXCFOLtfWnhwIhAPivc37yU4Hg2EirtprYm615zSXfXRS0xdUflre7jlCQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12329645},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"5198612ec4caaeed00c75f274d77d77d7ac6b904","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.467_1778442291711_0.6594012711533499","host":"s3://npm-registry-packages-npm-production"}},"0.1.468":{"name":"ugly-app","version":"0.1.468","_id":"ugly-app@0.1.468","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c57183e1c35b19ce037e93b733af61e768611816","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.468.tgz","fileCount":1675,"integrity":"sha512-ABCa4xX0iIO7eXD0Ae4JyP2WcNosJAh4CmaVY14TfEo+2asTW490Dy/UNtGsisYUQV3Gv7yb1ePWcUINSHclyw==","signatures":[{"sig":"MEQCIGw1rGslpnz9o2TSVba+vNo3b5p12jIfjIvXVzPYM4bEAiAhJLsmfECO5NE0nE4E7v9GA3E7Z915658huwbM9g8Jzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12332096},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a9c4b272bc974ff4330c19df8ea116003f307872","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.468_1778481516537_0.3106242374057848","host":"s3://npm-registry-packages-npm-production"}},"0.1.469":{"name":"ugly-app","version":"0.1.469","_id":"ugly-app@0.1.469","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"05b25c9b2c6827783501e91724306d65e3e47a8f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.469.tgz","fileCount":1675,"integrity":"sha512-mpf8SLDvXaMr/bTPD7eKqKLNjEsRWBQ92yiydI2gXVspG0l5IT9gfjQETM8FM5Itlk6/7jty1oCA0xxd44JOAA==","signatures":[{"sig":"MEUCIALM/h7aO8bdcPbokc6De6zvP13GDMHFuIVgHkOXThrGAiEAkhsecSOx+M6ncOtX3cA8bTnfuEgcHGH5QRDG+XEVOzk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12334771},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"d77564584bbecb8f6ae2296839c86f8067e61d11","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.469_1778511646869_0.016385652006714935","host":"s3://npm-registry-packages-npm-production"}},"0.1.470":{"name":"ugly-app","version":"0.1.470","_id":"ugly-app@0.1.470","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3ceab0e7e30d2001d78997d23b0fa0b878b3c764","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.470.tgz","fileCount":1675,"integrity":"sha512-Dsx9Cr9qpBF5dkSYmtnQBZoBhFzJtBceXLx4IWYYX3dfRxARNMdoVqTyfwUFHUXDK1ILbY/Kvt1BZ8ZPjkQReg==","signatures":[{"sig":"MEUCIQC269QZKHX4qm/0lob1Cgo9wb1bfzvUg/UC+YT5QcHWcwIgHorDL2LNXT+2uo8tkpfFGr/nL4KFLasyEbdyG7L050E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12335836},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2549e724107fe7ea35133a09376579e9cb7c07ff","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.470_1778515165317_0.7172882923000898","host":"s3://npm-registry-packages-npm-production"}},"0.1.471":{"name":"ugly-app","version":"0.1.471","_id":"ugly-app@0.1.471","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d008c591304a49b0d8dcc7e0048b8f888afce4ef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.471.tgz","fileCount":1675,"integrity":"sha512-ngfotTekOb43gvNmqYLXAuQXhGAw+pqlnZWj9FkU+hLI7lEibXXlmKAxN+CxqLpBrRWKzqf6v7mtWNfmF5c/UQ==","signatures":[{"sig":"MEYCIQDGvkNFjcryLjTPiE1Dq/AYvsNQyGY5hdkmTib6J+AqZwIhAP3+QT6jYRIVrRh5PEOt3Zl5iyZyvPdzCye7ATwXLWhV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12340070},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"b33cfe161afbe7cf9a597ee71e758881f16848a6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","sprintf-js":"^1.1.3","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.471_1778640697423_0.48172537162776585","host":"s3://npm-registry-packages-npm-production"}},"0.1.472":{"name":"ugly-app","version":"0.1.472","_id":"ugly-app@0.1.472","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c1227a7aa2797e7b1b92552849c0a16606022792","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.472.tgz","fileCount":1675,"integrity":"sha512-oJLJUDGIT/WRbBz77DEICP24miv0wvBUv6HFiuimiuIGcmixaCH1jTQ1JFJxT9rS/Z2PvvSIifkSpYVAQ/QZUw==","signatures":[{"sig":"MEYCIQCllSX9ak48RLHR7bM3DvxKVNp2yS5UfCTn2rhbAE3h3gIhALW8j7u+tmGFjjz5ucYkAXit+hGjduyVtBDT/Ze2NnSP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12340070},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"7446daaacbb4d323298bf1d2fbc857d3b1a67310","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.472_1778642719747_0.6730380612786018","host":"s3://npm-registry-packages-npm-production"}},"0.1.473":{"name":"ugly-app","version":"0.1.473","_id":"ugly-app@0.1.473","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c5da656e648d1a4761084995a5deb43de724ab9b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.473.tgz","fileCount":1675,"integrity":"sha512-RVXmSN4xwbo4RSkOFGXFTJu1FH2tmUDJrDywWACNU2gTmeccAr49nGr6UWPQZxxU3C/O1wwWX377Mn4i42L0/g==","signatures":[{"sig":"MEQCIA9cYb1BX3DEFZGX1YNClB/FBVrObHm4EL+iz5kWS98CAiAlFKjNhE2Tn0zgxY8hosRp66Gw/tYtIYm2BPUkjVBQmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12341931},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"1057018c4c3efaa18bd0b210b7b54f3f4b4a2d17","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.473_1778906863968_0.8079266687161757","host":"s3://npm-registry-packages-npm-production"}},"0.1.474":{"name":"ugly-app","version":"0.1.474","_id":"ugly-app@0.1.474","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1aa308bf03683084911ca71e61271952ade31eea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.474.tgz","fileCount":1675,"integrity":"sha512-tvb66dEMoRzb9xHlfnEc2boFjgnglcE0P5bkgOlAAphahmpCqd8mzyU3Jqjhl9l/uo7+hH2HtcIfYYY+xyPpnA==","signatures":[{"sig":"MEUCIGTUHCcZNOKIrP00yXoz3nw/0Z4eA4SszJMmyq7SzIUzAiEA8OvOydbVzJ7LTSc5Kre0XjzLXYJ60fU/nPmQaCHNGBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12341931},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0643f801f79905223c03fcae61977ab7f00c3a60","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.474_1779041119100_0.9553293851534226","host":"s3://npm-registry-packages-npm-production"}},"0.1.477":{"name":"ugly-app","version":"0.1.477","_id":"ugly-app@0.1.477","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6b4e9be67f88e2c27032e30871d761122f9b02c5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.477.tgz","fileCount":1675,"integrity":"sha512-kyViWc4q3NeydMsAbPE2c/THtVbZdee9o/Ae57s9X4kW+ISkBzcPFhnPnOTLP+mrqMvo4XUUoli9wF+GfJL3zg==","signatures":[{"sig":"MEYCIQD9G7Sheu5yhRxhkuX8VsJrXLtZwT35vQ5KjoFKAopHsQIhAKjae5O/4HrIFNUpqLbOD46TDjCPnlprfCLOLtRutsGD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12344248},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"7c0c29f2e918fe04188890722b293eca2c6a4063","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.477_1779577321865_0.2001685707632661","host":"s3://npm-registry-packages-npm-production"}},"0.1.478":{"name":"ugly-app","version":"0.1.478","_id":"ugly-app@0.1.478","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ccd2b340ee9b8f8470b0c60a8955a74e604b3a03","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.478.tgz","fileCount":1677,"integrity":"sha512-a/I4Iho0oFBh6byYqUROBMY7nT/KNBHelTMHuizBAwOwcjT8HBe7YTKqI+y9Co/Rn9tNwg4dt4A0Y7ZguMbTZg==","signatures":[{"sig":"MEYCIQClrxZwYWur5oYt+M8wZRyvX/wsOQyIVNPcIDbei8W41AIhANXWY6oMb7sQZcBQofW04OorxOf/IJLwVNqqXRPs04b2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12347930},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"297fd13c9c595699b84da6e07d4526e5f1913295","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.478_1779578222993_0.004494211593803588","host":"s3://npm-registry-packages-npm-production"}},"0.1.479":{"name":"ugly-app","version":"0.1.479","_id":"ugly-app@0.1.479","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4b44d612ab443926970b70962b889acfc216d0ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.479.tgz","fileCount":1677,"integrity":"sha512-obQ0e6+l/098kUloU5sgjYnZOlD68z3wfSKzJs5Kk6ZQ+POKs7doJhOSyGM6SsfDEK4p4KDfDsLykwI1qqE8BA==","signatures":[{"sig":"MEUCIQDnhZlqVDnk8winre8/rRaFDwdJeN8bjCrE9jJ4Z7IICAIgH/GNcEg/ZXckkQiw+Ye1oD21rwliUUtxgWZZzwDgzj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12350292},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"035b0af3aa5b4c7fadad9f4ec6992945b6e4d580","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.479_1779588432158_0.5646359690632263","host":"s3://npm-registry-packages-npm-production"}},"0.1.480":{"name":"ugly-app","version":"0.1.480","_id":"ugly-app@0.1.480","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6f4de48b7d00676c050efcb06e27a0c632bd82e8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.480.tgz","fileCount":1682,"integrity":"sha512-yEBGQEVVJij8lo+7o1KoWetQWRa0wWZH5EwrMf9GdR/BGPiJF5GerMiEHTJ6hS84H8kCgAcaXJcue7HgjwLkpA==","signatures":[{"sig":"MEUCIA4HSpwWx16v/esjG5tSHB75T8Uu+r2CZC7psuUAch0gAiEAlGvhXmhrmh7LDTscardF7P8wG9N/svcNz33sjMvpg1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12358392},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"521a59738903cc042a893fa3875d3ea510c09cef","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.480_1779597334112_0.8281033933517401","host":"s3://npm-registry-packages-npm-production"}},"0.1.481":{"name":"ugly-app","version":"0.1.481","_id":"ugly-app@0.1.481","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cf501b795e6377140f281ae96e3d223a4013e535","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.481.tgz","fileCount":1682,"integrity":"sha512-JIDxuaE2urrIDzfV68wFgcu44ahTph+ZK/KgeFFvzP+n2jdBEWkcw17NjuiSaZZPX9OuiUKEc2n9j2gVgy8LSg==","signatures":[{"sig":"MEYCIQCSexm6b7cdz+NJWcH1el5BVSY7T9x0hi0qe5frhJ7EhgIhAMT5mmVqD795l62pTpy34GTSSgNoS1mAHe4k+apRm9J1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12355725},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"fc323597b7f2fb689cd33fed60c9dde63a6bae4f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.481_1779600618479_0.9213199996984511","host":"s3://npm-registry-packages-npm-production"}},"0.1.482":{"name":"ugly-app","version":"0.1.482","_id":"ugly-app@0.1.482","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b3bdf9af06bb5401b2cc3dfbb4cda240a6214a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.482.tgz","fileCount":1682,"integrity":"sha512-R87DD2h6LYDDI2xSiiD2rAmhvXhHjNjwL5RMWrb/kThRwn7W9Ny3lfYbMw9FJe3XpA/u/Bg72qDmyUZhVb5N2g==","signatures":[{"sig":"MEYCIQD9JDzm1nljB58Od8aMwEJr1CRkY03sFOPetZAKC3+AswIhALxVCb732rOfc0pv32vkRAWlMojkzoxHi9or8iyuaKQK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12355725},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"155aee6da6d75fefd9d199ab1edc0594690b56ff","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.482_1779600857291_0.740364247421534","host":"s3://npm-registry-packages-npm-production"}},"0.1.483":{"name":"ugly-app","version":"0.1.483","_id":"ugly-app@0.1.483","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"afdb09a26ff7c0cdd351b927efe0c264f186c385","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.483.tgz","fileCount":1682,"integrity":"sha512-k9MZrADG8XOOqyGmkwLDZKKCOe75alGkMKKGlxbM+Q0vmKg88Qigb/PP3QgSZ/+g3k4zuZQBqaNNQ5d98QLaSQ==","signatures":[{"sig":"MEQCIC9MCEF9b/Rx98wLGZjx20T6hT8q+0mPCGLOwaPEFG5HAiAe5AZHR9flkGnhO0QeRFWE+S7RWQTeFZoQjrDoAq4Tgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12355989},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"6035e432eabf5ac45bba7e7944d6e18f6582dd5f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.483_1779668325800_0.7332027535173806","host":"s3://npm-registry-packages-npm-production"}},"0.1.484":{"name":"ugly-app","version":"0.1.484","_id":"ugly-app@0.1.484","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3b44d4b4148066247fd7c479658d8e5d830e679a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.484.tgz","fileCount":1682,"integrity":"sha512-B/v1lmFqm0nbcufXrUI/Z4mWGQLTQrLlazIj4SuDnMfrYdOF2dLjpEyBKZxnlbovIoEDiHyw90EEzt8Q11XqCA==","signatures":[{"sig":"MEYCIQDtrjiI0DgnGHghHuXOk52NhS1iZ4hjEPVEBkjnDAcEJAIhAKm4qj2mFWPE1RmlmoYekeKNGkqg4Td37/Bfm3jO61dt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12357775},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"77d57e42a35c85fcd331494897cd8dc48638bbea","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.484_1780192580283_0.02708371126803444","host":"s3://npm-registry-packages-npm-production"}},"0.1.485":{"name":"ugly-app","version":"0.1.485","_id":"ugly-app@0.1.485","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5459648cb940f9ce8f16e55db20a9c028e6c940f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.485.tgz","fileCount":1682,"integrity":"sha512-v10jC8Kh8EB7EgZ4uqhUU0jewy+lWRTPrGEpeFRVGQoAbQa2yZEIW5rP8TPjeuqdNxUWq7zIgi9JVDdZAAYwIw==","signatures":[{"sig":"MEUCIQD/R4uBZMuzEdfqCcazxhHc/Jk2pgBKezg/PX774FK7ywIgPg4CPJv1kso2eqVVWfQsrlvaV9tQHuVg4mJkM+p3whc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12363254},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"6e61ddeed0aa567a9db8bc4ffc0630060616bc17","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.485_1780195502393_0.046366437081074574","host":"s3://npm-registry-packages-npm-production"}},"0.1.486":{"name":"ugly-app","version":"0.1.486","_id":"ugly-app@0.1.486","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"301ea545de95a52c0b7b2ade3322db50ba911174","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.486.tgz","fileCount":1682,"integrity":"sha512-9f5kzf1nc/mN/31ED/UudIgJrJRdzVORJG1eThDh0H+P3268MDJRLxnRu7XVzHNDN+CxMs4+ofUaG3dBoUGQRg==","signatures":[{"sig":"MEYCIQDIwF4EBKO/W/cTYHsXLckAk/MSBkrpSe+d429a5FPQuwIhAJk14bPMb0CGNsYsi1AqySvemrB4WMwQBl3Tye4JuxNg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12369231},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"e375e06f374a226cfc4af3c113fd4fb16b0db715","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.486_1780207292270_0.37749209042047926","host":"s3://npm-registry-packages-npm-production"}},"0.1.487":{"name":"ugly-app","version":"0.1.487","_id":"ugly-app@0.1.487","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6896eb66685102bf2b3a1c1efb2e103679fc5ab6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.487.tgz","fileCount":1682,"integrity":"sha512-4CyF6V7orQBMn7hIrzq1vVyDLQuNKqEgSI5Tj2lDVM+DO60x3u+/WtFJWq5lnk4bT9FTYW10WykbIDRcugoEqA==","signatures":[{"sig":"MEQCIGV3mWfmNOA1mKA8Oj2bvDIDZox+psVPoTMorlzY0rTlAiAwTGsdosPHbUCNR2N37txWgxF8z0v0pnLHmntmLtJV0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12372152},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"153a0069c66d30c9dbeeafdc6db5a12f3ce569b6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.487_1780260993428_0.5059456041116142","host":"s3://npm-registry-packages-npm-production"}},"0.1.488":{"name":"ugly-app","version":"0.1.488","_id":"ugly-app@0.1.488","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1a12dd95d524ca73176a7ed4ec46a7701ad572b9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.488.tgz","fileCount":1682,"integrity":"sha512-JT4acIEFdyZ5LEcdiIERh7kv4xNfFIHSHmvCh+NbLaBvSbgdWX7x5yQpxFAgB29yT7GM4ZdJ8qfn7SDXcZ1Ydg==","signatures":[{"sig":"MEUCIQDquG1FB7jnOyJcAo4nV7uezfOGqvY05xb0TwP0EhZxcwIgXkAa1sVIgFDigWAyxLR4QtfJPGkIb5L9zsr/VA2FKMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12375674},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"28de899d9a3727e94ed87caa1ec3e65a4af0d5fd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.488_1780351273280_0.48603675449549133","host":"s3://npm-registry-packages-npm-production"}},"0.1.489":{"name":"ugly-app","version":"0.1.489","_id":"ugly-app@0.1.489","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"310c0f299a33c14f16a77294ac91f3b1b1d50d3e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.489.tgz","fileCount":1747,"integrity":"sha512-yopRvfJS5DHjzABafMtxc4aj/097hLPgfGgcRtNdd1qhUph43qgePpXkhwQlLlEmOXIrwQydT+xS79Jzz67Y2Q==","signatures":[{"sig":"MEUCIE+thgo7o1P8Nd0a0wjBolG1zsPsnZZ84mUmnyK/pqOMAiEAk4aO+qDV8M1oNZUSA5f4RCxHkY7OxXabc9wDuF0wznQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12486253},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"332e00cecb0fe1848bce40ce76c1b4f368ecf986","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.489_1780354130889_0.7415705535321955","host":"s3://npm-registry-packages-npm-production"}},"0.1.490":{"name":"ugly-app","version":"0.1.490","_id":"ugly-app@0.1.490","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"40d2f77ec84a0bfe3a42e6e0630e12ce9048a907","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.490.tgz","fileCount":1750,"integrity":"sha512-XaHoeOmYY+1xWL94UF1u1My2pbanfSjcUYcHoXYRtBvteDRMZIraW/B4dUk+4VIpC0DpMIbMyJ01LiYHFPHzdg==","signatures":[{"sig":"MEUCIEvLR4Sp9g07dUbP5wQGJvGkkomHScwSGZrg3X/4apQxAiEAxYY/Jxv4LCt8jAXrQgoRaqCatyLth2pYHgGeVpNu37s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12501030},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"a8a128530e8b6877609b5710ce366fd9754b8477","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.490_1780354812290_0.5142814722359965","host":"s3://npm-registry-packages-npm-production"}},"0.1.492":{"name":"ugly-app","version":"0.1.492","_id":"ugly-app@0.1.492","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7e441e90e20084791b669e049ca71d2e5d054c43","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.492.tgz","fileCount":1755,"integrity":"sha512-YM2PsEl0N6Pls5v0jm3Cj4dJzgVwGKvYA9BYyKFkx0IN49m04AluovFJ/q5i3fTssNy12Cw1UzG0Cw1tclq/pg==","signatures":[{"sig":"MEYCIQDMpcM8AXRRw8Ne9Lj8etM0I2KlaAnA+F6p7zqvXn3VMgIhAK+erfIqaMuyKADbWk2rL0J+iR6mYsnN3HKFoggYnr8j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12548684},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"d0d059e3040f0d6ec3c4d49a4ddb4f6fe94996b3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.492_1780383581748_0.05446135465434443","host":"s3://npm-registry-packages-npm-production"}},"0.1.493":{"name":"ugly-app","version":"0.1.493","_id":"ugly-app@0.1.493","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"36c6b3639675a52d606093bf7a30acb877bb82de","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.493.tgz","fileCount":1755,"integrity":"sha512-lpu0+dggImvgqVW+nYluAilPBx8QLqK48sXbDPsRN8mEIJSU+p82hTtKcqDZFqXkE+uX8aA4eORDutt9hPGkmg==","signatures":[{"sig":"MEUCIQCj5cmoOH3uYbm7izKnuClLNTMVkAVqgBZIS0us9zEYsQIgNyUO5np0jUR1LeG+UQ58nWnFP02ay8dYg6pJJo/xi7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12549023},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"7266da9137c95725bdff621f2f2a320b0fd6c8f9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.493_1780810084432_0.6512700846180874","host":"s3://npm-registry-packages-npm-production"}},"0.1.494":{"name":"ugly-app","version":"0.1.494","_id":"ugly-app@0.1.494","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"75b020ce0173c95f64f70b8ca0554f6b55e9d895","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.494.tgz","fileCount":3614,"integrity":"sha512-U4tl7U40oqZq+ohi57pXk+hEWIgN+pj+V/DVCTS0DLbl35jQNvUk9mCGWHseVH+GlVbsF99DRCDRvjlFNBhJjw==","signatures":[{"sig":"MEUCICKtorUEdjG/cprJAZGloUVYHEMzJ1XmixpuxpKyCY2JAiEA3TgvUNR+CQGLgWSlQz7MohtvdG3zrftVjrjEiJe0FJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88758122},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"0d75a16e01c332803c721c9c8883269c8fc33160","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.494_1780931223074_0.1382642941514265","host":"s3://npm-registry-packages-npm-production"}},"0.1.495":{"name":"ugly-app","version":"0.1.495","_id":"ugly-app@0.1.495","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"58e0d33985a6d48a0cd0e6d6209ac0426c5fa879","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.495.tgz","fileCount":3624,"integrity":"sha512-CIdDd+ReYVd27UisqkguPGQp+yNQ4Xd005XnSiu6pAhcXCdkzGXMgG19Hx3ErcOyt5ZQeDx4JQ3HXbBiF60n6A==","signatures":[{"sig":"MEQCIFjsD5DLL6/Wis8Erx0WtUZho3I0MMpDT2GL2IiRNke7AiBdRbDGWHBnGZXnlELhKSZV4wrbOMRKFONCmkfS5lgjmw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88865408},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"3ebecb3110c026cce08fca9d89c60d22786764af","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.495_1780936346245_0.34516940314220124","host":"s3://npm-registry-packages-npm-production"}},"0.1.496":{"name":"ugly-app","version":"0.1.496","_id":"ugly-app@0.1.496","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1354f1813e5a3b8d360d1f42ae4e8b4bab11edae","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.496.tgz","fileCount":3643,"integrity":"sha512-zQXJxcF52Oh0QUv7Ss28EYefY62oUr4ODTNbIbiRM6BU7fMXdQqKdH5RHhJcLBJg61owiNVL2KphYsDoNsnkeg==","signatures":[{"sig":"MEQCIC26KhhwidMnVRInbV8NS+UDpNbaPf3rxM4TnUhw+1WfAiBAP7b4Zb7xlD8MrnOiD/oouaGf9MUvbBLAmSat7XrtLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88903377},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"2325553b7d50d00509728e1a2dfcfd2bcdc6a571","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.496_1780942297500_0.5532714426272118","host":"s3://npm-registry-packages-npm-production"}},"0.1.497":{"name":"ugly-app","version":"0.1.497","_id":"ugly-app@0.1.497","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"21f2bf11751e28fc9b66951f70663d2506273950","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.497.tgz","fileCount":3653,"integrity":"sha512-fUJQjACISabdBq8uJzUVnj1cAyf13hvX4+X4dN1Ptc9uMfoRhO0+EXXA3TysfouJcvLs8S4U/7aeZpnwUW1QnA==","signatures":[{"sig":"MEQCIBAxUj077t8f3XGZ6Lgi30hAiXcLXBAOd2tkHqU9nW5xAiByhgV4CRWGkxZs8CMQ1K93e9etBi1/57z0yBYRUiievw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89044261},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"95072feb5273d0b43388b7fd973799f3cdd73e2a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.497_1780951395707_0.8882031604694354","host":"s3://npm-registry-packages-npm-production"}},"0.1.498":{"name":"ugly-app","version":"0.1.498","_id":"ugly-app@0.1.498","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2403e5a0290191f2939b7a6e86c4fc0e96aa387d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.498.tgz","fileCount":3640,"integrity":"sha512-w+XbJh5rbjE7KwGPJTspfqN/yoWQxn7Pry7ZDNpHhLzw0GJuC3wHrKd/ov/idc/ZbMdBSk8rDiPCQc7CIA4qCg==","signatures":[{"sig":"MEQCIHP4nKGv6nMByeOsQ26QODu53goStgGv9MUqMUrk6/OQAiBPa5Qs5kCyTrr9CAqOA8rUT2poo+fvqNN9r4hlJ7aQkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89059189},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"055d0b68b854ffab2c33fc5b002ceb45899e0671","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.498_1780978270926_0.6619153466545746","host":"s3://npm-registry-packages-npm-production"}},"0.1.499":{"name":"ugly-app","version":"0.1.499","_id":"ugly-app@0.1.499","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cb269111bf83615fa6a08c2a923af04df9c7d761","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.499.tgz","fileCount":3726,"integrity":"sha512-2LVlRPJC63UpjfOUx6EUJb4Kfjc78jIisduvMswPiBH2aPgOnaQmTeO4CPJDllv4GtwURoDs3A8Dg3OuVtdU2g==","signatures":[{"sig":"MEYCIQDmXu7AHQlVzzrIEgY6b5b2yLIWmY3BqUJ8ho88NU2HEAIhALUmwuF/Nmaw2fTzAwPvklF9wHB2kY4+Ynv71jNgdqVz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89302310},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js"},"gitHead":"009695807267535efbb29a76fce58cc7ac53e3b4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.499_1781144881732_0.1520904770088527","host":"s3://npm-registry-packages-npm-production"}},"0.1.500":{"name":"ugly-app","version":"0.1.500","_id":"ugly-app@0.1.500","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b023b5cd39441be4addec29832b77faafdc933de","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.500.tgz","fileCount":3726,"integrity":"sha512-NI3gzYNFRmbpd4wcv57U+sblaR9rodxd2c+qxfPz40VIyWog/YZfPNGv711m+4k3n0YtOTiSeLEfCy8QimcnJg==","signatures":[{"sig":"MEUCIGHPrHcf6jUMJV14F8N8QZoNQlKv3r7K2s69kcq/LDiSAiEA2exEji15i3q9EgFzJ7b82Dmfk1/HieQ9zYyOJXrFOUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89302384},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"f8c92df9c0a8c6a50715d980780ba04ebfc17bd9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.500_1781145078076_0.21252619239553172","host":"s3://npm-registry-packages-npm-production"}},"0.1.501":{"name":"ugly-app","version":"0.1.501","_id":"ugly-app@0.1.501","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"016d1f389e9306b53c93e2ced86eb40a1a4d62cc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.501.tgz","fileCount":3731,"integrity":"sha512-+mTE+NY7Emwb10Yg41PXFH9FL5wAuzSqy2oUCovyPdNvXXQkFwpT0o87f8HhT/lkD4g9LBwjwEd11bxlOgL9Tg==","signatures":[{"sig":"MEUCIGxXzeGIm/aYucwm01DmyRIy3VePC5ybAI8EMa+uk3m8AiEAl3L3xdp4D0xxcS8gS94QuFSoPNwbq+Zsqlicz71OTw0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89332103},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"14048b7f9a69b252176a45143ad9745ecda1d2cb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.501_1781157570410_0.9935060910090403","host":"s3://npm-registry-packages-npm-production"}},"0.1.502":{"name":"ugly-app","version":"0.1.502","_id":"ugly-app@0.1.502","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dcde4f8de0f08f546724a236ff19c32be4040f31","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.502.tgz","fileCount":3731,"integrity":"sha512-+LZBN/mFJNEODpNMV37h7IOjsACDBqakmw6QzhKXJO+ofFfkwYSZ42DZlr634DsHzieG2Weud0Px80Cf0V+RAg==","signatures":[{"sig":"MEYCIQDz9rMl1f4Og0cyKWHUuI+RUUZwmxA4t9ENu2jKo4M8cwIhAP+K0zYihziwEWmgLptdvK7H2dooaGxrr6Uef0mGKUl/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89333237},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"be3f39a3eaa90d05af5b6ebd634f9427fbe86a58","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.502_1781158063920_0.6153868389559836","host":"s3://npm-registry-packages-npm-production"}},"0.1.503":{"name":"ugly-app","version":"0.1.503","_id":"ugly-app@0.1.503","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6df4d5e31bb6f30e11f50a746aad6af10b52211d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.503.tgz","fileCount":3731,"integrity":"sha512-42U6ICy/7UKUhQHqThsuSv5/OUlwtXHgRsPKxAUWSEm+m8lCoSAcXcjyA4gcBuUFV5BXUbuE3wuJSh3WuePyPw==","signatures":[{"sig":"MEYCIQCqMRusp5w2ePPN89djTOpgz4fZTfP6uOvSi6gOjYwnKQIhAM461l9H2rJSjs0sGmH1zJJKKRenHlL3Ek34D8+8AteU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89334382},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"ae7b4acce3fb9fbdd6c462b76d179580c5508e68","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.503_1781158598220_0.6852647106573366","host":"s3://npm-registry-packages-npm-production"}},"0.1.504":{"name":"ugly-app","version":"0.1.504","_id":"ugly-app@0.1.504","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0a14b74ca405df89253f1cf1b3f20b64632adbc8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.504.tgz","fileCount":3731,"integrity":"sha512-hX0oaRBxIiZTXqbH3Va6wtuPJml2TaGWdjjR4MiaKdaYG/HiGmQdvVib7WQxrhRabr6PXV/l0O4UV9rr/JWR0g==","signatures":[{"sig":"MEUCIQDHBCeyEtg7dDSU9vD0Usql3agc8fGQxAYSV/yw6vGtNgIgRR64crCi6e1WY0r66XJTO8JyJPqUgqJliPtBykWHKmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89334872},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"623d7bf7a2fd58a6e74453c4bfef5dc9eb5537cb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.504_1781159111161_0.22326007298160633","host":"s3://npm-registry-packages-npm-production"}},"0.1.505":{"name":"ugly-app","version":"0.1.505","_id":"ugly-app@0.1.505","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"71f04f35afa15224f615242dee330befffedb6a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.505.tgz","fileCount":3731,"integrity":"sha512-w/IbrTex1W2hh8xSUhmjIeHxY16IBhLItrk53twChnT6sR9XCXzJ2wBhV2IVDPFYSVPksDaBIcUTMQeocwyzbA==","signatures":[{"sig":"MEUCID6ZPZp2yR7NJUdEvj9y+DHeZ7lrNT1ESLiTUnu7a8GtAiEAvYvR1B0+pS9efwYzEUdQPg4KrWU8fQqgc03mxN4C968=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89336021},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"ce670f241a61fd94cebbdf0afb40e4e6fd9cd2ba","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.505_1781159630026_0.37686052925719693","host":"s3://npm-registry-packages-npm-production"}},"0.1.506":{"name":"ugly-app","version":"0.1.506","_id":"ugly-app@0.1.506","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9c3dd7b01a9fb570e8c135e179596161cc267f6f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.506.tgz","fileCount":3731,"integrity":"sha512-hDJzli9OiaSWCforUsRjPvWfB/95mLRrDfC66Wq7NhnkJ/0DKbJ5Ul5CXO5WP1PSfwclMcJcoOXwwf86b47wTQ==","signatures":[{"sig":"MEUCIQCuMtI6VIOMpdZS/0ODttbuDm3JyFBrugPBG+m0phez2wIgZ81SakFZnqz64UkH6JwDLMMGTyTE9TMk2HabxgH2BMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89337482},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"3d57edbd56fbf9ea742c4a180629d4f78a6b2147","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.506_1781160177031_0.18795899237019986","host":"s3://npm-registry-packages-npm-production"}},"0.1.507":{"name":"ugly-app","version":"0.1.507","_id":"ugly-app@0.1.507","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9aa3f541ff5fb7e87718b7ba9fe6c54a2a34372b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.507.tgz","fileCount":3731,"integrity":"sha512-Jn/0huIh+1yrr+8svzPLLzm7oqvmYu/UofYMgrzTyBlLa0jcmAwHNjzovY1OALGhy+BoMcu4o+AR7i8Md5AO7w==","signatures":[{"sig":"MEUCIQC3XnKpBgfJ5GIAE3snDRCvN7OL6dPaz/8A/rmd+cxSPAIgOfQ1jqT+4D+ujl5HJr1AmPK2ws3fc1C7jKkzZ0Gy/Dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89348513},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"e762eebac774f7c462dd329deb4023c9b9734bf8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.507_1781161828494_0.10132774743749895","host":"s3://npm-registry-packages-npm-production"}},"0.1.508":{"name":"ugly-app","version":"0.1.508","_id":"ugly-app@0.1.508","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ddf64860d249f45923621ad4c5cffc37eb651a86","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.508.tgz","fileCount":3731,"integrity":"sha512-jwL1F7ail0h9XB/pbJ/BHdRr4yZF+7rQCBQhoSL7hBdQIapPcxKFBy4EEvhyBRQDnaM0tBAC8gjIWlE+OJaITQ==","signatures":[{"sig":"MEQCIF0C+wPqzVWCM6fds86aWyK0hvWa5q/sJn4ydt0w3R9kAiBnhRM8/4UqAYq2QPtf/n39AQYwMw3NbB/IQQeX1XZSHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89354797},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"5205c30603ad8b40abe3d8acdd594c333bec58e4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.508_1781192113241_0.1911663410361797","host":"s3://npm-registry-packages-npm-production"}},"0.1.509":{"name":"ugly-app","version":"0.1.509","_id":"ugly-app@0.1.509","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"394a13853f11c88558d740660ad026a813556ec4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.509.tgz","fileCount":3731,"integrity":"sha512-6QQooqlpvmKfEwAjY9CTJcvMhJnNd5TzRfA9AOMc6S0nqYWzy0ifkdPNNiGI/ousQm+tpsmMZpv/nAP9aMc8hA==","signatures":[{"sig":"MEUCIQCWNKUrlN+GG10SGKfxZxh+je0ge6zENoX9OMQcI8q1cwIgRiQRrz7q8UvlCJt+YEgaEWl8GS4jOJgz9GdovNRZPTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89369828},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"1eaafb893a9cfedb8075d1978c07ebf4299af906","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.509_1781192910393_0.13114045858188295","host":"s3://npm-registry-packages-npm-production"}},"0.1.510":{"name":"ugly-app","version":"0.1.510","_id":"ugly-app@0.1.510","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7d1608c96d9220cd2ee952bfad6cb0801ce21583","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.510.tgz","fileCount":3731,"integrity":"sha512-loKEzSFwWC3l2lK0qSza4zyt0mErlsM7f64csc5upL3kvq0or8ld1gwEj4MgZ1SiSoCtWd4Jpol6WwjGsdVBQA==","signatures":[{"sig":"MEUCIQCecMEOI6yEyZt8eUp396VdlRwwjhD0S7u7KmUtzoXPvgIgb90ruhkMrX+5TFE9WmtLQtytO0LEeFKcty0vEIzEsGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89370809},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"74d6814056e369a79a9542cdeac04b4b3a2ef917","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.510_1781193770700_0.5764970995473533","host":"s3://npm-registry-packages-npm-production"}},"0.1.511":{"name":"ugly-app","version":"0.1.511","_id":"ugly-app@0.1.511","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2d0f24d1c19db9abc4ce436844ad156a54130f19","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.511.tgz","fileCount":3734,"integrity":"sha512-E8rAM/WlHEVV9mz8Tj1nqZdzomx8dFxK6QzurOJlXyOhPrAipZlk0RnJ75QnRwkk5f3FMUhey86rhr86wpk3Dg==","signatures":[{"sig":"MEQCIAHczMgsfaNqeNv5bZrVjSl3RNEaXGfqJmpVs3IG41ofAiApSA1FU4l7jTN27TEcU/7lG57xz38NCtMAX6CYVQb9rA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89385926},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"e70fc6e4cddff6c6c2575536d3c3a89804d734a5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.511_1781227078927_0.21474045894163218","host":"s3://npm-registry-packages-npm-production"}},"0.1.512":{"name":"ugly-app","version":"0.1.512","_id":"ugly-app@0.1.512","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"77941beabc96c19f8bfdb668d4dd42e815d8f32e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.512.tgz","fileCount":3733,"integrity":"sha512-7ZYgqT7hc7MoQbD/kSQyreOQsE6mATpdl4PAMkB38dxkm57eTX7Dn9czKXQZ+9KWcUB44l/PEdmnEA3dCrxbcA==","signatures":[{"sig":"MEUCIQD/cL6dMN0+xdXYT4F5xFs/MLH4kzY6JClgUoJIpNH6IwIgFl0IIDjdTvsCmy3gibni20wy0dxm89nZdSc6b+9LboA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89387727},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"17045dbcb021447baf7fe313820e20cb56da330f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.512_1781228157892_0.7156744269156583","host":"s3://npm-registry-packages-npm-production"}},"0.1.513":{"name":"ugly-app","version":"0.1.513","_id":"ugly-app@0.1.513","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"363d5c6f22ac986c5fff20eab29233f208534e66","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.513.tgz","fileCount":3733,"integrity":"sha512-ktKBokSfczd9LMLdgykRi+JtFW/utuqPhLBfWbi4TqUHpRYOh3C3AtYXGdVk+8tDOsJ1EueDq12n5HaZzhK87Q==","signatures":[{"sig":"MEYCIQDz1cb8Kn1GXfVHz+Mx5eXhJIF2RapddnLeENcORa2uKwIhAMvK4jntukYPIostmKIGPK77qLtQyyXn7wlqvWzC7+0m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89396364},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"34ab5148f819004018e333896f86e6bcc9dc91a6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.513_1781228999480_0.6434855554738499","host":"s3://npm-registry-packages-npm-production"}},"0.1.514":{"name":"ugly-app","version":"0.1.514","_id":"ugly-app@0.1.514","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7ea4715e29211ad53497ea6cd45daab568ccb9ac","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.514.tgz","fileCount":3733,"integrity":"sha512-fOMrOXf60hlIh1MZ/swAd1bvTsrfP9N6ACXSPi96TCAezSylxfimlJO6Ut0uxQI+pgKnEPlXXVUuIIrn5NNexw==","signatures":[{"sig":"MEYCIQDt4eLag4QKpH5LaNwAkMjvcersMPrU1UFmYraTY1rXbgIhANP4oFmzIvIoT4968L2HJx6X42nWYzvdwuNuZwWGJJXn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89401962},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"a5e4ec0d42328c1fcc856e3fdadcc5e635798318","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.514_1781229613982_0.5481924540893659","host":"s3://npm-registry-packages-npm-production"}},"0.1.515":{"name":"ugly-app","version":"0.1.515","_id":"ugly-app@0.1.515","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e63046d11ad73545fde3b69f252d0c707a45c1df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.515.tgz","fileCount":3830,"integrity":"sha512-acNlMqkb8fUm7G0GKUAVwUR3G7pb4nUMvFdtJ1iS2WGNVVSvGjHGxsV78/5UTwMWk4xVyB1lBTIKhIdUCJjgYQ==","signatures":[{"sig":"MEYCIQCmt7klbju3Ps1mGcEH9aDvf7XAzYzLlTi3AE9j3rmXLwIhAIN1vdOAZemQT1FKPhLF9GAC6GtE+OofPzgrpF+K7gu1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89687085},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"7f593d32e186dcae28773e49eba227d27fd9f409","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.515_1781246882133_0.41031920939179267","host":"s3://npm-registry-packages-npm-production"}},"0.1.516":{"name":"ugly-app","version":"0.1.516","_id":"ugly-app@0.1.516","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a8aae18392e5401ef6e9eef80350c3b1da7f26ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.516.tgz","fileCount":3831,"integrity":"sha512-CFnVg2SKaKfvuCp8PiyJOq1qeibOhbwHNNNlnODm0wuBBWOLNsZwZejd6JpwVGq8P1E3mFJ6/81Q/kA0ptjjYw==","signatures":[{"sig":"MEQCIATMpnZgJ5BALlCWBg5ToXLYWE5O0sVvUAsRB0JVrjeaAiBwqrYgItutuQRjYDnX7V1AeZT7FfkSOZBfazJzr4eRHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89688952},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"4274d6fe08ce460b4f7955a17c813d212d865604","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.516_1781248081439_0.24948138389437235","host":"s3://npm-registry-packages-npm-production"}},"0.1.517":{"name":"ugly-app","version":"0.1.517","_id":"ugly-app@0.1.517","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"63af871a02f4d2f5f111accf8ea5562e510306e8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.517.tgz","fileCount":3835,"integrity":"sha512-ndGrTDvRt0gM7Fj0H34/aWsTD3jpjsiem+fIvwGWg1TM6L16EpaA0Lv8DXpAMcKrYcvGyu+tCGSFoDJ5ESgGvw==","signatures":[{"sig":"MEYCIQDhWP2i+/A2fC8KOOMr7qmi1qIYaobfz7H/UgI5H9N2mQIhAKNRfpXJ0gyYwwaOGYPdwvL7fIcQVv5z/A6saIFHD2cP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89728195},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"cfdc24174656201806e61e5c36ba660539d60ef2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.517_1781278697098_0.3824617219930193","host":"s3://npm-registry-packages-npm-production"}},"0.1.518":{"name":"ugly-app","version":"0.1.518","_id":"ugly-app@0.1.518","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b1feb9912caf400bb6d893d31d4199490d0bc8d4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.518.tgz","fileCount":3835,"integrity":"sha512-3HwWJRIRrMJGoVk+mbmciunQvuGDuANDusJnqV0wT10BsbJdcGamSsUmR5zBHfb+gRsrh+72L29YgGvoeVOlpw==","signatures":[{"sig":"MEUCIAM4r6yMekt/CXrSUbAtBHhdz/HzRSJsrTDLFUBQtFvZAiEA9fbChwzZBFJeUBfafgiI6AsI+RaOdKkb2s8fO2imvmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89731168},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"a40ecdaafdfd845779f5f52888092c8e038b9f23","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.518_1781312339853_0.28230144305981275","host":"s3://npm-registry-packages-npm-production"}},"0.1.519":{"name":"ugly-app","version":"0.1.519","_id":"ugly-app@0.1.519","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"97fb320d77f1941909285032a4d67d7d543dd7c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.519.tgz","fileCount":3835,"integrity":"sha512-FTtqa92c9GqiPPjaB6hRIRvaVwxYvInmomyn5AC84umN3gdrZm2RKYwVCVy51wBA/rNaJGI/kQFIdvQaZMbBVw==","signatures":[{"sig":"MEYCIQC3lxq/wIepxLZHZYFUBxLrnIq7snJ8/B3dfDhmMIYtlgIhALqpy6bnGBZjuORJgJ71zjBuzDypXJmCM207jjLY/zWW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89736491},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"743c75e93107ad03db3511c4168c5f6c1de4673d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.519_1781313409769_0.8532211825788241","host":"s3://npm-registry-packages-npm-production"}},"0.1.521":{"name":"ugly-app","version":"0.1.521","_id":"ugly-app@0.1.521","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"34f03b29cc6a86c67272730563c4c6c773ea0f08","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.521.tgz","fileCount":3802,"integrity":"sha512-PzVKV2m6n6JyB3yOg2qs1jPQG3nce14lehJoLqfojqrbVLXMMKgWPuK+FSwwu8wOi43afKdvazWK9m0aA9ZkXg==","signatures":[{"sig":"MEQCIG/m9sGp9RyT4Yc+nazUvvYIIoHiX7U5hn70rYZTp0qRAiAe55bKESFSgl8E4JuClEIMjK/s8VUcbCW61TgQFMIXmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89129937},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"590ccd9870856b4e8b331fa0579c0a39c1b8c98e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.521_1781323975254_0.5931752447036072","host":"s3://npm-registry-packages-npm-production"}},"0.1.523":{"name":"ugly-app","version":"0.1.523","_id":"ugly-app@0.1.523","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"03019e4c1ea2c52c6d01465b7690531df89c405f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.523.tgz","fileCount":3802,"integrity":"sha512-uoLr7CrSbnDGbHLKfxGsJh3dGdoD9qHgZ3LncJTN9diYUNIa+vgcFXqMITuKFNhu1SNrMzPUnLbAieJ02dV86Q==","signatures":[{"sig":"MEUCIC1Pcj1ZXE7W/fjRbnOWEfwRJnWUm8LP94hoVZACcGjnAiEAokMzBOhF+3wYDFjhbodFkdl5jLitOQWLLJH8a52ByJc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89132535},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"72755a1eb5d34a9b107a8196eaa7405a14d2c505","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.523_1781324226672_0.4404814437407294","host":"s3://npm-registry-packages-npm-production"}},"0.1.524":{"name":"ugly-app","version":"0.1.524","_id":"ugly-app@0.1.524","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0f4434bc307a391c9c49518926cb888cb34a993b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.524.tgz","fileCount":4176,"integrity":"sha512-9+hPMW1TNcrXe0ykXXVG72p/iq19bO9PNDU5/0l8wxVQ7zNCAclqO1MCfvbvDEe+lHtyjaMteTn6wXAnP2cirg==","signatures":[{"sig":"MEUCIQDxXhsaYCzjV5wx0su2bwdmhJ5IrZMHxGQaNmr9hD5eQgIgN2M/Kuirmc0WoXnTTqegizLOiexZPsQB9/DkRIjLFZg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97663310},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"75a16db42df143811123a1c11f5bb0d70e78692a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.524_1781334182585_0.45981897460622334","host":"s3://npm-registry-packages-npm-production"}},"0.1.525":{"name":"ugly-app","version":"0.1.525","_id":"ugly-app@0.1.525","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e8fb8aeede9019f3d6805643d5c43430c039da8b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.525.tgz","fileCount":4179,"integrity":"sha512-ReNOnL5bvvsKqNg+mXra0XdhSzNpAQqrd9GabYDgCfO++zCCmxH4SY7B3kXiL39mTEk/K5OVDm/3tKGOjJBjIQ==","signatures":[{"sig":"MEUCIHygsj9bxXjbZNJQz1WmUgwXEcf2iX7rWO/xktAHuQg5AiEAgxgnKtzTLwDboBHom7sTPsVbS00opL9z5ItxQkGIVfc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98100240},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"5cb83e1b71596635c6f70279bc4992cf30ba7ac6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.525_1781336281988_0.8594562808028365","host":"s3://npm-registry-packages-npm-production"}},"0.1.526":{"name":"ugly-app","version":"0.1.526","_id":"ugly-app@0.1.526","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d170ddaf26bcaee680ba7d83cb1f9bd1a3dad4df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.526.tgz","fileCount":4182,"integrity":"sha512-pM6E3YTD9RpN2RpHPlp9WbnZ/JxmGCXAKkAK9adENA4Y7Vr1av1U6c5iYA+Igc4rU1QLiiLZDR33cpkYDwFvJw==","signatures":[{"sig":"MEUCIQCeGGlbERf1ga0EmkhqS+Qbmo7W8ura0Iat5P31b2D1/QIgGop9zHB/WQdOo1GRX5nTbX8hgLHsLz7QGmYjsFg9c/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98305040},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"2fe6debbedbdb4428238cc77747b4f4c7703deb0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.526_1781337744496_0.2082406894834532","host":"s3://npm-registry-packages-npm-production"}},"0.1.527":{"name":"ugly-app","version":"0.1.527","_id":"ugly-app@0.1.527","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d06a260682f9a9b338f07f5746ac438984127f82","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.527.tgz","fileCount":4182,"integrity":"sha512-VVWbIrddhejqzYthIOxjBkUyee+v0eY5NYwMwPEH0IZb+RxDcgFNUexPRcx/8Lh6Fp/qY6dPQAbHzscESX9VXA==","signatures":[{"sig":"MEYCIQD2LXavP1tzn7RD1WHV88ChxWE07bUzTGkmLE/RpXKCjQIhALyUmExgnEVtxPQ1Y7ZOrSbZhxfK5LWWF572XRFo3L/k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98317371},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"bc3e5c488abc6233e3ea95a6f59aeb268bff332f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.527_1781337984372_0.07531622399938387","host":"s3://npm-registry-packages-npm-production"}},"0.1.528":{"name":"ugly-app","version":"0.1.528","_id":"ugly-app@0.1.528","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c30ecb8c54ed07bbdfafbfef9df99932516123f9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.528.tgz","fileCount":4190,"integrity":"sha512-mALLopFxqW6JIvZSiBz0330LGIQEvZunqBSvhXsdQCX6h+9wDrrzM8SW7VWcXZIkf1d+/KvxfVEnKW0fx5jxYg==","signatures":[{"sig":"MEUCID1Cre9oxtGLOR+6dZjCo/wrqmP8wG95IRdz5LDOFQ98AiEA+LzlXXOHr6szCBJBbVVAZb04z7TaecA//wIQ9u02n/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98399425},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"dedeb6f1f52128eaa0b1807c01aca82f63337ca6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.528_1781338735764_0.049280011088187914","host":"s3://npm-registry-packages-npm-production"}},"0.1.529":{"name":"ugly-app","version":"0.1.529","_id":"ugly-app@0.1.529","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4566f6a2cde315c7b8dbc920cdb4dc691d4893ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.529.tgz","fileCount":4190,"integrity":"sha512-vxff2qEH/z1+ndfkPzJwOYYFWwVXMCcIM2KToEzHl/ko9iooD4//rFX2UyQdMTpYxvS1IghigMeK42RJZzTLug==","signatures":[{"sig":"MEQCIGLL11TsZmz3quLJULTwiTohWWrzrwNC5qSEyzJrJow8AiBZqxQ9Ka8TwGOPTnu5tsmUrTCmVcsWlfVgXYK+q3IcoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98408898},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js"},"gitHead":"520b619fca98afdfef6863bd4e8df8378736098b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.529_1781370519156_0.3633699942165385","host":"s3://npm-registry-packages-npm-production"}},"0.1.530":{"name":"ugly-app","version":"0.1.530","_id":"ugly-app@0.1.530","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c75de72d54445e002d37ba8674978cbd7ea6013f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.530.tgz","fileCount":4682,"integrity":"sha512-gNKSfKRlnPg9oDSttmmfreXHnModhUeDFr5QXx21xQRVqQ2GjW8BOeWUFEblVx005NdvE8zkmUoUpwWe4tWtOw==","signatures":[{"sig":"MEUCIDI5DvkJoUgKqB1a2WGWFhvL9sB4ABAARAh13FefdDbHAiEA/9jrJ7bM4QTcounDMMIRO0JQETLgauI8sjVhv9ktkSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108536068},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"207f2eb1070c47657b04e7393d10809f5fd8448b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.530_1781379431861_0.04672993562534722","host":"s3://npm-registry-packages-npm-production"}},"0.1.531":{"name":"ugly-app","version":"0.1.531","_id":"ugly-app@0.1.531","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"74934781051d8f4d3dd7b148c27cfa017fc8d0e9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.531.tgz","fileCount":4682,"integrity":"sha512-BIYhXaHSfee4qzD/dlKtdCFTrYuGGHwkfXCESc8nITPNwEOSC1Jsujw0N4y4xGTF6ht0LvqKnNngmhfjdsXhcQ==","signatures":[{"sig":"MEYCIQDijc44QRfKRBMyfIK0gynOfpvUkoTfBJg5nLSfwEwZ6AIhAN+pKKXGSczIaZ2JfkEoQh7ILdplRFnibwC+dR+6hH2k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108536068},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b8ebfd84c4fad53fe866ef59b892727343718228","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.531_1781379475795_0.718945896730383","host":"s3://npm-registry-packages-npm-production"}},"0.1.532":{"name":"ugly-app","version":"0.1.532","_id":"ugly-app@0.1.532","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"147f79f7f318ef6d07d30fa738a02cb3eea9fe10","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.532.tgz","fileCount":4689,"integrity":"sha512-CczY0mBxk/fWu/FR0cse+ReHp5ptmdlhV2v2X4o658hUs9RcGJXzh9iDZkf+7gwJ2l10mphBT27gq4AXVcAn1g==","signatures":[{"sig":"MEYCIQDeBFtu6s9CS2zlUtaAyLe6EfI6xoTfEk4jzSGmHyjM3wIhALep9IXft010bmQAkPd7rkWT4RbiMzAfTiWSBY+zwfKH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108566825},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c3d74c9ebce0ff3723ce997265d4e11c4714f5ca","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.532_1781379812837_0.4246252199696747","host":"s3://npm-registry-packages-npm-production"}},"0.1.533":{"name":"ugly-app","version":"0.1.533","_id":"ugly-app@0.1.533","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"777422fc61d53071bde83cd0199fad3340a6f542","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.533.tgz","fileCount":4689,"integrity":"sha512-qh1pyQ4YKXa6qKFF/8SDwgq/fhNJ4Wev3ArytAWE243z3HgyOcFQMxi5B/FJhydUWJwdF/WYqtu7oNoT0qa79g==","signatures":[{"sig":"MEUCIQDQOE+NbtuzczRDaFSh6QcAz4qvtYeCzwctoz+iNngvSgIgSsBPh5da3ooqsDZDu0Z28dWTs3UaKkPyW7foYKXdens=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108577894},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"10c1ba0c28a2a1b8b44a4b98e54e67b241bea23c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.533_1781380127718_0.4773088889497874","host":"s3://npm-registry-packages-npm-production"}},"0.1.534":{"name":"ugly-app","version":"0.1.534","_id":"ugly-app@0.1.534","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52bbee499d1b0a5cf31a8ae20460876c0156f1c4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.534.tgz","fileCount":4689,"integrity":"sha512-NlXVdVJKqB9S8a0VtsCevhsWsQeo+7R1N01GGfVNpXqGaFKO+H+QpyBStMNcKPt3COEvtxlKwMoI0twLPKoZsg==","signatures":[{"sig":"MEUCIQCIe6wjcJyWn+/9e3SeA5OgCsmeXVKXTyF41WsCUyYVaQIgAm2uQg///+lasYcbxR1nXXl1dxHbVEXdyeT4UnFw+LE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108580769},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"dbab44df46899812d346af6b685fac0d4f9d4aaf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.534_1781380556088_0.295125092437325","host":"s3://npm-registry-packages-npm-production"}},"0.1.535":{"name":"ugly-app","version":"0.1.535","_id":"ugly-app@0.1.535","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a7a58d150ab1be950cf618b89703b79b6f44e598","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.535.tgz","fileCount":4689,"integrity":"sha512-WGeVSgd2Om/YczCu9lJHgRRMtsXbV0ZZwZayPv3dRAMneKvS3IUou2YTvmaaoKwmGqtOP4G4lNGHJMdCwbuc6Q==","signatures":[{"sig":"MEQCICmX/r7SzRotf411WBJBYq1NJV3x3T3Tg7LqA9AxPnDwAiB2IItP/YszXIWAuwbdusIt5vyALOwQsb7bA2VD+JEs4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108594514},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b724d8afdf4629a40e69d515a0239ead34b5ef8c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.535_1781381042586_0.10765267612150375","host":"s3://npm-registry-packages-npm-production"}},"0.1.536":{"name":"ugly-app","version":"0.1.536","_id":"ugly-app@0.1.536","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f8dbc659420d5375e0ef4dbee649f39b5ed6f4b3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.536.tgz","fileCount":4689,"integrity":"sha512-8aSuUVrN0caGK8fpwpohXDTJHpZ3yiijy04GBMFgNeks/iPovdzt5bXVW326XxhA+9giTfIGttQryWmAetI3sQ==","signatures":[{"sig":"MEUCIQChPGAyUlikz3QYEgsWXXQ7gsFXnmO1PdEOL7mDsVDfhwIgWBx698JUtve3hUxe7S2X3L+AuJTRPrpUhW7YDG61aB8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108603395},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5cc4fb3ece2c2eb9d9ab75b2b44669cdb4d77ce0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.536_1781381322280_0.04942421871538105","host":"s3://npm-registry-packages-npm-production"}},"0.1.537":{"name":"ugly-app","version":"0.1.537","_id":"ugly-app@0.1.537","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"be917a314d6ad0c0cda571455538992a6b865760","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.537.tgz","fileCount":4658,"integrity":"sha512-Gg3GA83SzCQq0ZmSdSknekWZtVr2vsrHhOGKJt6lqhz9uES1h7UsM37uGUJkQsF83cLe5yjOnqqAp4NA8Udkyg==","signatures":[{"sig":"MEQCIGE5+E94dLntQA2Y0NrNJX6vouvAWc/05MC8f6tw3oLnAiBY8/eXSVMIdHnoD7b60/gmeG2+ob/cQw4r4nPWpJXOkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108611503},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8293db41f8e1ab66296901cc484612f840f16c38","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.537_1781383821755_0.8968410676717486","host":"s3://npm-registry-packages-npm-production"}},"0.1.538":{"name":"ugly-app","version":"0.1.538","_id":"ugly-app@0.1.538","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"32ba62fcf2533edc4bae56f6b20fce37ceece0a6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.538.tgz","fileCount":4668,"integrity":"sha512-bJ1xV/Ih13PG9AqdrIbJvsMGvVl5bLx6DkJI6ZO2yhUybi8FpNPHRaprv3hMunX6Iu8MEJ05ogBZHRk4WMWdUw==","signatures":[{"sig":"MEQCIG88yCNKlfZshjKsxTMILaLSaffVDiCYQi33seutEGeLAiAsy53O0Uw2Iq1FmPyv0BCSvfbMaiRybIfqbh1Rv1bF3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108678035},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f8f0070efa0d8af221eead002ba13887a96b45f3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.538_1781385822346_0.4710419236493486","host":"s3://npm-registry-packages-npm-production"}},"0.1.539":{"name":"ugly-app","version":"0.1.539","_id":"ugly-app@0.1.539","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"11b69a1260e34273d1bc13a1c78cab345ed0f595","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.539.tgz","fileCount":4668,"integrity":"sha512-JskdEvOtHrQeqRiWVn6lvyZ+nYtyv2yqzV3V/3/TUlF3YMUUNMVQzc62mNtV4VneDz1GYfsZ00PTkn7NaD9A9A==","signatures":[{"sig":"MEUCIQCke1XGq0yv4MsVBbxg5+TFrjEsA9q1xnneJJoDKcQn0AIgfxVegIrHlwNXaZV3ZkwCZzABlA4Bs6f8hGpGMeROQTU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108682110},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1a970272116a9837a1fd7bbc74584843a6d724df","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.539_1781386627536_0.896124080897504","host":"s3://npm-registry-packages-npm-production"}},"0.1.540":{"name":"ugly-app","version":"0.1.540","_id":"ugly-app@0.1.540","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4a1a6e6dfcb633c8b9e29f612a2cb4bb1ec9fd5d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.540.tgz","fileCount":4668,"integrity":"sha512-EKMVFLQUzcrKaawnmdg2h31qDq462+d2BQvgLv9GepTOIgsP4d2LS+LbknSTwS7MITRj56ycdV2icq7RSMSCdw==","signatures":[{"sig":"MEUCIQCfkkAnRvsLApl85IFhOCOQRvQyr6OwG3g04qp0MLpICwIgFFZL0nH9n32b2k0o3e5ARznkW17CxEZ/EtHCZNvHDEU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108685730},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d4793551260415445e985c217e903bd2d0431e30","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.540_1781386899826_0.7926187104358697","host":"s3://npm-registry-packages-npm-production"}},"0.1.541":{"name":"ugly-app","version":"0.1.541","_id":"ugly-app@0.1.541","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ad8937f11ae4953df6844ece91156009aee75669","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.541.tgz","fileCount":4668,"integrity":"sha512-gIQmqZsKHZ+xPzgE736s7cK5mIt2FmurzPL5oYnIW9Z3hqnPwzLOBaG8FKUnPRa5UvMq3GXAcSGa5v6zoXz2nQ==","signatures":[{"sig":"MEUCIQDHBejT6YPoXrBzR8EwgTpKUORnkC5wTnrZ/gIO5KKvnQIgSLOYDN6se81tAsgLEUb2frXdWZgte4oYsh0vAY/X8vs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108693707},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bcc8184729ae308e3d407e1e12704e0d2c43bc01","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.541_1781388455308_0.431001742574769","host":"s3://npm-registry-packages-npm-production"}},"0.1.542":{"name":"ugly-app","version":"0.1.542","_id":"ugly-app@0.1.542","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4cc415e6d5c87f873b74eea110f76b3e5151b256","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.542.tgz","fileCount":4668,"integrity":"sha512-PCLa8m+UbGGXvw1ukPY53GCq62diEzMdVZ1JCxqCHSzx41eyxdquX5r4JAulQ/qHnuVOQ3+EllirMvYiND3prA==","signatures":[{"sig":"MEUCIHylvQMeCArsc/IWaaEkcoqznmcHxeocfqDlptHb1/rSAiEAkMR5rsgjTZbbMIkATkL/jZOsEzE/JWyE/L8FGd/W56s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108693906},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2b76828f5ffe04c8fde7396913cbcf0f57a4ff73","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.542_1781388498344_0.9233002581163097","host":"s3://npm-registry-packages-npm-production"}},"0.1.543":{"name":"ugly-app","version":"0.1.543","_id":"ugly-app@0.1.543","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"63a9628dc6284b86b27966ac64df61f605611a76","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.543.tgz","fileCount":4668,"integrity":"sha512-NITe9wVSJ/qhUwpjUIO+Cl/1QdsCzptzqpCYuIbFJjyF+wG45+Yr9vX49muj3PlEZF6ChQgKaHi92ys4Sx96Iw==","signatures":[{"sig":"MEQCIAwLwabY04Vcwq3AEYykTbCckHDq7wc89ZpNC9YXy33CAiBLdHYW+fFZ0S/b42mMDgdHj2xMpgjtTrZMZsI+EC5lbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108728831},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bee8f2ad71f72373f44463bb0458376c54edfb60","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.543_1781389037280_0.2741728198617366","host":"s3://npm-registry-packages-npm-production"}},"0.1.544":{"name":"ugly-app","version":"0.1.544","_id":"ugly-app@0.1.544","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"504f5d580a058be53e7d77a6d5fcf014d2a236ef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.544.tgz","fileCount":4668,"integrity":"sha512-ZB77SD2J9NOfHJmj3ulV3qOfZpiN28FMBe3sRxBcDElSYE3QRB8FZjjpQ4CPSCBcsdImUYhpRX0/lx+JVcflQA==","signatures":[{"sig":"MEUCIA7ZvCOEb2OxUK3kG8Eo+0y+/KxMMsBKjGF/UIukHijcAiEA2kT3tPByRYTQSwCPjqCZ9weT/dmYAYvLr1GEWhA7AcM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108730977},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"83ce6ad5d2b9f6526e13e00406ba130718cd333c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.544_1781389314349_0.7282279832974776","host":"s3://npm-registry-packages-npm-production"}},"0.1.545":{"name":"ugly-app","version":"0.1.545","_id":"ugly-app@0.1.545","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"73aa2c949f26db8021de57ba40656c8d6a95fd72","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.545.tgz","fileCount":4668,"integrity":"sha512-jYvLYMJxD0EFl7up2+E5M5KilW4oz6cSLrB0YV/tvCOhJelTZvemu2KVNKJn1hFGYaRc3ZiB8J9XScyRC240MA==","signatures":[{"sig":"MEUCIE9RXz5pnCsnNWwHALM5gZ8CbNYP9hwAl0BfnLy22J42AiEAqDUjHZsXAN54fGFbuNLQuZtxPljg/zUdtXVi+n+8hic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108735093},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"70025c3c65f67a66d4da47bbfab3652c64973e5b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.545_1781389855855_0.4631217113899546","host":"s3://npm-registry-packages-npm-production"}},"0.1.547":{"name":"ugly-app","version":"0.1.547","_id":"ugly-app@0.1.547","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f2f24319ce24d7fb431691df1222cf30f9036652","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.547.tgz","fileCount":4668,"integrity":"sha512-0dyKuiq/Ggnznkkn4Qb1ggtH9BVphxk46y6bIh9jzR7gnMYKluEN1oTzKf/LxCKAcjDT+VTBQMbRM/a9HGDZbA==","signatures":[{"sig":"MEQCIFQ2xGoxP6SrYhF70UJodGg0v/Ul91G7wjGejozPsviqAiAu5WAGQ8HBHkpMt8wgXg04SvC2sVuXnLIrVNeNuNGDYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108739671},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"232ed73d12fd69467ace429aa9a3d6b79455f159","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.547_1781390854475_0.019496430776723805","host":"s3://npm-registry-packages-npm-production"}},"0.1.548":{"name":"ugly-app","version":"0.1.548","_id":"ugly-app@0.1.548","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3360b41ef16ee5534188f176dc7969b07ff90c68","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.548.tgz","fileCount":4668,"integrity":"sha512-9yE3ixglLuywaRPdPW7XNMglfe26y+dTiNr7AQi5mw6ptKH+ZpTRz9sxC5SCkCZX5X0OQ831q+vgVQvlGepYVg==","signatures":[{"sig":"MEQCICqqrqFKkrp8PKh68gzD2VYCAInpvCgm+XipSdYYqQLWAiB8kJNR6urzEg8f5NB6uw5erGYDZo6115GWBR5+Ar0DQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108748261},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b77a6d41ca7e0ea24152016fc262b809a29869c2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.548_1781391049413_0.8735136479136534","host":"s3://npm-registry-packages-npm-production"}},"0.1.549":{"name":"ugly-app","version":"0.1.549","_id":"ugly-app@0.1.549","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5c11a832fe6ef73d33963c12d7ac47ccd2b06d1c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.549.tgz","fileCount":4668,"integrity":"sha512-j0JrnlAMtyqG4Pjvwr2z3yOZkiX1ODTc0xjHECbB8lqrw/GTEmlegQdmryP8agBNiwtQwkWoQCo0FsS+xDDQgA==","signatures":[{"sig":"MEYCIQC2eZ3jtxUiEYXJ5TCuFPJsBlgRRxHHJlYOUds9bgVpIwIhALUyPmxlhNjEGeVaXzE02ZDaksNsSCZ8mH5vomwrOajc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108763964},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4a43c75c9cb18e11bcc7783770a9e8e5fa902487","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.549_1781396176964_0.7335402534239428","host":"s3://npm-registry-packages-npm-production"}},"0.1.550":{"name":"ugly-app","version":"0.1.550","_id":"ugly-app@0.1.550","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ef2e960fe98a04655d26f04911dea781577399e7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.550.tgz","fileCount":4678,"integrity":"sha512-LKzANfZiasoa4VxsCunYVERyKPzmk7y9oovuD/B8bkUb30RXMawugbP8k6Pu7SeUhOU+L+Srg0iEAEjTiP16bw==","signatures":[{"sig":"MEUCIGZ4OYyOCmggb+6/W8vU5J+BVNyOM+CTPH+c5J7t6mkrAiEA3jOhSgQ7a6X55565spTmfydLwzvpj+TBas7Yfm5vtgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108823002},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ec01957475888ad707662e1d5a08cdcb0f0ef204","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.550_1781399697657_0.8107340695754128","host":"s3://npm-registry-packages-npm-production"}},"0.1.551":{"name":"ugly-app","version":"0.1.551","_id":"ugly-app@0.1.551","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0c7282f7e1207beca7349859a0e14772901e6da3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.551.tgz","fileCount":4678,"integrity":"sha512-NXkJYr1wFRwqpoFInWaGg7xYprGVhRHHl+MPniscYk/s+0Km4GvBZ0i4clhJ9+C4ApYxbAuv9wg+YPiEeeOxWw==","signatures":[{"sig":"MEUCIQCSDP94ioOMujhYXNrUX+L7SzixLd92GLh3zeLp1navNAIgAscUwIf398GOmaG0FHnUrFzM7fdIOsH6WBmfHbllEn0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108823002},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b90b1a2fdadfd7050c1c0ec311e93efe0e97b229","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.551_1781400250470_0.9469184385471234","host":"s3://npm-registry-packages-npm-production"}},"0.1.552":{"name":"ugly-app","version":"0.1.552","_id":"ugly-app@0.1.552","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0b55ebef6bc4c36c9388874ab16d5d7956b4a8a9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.552.tgz","fileCount":4678,"integrity":"sha512-XZy7e7mkzNs1v9XmF4jK8r59ANBPDmvZ7kzeYvxTWAc92fxf+pLrr+VvN9d80XOo486d+nwXhtNQZdyUqaDzgw==","signatures":[{"sig":"MEYCIQDv69tY9q5sDXJQCnIIoUjrQlmL2Wm9doK3rnu4N89ZowIhANHWPvMrsmPyB1ZmDnaVUV1MBDNomzAcD7jhm/1bWQzV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108825540},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e65dbc85786d49939ee33cadef679783cfdbe34a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.552_1781400664394_0.7724395737206973","host":"s3://npm-registry-packages-npm-production"}},"0.1.553":{"name":"ugly-app","version":"0.1.553","_id":"ugly-app@0.1.553","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0729b53f60742ff6e8e5e605ed6c9e4f7c98b758","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.553.tgz","fileCount":4678,"integrity":"sha512-elDOYpFnuE3883Epa6j9fBa9REZyL7EBQCu8ewySxhVMU1rIFl69MsHXb3R4ZBByM3GNnJ8uKzBCiz4WP0pUew==","signatures":[{"sig":"MEUCIQDHufyAUMIH2E9vTYTfNTR7a4JlC23IRv5zkNHo+pG4NAIgNuCz4dL1OHpZB7m3GJ4Vt6BPNeU8YO/2yBgTuyGmwGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108826661},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b1eaeb8491972602a5c509c46544dea42c4e7cf3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.553_1781400977207_0.9495118664515931","host":"s3://npm-registry-packages-npm-production"}},"0.1.554":{"name":"ugly-app","version":"0.1.554","_id":"ugly-app@0.1.554","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bf3341c0a8e37f63b3b4e3368c2a498c9a470037","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.554.tgz","fileCount":4678,"integrity":"sha512-gP2UTw475kf8anjxirCwbc+NQbv4ToTLI4TRfBWJy+pSKdIloA+xGNc8/UUD17aJ25CuIkjJjdHf61XEj26msQ==","signatures":[{"sig":"MEUCIChVd0LvhXRVSaSOllt3eVIWGFBBVmeFmtTdoh1RfZvcAiEA+UrhgjomtI4re5fRCsPITPKVYXpllzNHToGiaZjGC74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108829085},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"644e1b0e320a212147bd0f9f12df2cdbca73975e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.554_1781401416122_0.5255560298870152","host":"s3://npm-registry-packages-npm-production"}},"0.1.555":{"name":"ugly-app","version":"0.1.555","_id":"ugly-app@0.1.555","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7c54b47c7fec041e3eab661bf893af5fc0196a4f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.555.tgz","fileCount":4758,"integrity":"sha512-qIgevR6HiNHFLce9Fm58SMEl/5pVOYgvepx8Trdty4AfDjuj7n1ms3x43l2iLPrLdrZU5C48DU0mTqZet8G2lQ==","signatures":[{"sig":"MEUCIQCRkWP1zW+UKwXqCnPoPqTCpMvHoyIoCcN+JXm9iWDvOgIgHricZU8Lr+A2AiGqCvj2IpnaJx/Tiy2Pfehju5r9pdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110211639},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"367bad68f9e97e0e5900f8fe948fe88929e041e6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.555_1781402733026_0.25012421493525694","host":"s3://npm-registry-packages-npm-production"}},"0.1.556":{"name":"ugly-app","version":"0.1.556","_id":"ugly-app@0.1.556","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d154594580c2a8731f02338ce553c95122fecad5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.556.tgz","fileCount":4758,"integrity":"sha512-OLSifMODeg5MxWqDj4YHQFx5F0PnEpwCwxIvAvSzS0gxYXpmcUsfAszFPfHqh3aPLnbgw25/tZbvWrYQv9Ollg==","signatures":[{"sig":"MEUCIQCcaRH5NSzDj4mJSXd8cC3RSe8bfWRm9sPME8SvGJKT1QIgOXhxDVhVC+KSkuTrds5fcVxIhHwG7qDnGc22C5W6UTY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110216722},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"15b6566bd6c03fdb6e487c7170a9b5b4fd93af38","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.556_1781403250172_0.5200509064953227","host":"s3://npm-registry-packages-npm-production"}},"0.1.557":{"name":"ugly-app","version":"0.1.557","_id":"ugly-app@0.1.557","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1f5e6a886ddc95c5a88aed5b83a0380f0843afc5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.557.tgz","fileCount":4758,"integrity":"sha512-T/dFIThH+AOoS8dOsxdDgT67LXS9dYVEB5mkF/YZkl5QpoaFEsvsu/9w1nwPFp48oxsIj7qSs+pWSbkE7tKFzQ==","signatures":[{"sig":"MEQCIE+D9i03YxUJX2CA22xlGq/cK1NucA2xdMsVpduIih7IAiB3ocydeQsU10FZwzhP5X/kVwDeGTjSbpKAgHCk8rXvnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110217650},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7cbcb5bf433e1f2db4f6d0c8f5d0e26a21bd19f8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.557_1781411535164_0.3860968885528975","host":"s3://npm-registry-packages-npm-production"}},"0.1.558":{"name":"ugly-app","version":"0.1.558","_id":"ugly-app@0.1.558","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b4cc4c2abfc5ba6ef880e153fdcc70821e32395","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.558.tgz","fileCount":4763,"integrity":"sha512-yeHBIUrK6e4+QwU+EbBjJ6PvhUeblTyOZMsFFHJUe1R0kgCXyzyZBZVTrNa8O/l9RRnXq/BDR7xi7/79f9GUtg==","signatures":[{"sig":"MEUCIFqP6wrbQV+/O3TwbHqbZD1vKd+AybvUoxVG7nv7BNRJAiEAsyRX3Mm7RrF0t6F6PELH3AhgjbL8bK6A0SHgq3wP+SE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110219979},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"04ca2c6296668ff88ec0e9335113e7e891949284","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.558_1781412551436_0.9523517683767324","host":"s3://npm-registry-packages-npm-production"}},"0.1.559":{"name":"ugly-app","version":"0.1.559","_id":"ugly-app@0.1.559","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ca50d779b514ed5e9d55784181892ff0d71766a0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.559.tgz","fileCount":4763,"integrity":"sha512-s/p20DazDOjm53lf2nVwXTGFFcpunhuHukzYPC5jl26Mf4MZy1thqe8BLHil55Ayxfse2kwsetqcgEDMamhcDg==","signatures":[{"sig":"MEQCIDlFk3GEndhh31xseVsWsfJ6DW1sguFSjsHBTnfm4fz5AiAAgKQm7SpsUYQ5NOkcFUpLOPRcKJ/gQw4FOm7/gBWeUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110221367},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d728112c24c973696042da2ff7de06d016039282","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.559_1781413383765_0.7191802214498975","host":"s3://npm-registry-packages-npm-production"}},"0.1.560":{"name":"ugly-app","version":"0.1.560","_id":"ugly-app@0.1.560","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5aa852e5a97b3fefc987cc87a15bc7a71631365a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.560.tgz","fileCount":4763,"integrity":"sha512-vLO0Sxd0JwWgoEFR1oD6WdjLc11umxbpwtUbn2H/pGIs63dE1ZqceDpHyIgks6ngLF9qBenvz3Zp8DXq6DfdsA==","signatures":[{"sig":"MEUCIFP171+PdYZnAroHyFvbsLhs7ZFkUer5uZLBsH8V9UwfAiEAhE684meYQorYxtGlABlWCW8d7ANoEvark6BYJn+gLK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110220306},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d9f60242f22f4a2accf284a01898b143f2db30d4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.560_1781416409727_0.13092882724364197","host":"s3://npm-registry-packages-npm-production"}},"0.1.561":{"name":"ugly-app","version":"0.1.561","_id":"ugly-app@0.1.561","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8fddee2d4003fc0620125fdbb67069970fcc8e2e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.561.tgz","fileCount":4763,"integrity":"sha512-cbxd19Dyy1Z+qlVeVRKQoz0E1fMwn/RUUeajJg5Jhe9YG8AvFezvlVahhlYvuFxl1E0HLZ17QD1eOVcxD752tg==","signatures":[{"sig":"MEUCIDQDlFj0PJqNAJ3kgbjFaRJHdmrt3dR5wIZ5iPeejkz4AiEAqdaQnBAbn+tDrRPlw7MCMCvLBTko135nvhYenH+p568=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110225353},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"dd35403f7dfa6ca88b093a470b8aaebe68d20c6b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.561_1781417652395_0.9744772000963624","host":"s3://npm-registry-packages-npm-production"}},"0.1.562":{"name":"ugly-app","version":"0.1.562","_id":"ugly-app@0.1.562","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5c7643811c46ce56de35ada3a9e5f5268e341b87","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.562.tgz","fileCount":4763,"integrity":"sha512-5mXVzE/jOdEtCLnxuIZ4FyGBKeuW74oAsH2D4osC8UDhIzlxtCs/06YpAKfd7WIfCb+q1AMBxi6bmf3UJDqQxQ==","signatures":[{"sig":"MEUCICOckrOzY+NyLHqhHLpq57tH4lyLMvKLPKcN3pE7k0msAiEAylb7Cx+SzCnNh6KvaobAIk/7E8xbd12aQ3hSSuW4BSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110228704},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"152434e795960ff1083331de849fdcb57af6525f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.562_1781418272391_0.03034950157153027","host":"s3://npm-registry-packages-npm-production"}},"0.1.563":{"name":"ugly-app","version":"0.1.563","_id":"ugly-app@0.1.563","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f655b189b9181b71be9f3a577053b78966c394f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.563.tgz","fileCount":4763,"integrity":"sha512-tVg8rXM+dDL/JwVEpH5IiqyZsSvullaZ+BHsMgc9Kl51kwxBu09cTF01gCzDAdodNB+b1WWnAX737JqruPS94Q==","signatures":[{"sig":"MEQCIGgWouA0R41k9UfSDKNThTGjB7VgXK7jU5Cav3lChWg5AiB77/37dzJRkCebY7XS7b7L57vGqwxWe/vRXXHy0QW+SA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110244852},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"81bee4bb68859e767402e7a3f65b2638e4a9fe77","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.563_1781419683859_0.5888936314611202","host":"s3://npm-registry-packages-npm-production"}},"0.1.564":{"name":"ugly-app","version":"0.1.564","_id":"ugly-app@0.1.564","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0270b4e5bc934cee3dcfacde7a3a9e1a9758f021","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.564.tgz","fileCount":4763,"integrity":"sha512-cxj+NY/sj5Q1+MMGDmJkv2MBjmSgS4oUhYS20vPuGCeMVx4L3yqordfaOkAUDiLEgtqXuBICUne+yPstlTDMUA==","signatures":[{"sig":"MEUCIBV4Qy5tUEsbGKWDRann2ZOczXmC+070RI3qnYq2By3vAiEAsrXJqq5o84pshKkrJnLHCQJJxLgEuFjeZq8DhZrHkVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110246906},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9393bf3ea83dd7a4a1bd764d4defbc4954420b4b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.564_1781420084685_0.13565780142367379","host":"s3://npm-registry-packages-npm-production"}},"0.1.565":{"name":"ugly-app","version":"0.1.565","_id":"ugly-app@0.1.565","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1b9cac410965a9aba728fd30e879c2200dff16c0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.565.tgz","fileCount":4763,"integrity":"sha512-8y30fvKB4NR0l5/W9ty3uDvlDuKc+DjFmMivc+N08bdkFhEgJRso0JYjkgiurNnYgjH08Drqpkcoa8r/6I94Nw==","signatures":[{"sig":"MEUCIFRMZUgbB7E9G2IA7p/QWCSb10cNdRx17dqDiEsAJEfFAiEA8om2080lXqtUnbJBECWnR2EE0R2JbwuLLXl8timjf0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110246666},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3f6c41f68bdbd22cc8b60a64edd2e4c6da6d2d37","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.565_1781420759762_0.2634700574897484","host":"s3://npm-registry-packages-npm-production"}},"0.1.566":{"name":"ugly-app","version":"0.1.566","_id":"ugly-app@0.1.566","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2c7c9a07e9abcf2caa328f88325583d6b3a1049f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.566.tgz","fileCount":4763,"integrity":"sha512-4VMGFs1Q9q+U6XofZkPd3STFiVITtLF3aXquxMSxz2ysCEH4eqVLO5zLvrj/yXuxKLGS5Lf+0UvCqItya6zfnQ==","signatures":[{"sig":"MEUCIBpRH/r2eufZGl9qxcz1LLyh2HdoWYV001/nfx7F+REJAiEA6jaQz7mD1tzGDFvfUpuLgs6S2PMXA8yM4CaNBg4Gumo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110248387},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2165c6b4e1a89cb2f947632ba993f9bc828f11a3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.566_1781451553874_0.35811308375453854","host":"s3://npm-registry-packages-npm-production"}},"0.1.567":{"name":"ugly-app","version":"0.1.567","_id":"ugly-app@0.1.567","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5dce230c771af3cc5ee085724318d8d760132cac","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.567.tgz","fileCount":4763,"integrity":"sha512-X/Gl7L/Le0hfbIKGPviTTQ/uxc3zCdtKnqPKeRQTD2jTg/USiN17wi7Etki6ddAevEVn7q24vOb/nX2jl/ePMA==","signatures":[{"sig":"MEUCIFbTQdKxpKXBZajJ+e8ILOjcRvnfh3u2BYBonkvnv+87AiEAjykZnAH+no+QNctrl5z6Sc8RRwHARKjHawAxdK/hv+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110248387},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"65fcf650616cd23d7250239bf1cd97832477844d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.567_1781451788120_0.8507136643666176","host":"s3://npm-registry-packages-npm-production"}},"0.1.568":{"name":"ugly-app","version":"0.1.568","_id":"ugly-app@0.1.568","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4ee8ad63b0014680d5f355606ef793e9f088aa41","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.568.tgz","fileCount":4763,"integrity":"sha512-D3ftxoh9uAeKXcrZadTYYUzbOGHp6qbozXwTTrEXLeQQeY1ZgsOM/PqjX42JXzL6qA4T9XDGk25xofeC1wlFyQ==","signatures":[{"sig":"MEQCIBs/e+Lo6tamvwiGtzUUTHR7oyKv7O0B57EoRA04Nrj8AiAepkxHNHBWbzsPCpj2jckIbYoS96WCL1WuK2kSh6bYzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110251929},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"15f75f04423c54383be47dacd024ccc00f72e04c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.568_1781452490661_0.09244359736737828","host":"s3://npm-registry-packages-npm-production"}},"0.1.569":{"name":"ugly-app","version":"0.1.569","_id":"ugly-app@0.1.569","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fe9ee464df78120decd62d226556ef7209fd59f2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.569.tgz","fileCount":4763,"integrity":"sha512-P2R7OIWEL9nnjZaI3kkgrFBR1vxQ901XXe9AMDfg225G6nnvjny++DMGKk4X1S6jS/VKwrARnk/WUzPm2lQvwQ==","signatures":[{"sig":"MEUCIEPJ/l/BXeCWR0ynyQmrkkq8FuwmoRcI1p7doi9hM046AiEAxFvRqkH60kCsy37qGi6CXwweC3l7ffJILIHF34/HmuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110255792},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4b2985c9545f32d1b9f1b7cfc5eefee64de38691","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.569_1781453168931_0.5595088737489395","host":"s3://npm-registry-packages-npm-production"}},"0.1.570":{"name":"ugly-app","version":"0.1.570","_id":"ugly-app@0.1.570","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"266dd081548f80abfd109b0dc3024ec5a94f3f7b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.570.tgz","fileCount":4763,"integrity":"sha512-jso2MOAzhXOE5acnQ6GV2a5nFKSkmCSo+oVt6WiG9VqSyWceL3R2AfFsKFgxA7b2j318G7kJJjyJC0Q/9eiAEA==","signatures":[{"sig":"MEUCIQCPmTI0ArzWfsW9zgl4u4v4Q0RgdrYKh9m3Nejs28jZtAIgCEp16XzvRHRRpTqyl4ZYM1KWNH3i1ODzxyeiQMYaI58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110255792},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d85f620e9b0953ca2c2181cf6a3a16a0f574fc06","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.570_1781454733091_0.5342020810752801","host":"s3://npm-registry-packages-npm-production"}},"0.1.571":{"name":"ugly-app","version":"0.1.571","_id":"ugly-app@0.1.571","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6533a65203838d351f16c88e613f0038b2864552","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.571.tgz","fileCount":4763,"integrity":"sha512-FXAvRvpFxGaPK7gFXJ97TYz3j7z2cEw1IVryp7Qam17/ZCbeDUOWQQFNespdS3vfb7ozGW60TZgGzm9lS/o8hg==","signatures":[{"sig":"MEUCIQDq2AEJmNT1iLK9B9mNYnbvzVZsA3VeVU4uK+4KxAD6BQIgfx1P+QB2GWlMOPva+crsJMxjQaADBZgL0Qha7OxVo/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110267430},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4a63c1186d2cf561f5361d80500435e485c1e034","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.571_1781464606231_0.8015054644048281","host":"s3://npm-registry-packages-npm-production"}},"0.1.572":{"name":"ugly-app","version":"0.1.572","_id":"ugly-app@0.1.572","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6589fc75e7ddedeb677ef40def6cc673937422fc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.572.tgz","fileCount":4763,"integrity":"sha512-Iw3JWx0Vag8R820ngsmnH6mrxn0/5w4kzd+IDP80eiProCvBww/3wK/ht6zpfD7aM6fjaH/GdWs+2LJC4U7hbw==","signatures":[{"sig":"MEUCICUVTbHjlLddWEc7wGOiLMCKODohVNKUsn5KvxQmyheXAiEAxVqUXVkkXRVk5xntQHSE5aXf3QyyDIVbd7x72thsrR0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110269022},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"da1bafe81bd2ccb0578991a118562af5fec57c7a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.572_1781475121912_0.006298021073964266","host":"s3://npm-registry-packages-npm-production"}},"0.1.573":{"name":"ugly-app","version":"0.1.573","_id":"ugly-app@0.1.573","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1ae7b915688d29b71ceed5a73785e450a7d6e8ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.573.tgz","fileCount":4763,"integrity":"sha512-WD29rHiKZyHk5LT4h/ixrzDiWfX95EyJMcLMIiLAzrYbkxTTVBKZsBWX49qBYN7xcz9JmFg3Ga7y0w3fM7zMPQ==","signatures":[{"sig":"MEQCIAxP5Sr8JmeaWwLzLLG04hIb3CRaRIPCL9Hhbh42n8iJAiARMrH6p6f8DyXOeAXafAK4/qJM5Avz9dNPOZIgI9k8qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110275484},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d73992982e6d4167bcda5ae644bd2c1fdfa0860b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.573_1781476754087_0.5437090925385117","host":"s3://npm-registry-packages-npm-production"}},"0.1.574":{"name":"ugly-app","version":"0.1.574","_id":"ugly-app@0.1.574","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"53a3657788e51cd88ff9618732accf89c02a187b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.574.tgz","fileCount":4763,"integrity":"sha512-8jf/raqi8laun+gbR5ZzM/IfTV7fStljekkt4/7opFJI72FY/pC/Z2gv6rHejOpZ+Xq/OrD2EPiqTfSwFd1eWA==","signatures":[{"sig":"MEQCIDBd5siOGWx18xxvekAtkI2jJChf4gM/xp+AkVcn9hoNAiBfW438Mf5DaDgXhYwqMygkzT8g4Bi68GuGSBnhNQpwZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110275484},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fca2436a73605868819f83f7feefbcf2cd354ae1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.574_1781477127702_0.9212828638314674","host":"s3://npm-registry-packages-npm-production"}},"0.1.575":{"name":"ugly-app","version":"0.1.575","_id":"ugly-app@0.1.575","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4a18b59ff11abd4dd601d7254c6d6b2a82b03f67","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.575.tgz","fileCount":4763,"integrity":"sha512-CuYU+PqKRqDaKoxf/rnzWKfkgMwH0ViLoxG0pUAp9PqVVn1GYWyMu68mWU+6QoQzDfN717TLCDqkJ0oHTuDo4Q==","signatures":[{"sig":"MEUCIEgRoQCzbtO7N7vYgJc9udMRVx0PB/9CcISkgUMuWwgXAiEA3q1MoAQthy8/aZZ76Tke1eiZV1LR80iKgTwnXhiqNJA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110278053},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"edba29e0a14122a9ccac6689b8e48ee59b0e4ff8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.575_1781484490173_0.09271175598629955","host":"s3://npm-registry-packages-npm-production"}},"0.1.576":{"name":"ugly-app","version":"0.1.576","_id":"ugly-app@0.1.576","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4aafb040fb7d8333b54d72f123fe6ec4c30979dc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.576.tgz","fileCount":4763,"integrity":"sha512-PHDZNP2DQDl9/1TGosUNu0jl/rHxorsfKG6TQLRwv2nO+fca/IUj8zEa2LVahyfY0rhNV/PT79ZNTkX4rGxMmQ==","signatures":[{"sig":"MEQCIGDl8Mm0xgKFI5520bm4rDXU1WxTJMuqDyI78HIjU/A/AiB+drhFHkEsVRlPukopAX2vEqE0BjVobGMlDEsR8qCFSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110293872},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b089a95f32fabdc8504ea199340c51e09dec9d26","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.576_1781486504020_0.008193352494002548","host":"s3://npm-registry-packages-npm-production"}},"0.1.577":{"name":"ugly-app","version":"0.1.577","_id":"ugly-app@0.1.577","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de7bbea487dfff4f1248ab5d5d128bb55a410339","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.577.tgz","fileCount":4763,"integrity":"sha512-lzjF/qNx9L55A9oK7kHTzt+zVnXjfV5/k9WRAg7dlE8PKRhgkJZfUlIwFF79MTQClRpBtXk+7udxnsVmAH3/Zw==","signatures":[{"sig":"MEUCIQDKBMommaol07FSKSRf+E0bl+yjTwVgx7upBgnvSrq7FAIgdppARh2P1cTV++ZoGY1GiRLJKXJTelyHLT9KnvVPVtA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110289472},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"839d3fec575691ebf604fc8f564dfff6abcc8d66","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.577_1781490590476_0.6280985601860691","host":"s3://npm-registry-packages-npm-production"}},"0.1.578":{"name":"ugly-app","version":"0.1.578","_id":"ugly-app@0.1.578","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cdacacd4de7727894217df7d28c02421694fd65f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.578.tgz","fileCount":4763,"integrity":"sha512-ppDCUjBW5O3KbBVFFxFRhyABjJnRPb6AoT8L+hxLu41YwsOgS5KQ3wVPJzhpjgt8Zqy94mfht4aqilQaC0jRgw==","signatures":[{"sig":"MEYCIQCle9FcAcCKYrmJlVEf/VB+6drzubLNV/SE7QeA7BKQ9QIhAPIv6YiBwkUxI+guixjnIbuL6/S4Fr6DVMcnTE/Nz43y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110295852},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4da48ab96e724ee85139dc7589da0aa5130ab477","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.578_1781491571949_0.8522925930391707","host":"s3://npm-registry-packages-npm-production"}},"0.1.579":{"name":"ugly-app","version":"0.1.579","_id":"ugly-app@0.1.579","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d81938ef6d308ef053e606bdb07ab0a396624e99","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.579.tgz","fileCount":4768,"integrity":"sha512-BU0kGZL/FJvWAnQfpb97U54m7X4OrMMUbxPjvPNUbxDO2WtuqIgxRKMXqKN1me8o/8b77joa9m8lJM6krEw1+w==","signatures":[{"sig":"MEUCIDi0ZJb66VF61MAIbwUx9OKk89aa/fdX/QSiaB5S+3v9AiEA6SRnaSeF/JNW/q9uvqzxl1kl5iBfq8uZeA6m+bBBACI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110372924},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a6d5082815bb87b661e5e15fc470e6d059654daa","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.579_1781492412029_0.7308943545007334","host":"s3://npm-registry-packages-npm-production"}},"0.1.580":{"name":"ugly-app","version":"0.1.580","_id":"ugly-app@0.1.580","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"13bb2174d20e5d5e62a057a85071a364ee4e6170","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.580.tgz","fileCount":4768,"integrity":"sha512-3Ol9JzEbkGg5/aMOEv0PAFe3TgHmRpXK63h8JZr6CNzDDbjon0SWvGhu0p/aKnkJN79pbrNi2JjWXJlY8xklwg==","signatures":[{"sig":"MEYCIQDm0rSYpnbcVmQAqwUPrSnc83W67JiMHxtx+9zoufgv+AIhAK34LNisvcoVDWh6yflXCtrZEJAAGXPjUZFS3SjXQAXo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110374005},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0afdf28f70c96d7f6952fe5fceefa0df0d941ed9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.580_1781497766995_0.2649077084201834","host":"s3://npm-registry-packages-npm-production"}},"0.1.581":{"name":"ugly-app","version":"0.1.581","_id":"ugly-app@0.1.581","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e65de832404012b9af6fc679093a5dde3e3afaf8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.581.tgz","fileCount":4768,"integrity":"sha512-vvOFQBoYjowhPO7mYczTY5OLAW7Go+rgRsNtYE4UGChX1OisCBFGrhos+Xlk6OsTPzhtyoeEyXmYbX5zomAmHA==","signatures":[{"sig":"MEYCIQCVx4YE3ubt5KXjIT3EzblMvGmMi/GBCfF/vjEzbJ4aNwIhAKPsDIX9Ysw+WmeOfMkJ3kJ9lRA1jmAyWwZIKAtfOBxL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110375137},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"77548c65371c947c52cb4b394111fd36c26176db","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.581_1781498638504_0.8664400979147022","host":"s3://npm-registry-packages-npm-production"}},"0.1.582":{"name":"ugly-app","version":"0.1.582","_id":"ugly-app@0.1.582","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"10802d6be4c7faad85e28662e81219c602bf0cd4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.582.tgz","fileCount":4768,"integrity":"sha512-JuV5maJ0JLWVsmnQVl6yzN1hCz0ceSULEk3L56VMR8B9zQcoe8g0RC2jd9pydLgw6FF32JDL+/TYqTUMo3Ydiw==","signatures":[{"sig":"MEQCIBk2GXbcoWTX8+EpG+4isHqPKhw9hs3VrHp3XQ75gFrZAiBXws59xdrxGrpbfZOOaUkiWvsXx0xbN+iUxijsKuGGFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110370779},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9ceacc464d9e909f13b666e92951aea8c13348d0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.582_1781501043474_0.622828684920989","host":"s3://npm-registry-packages-npm-production"}},"0.1.583":{"name":"ugly-app","version":"0.1.583","_id":"ugly-app@0.1.583","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"68b104a231abb5e03614a3bf5ab72b82fc030283","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.583.tgz","fileCount":4768,"integrity":"sha512-RO43+tKyYp0eK8fqkh8vlR19kJr/G5c5VKc85cPzZJ7S1HmHpBzGpka8sSZ4neqGHsB250cN5lA8nPx9QyzYtQ==","signatures":[{"sig":"MEUCIQDbdNiaXQKo83kfZWyABjSWxCRPa3Q6FJ8C3rIYdR4rEQIgCH4VXZ2UywyQ4VAUuguVNiZvfEqwiBvRQsshxKLqI8c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110372395},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"422e5c1beaf6496054efe92a6dbce9ff33237af8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.583_1781503155217_0.458275428840456","host":"s3://npm-registry-packages-npm-production"}},"0.1.584":{"name":"ugly-app","version":"0.1.584","_id":"ugly-app@0.1.584","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1375250aec5f7d077aecec38d9a067e9d78075fd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.584.tgz","fileCount":4768,"integrity":"sha512-hIbMzeQJrtwppK+XOQx2l5RxrCCxlm+9eziQE3BxxUwmTBf+2wCUBe2GOy7I790KmcmhkzbU3nrhd+Eftgg4WQ==","signatures":[{"sig":"MEYCIQCR6jG1YbDs+ol1ZGH9ymrLVakoq1bcW/2Apeyq1YLqzwIhALZ3y9/GFWwKMbIksZ0MiSeFR58U46qNncxqKutxJ7wR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110374331},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f79df52d0ce48f19129845ca7ad2d419ecd9df91","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.584_1781503704714_0.5066644341441762","host":"s3://npm-registry-packages-npm-production"}},"0.1.585":{"name":"ugly-app","version":"0.1.585","_id":"ugly-app@0.1.585","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"82847a4411f37e85b4baa7eac9a3a6a8dd8af507","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.585.tgz","fileCount":4768,"integrity":"sha512-X9984QxjwDMfzjfl3LYK4IQcX4JS+4JbGioRX8e/edM8qpgTg0z9fy7p3+nx6LPfwdjpduSDk692zfzkLLtY6w==","signatures":[{"sig":"MEUCIQD4vidSadWoWaYQ0J0mn/mkasqam8VBrDYTNNnxPHqYiwIgBzNe8R/zxx7Y0cXFzwGCkN1GEsbEa8ytK5bb3ml2oQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110375620},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5a15be266e084388499da315f3f55964a1897c3c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.585_1781504058519_0.002928100726692806","host":"s3://npm-registry-packages-npm-production"}},"0.1.586":{"name":"ugly-app","version":"0.1.586","_id":"ugly-app@0.1.586","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"98e6e3b5bd3de570a74524eba7a39ef0e5ae4934","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.586.tgz","fileCount":4765,"integrity":"sha512-x01p2oBsvX557u70/cb3N7TKO/z+LjSOazj8nDKnLYCbuC1mcDq5UMvSQr10JvpG8kPBtI6gXEQHdIHXJNwO2g==","signatures":[{"sig":"MEUCICrOHzPFmsDNLV8joSTWZFiYVU2JWirHeu2dxl+I1BAzAiEAzTHZpgBkqLXDP3Bf8x6ohBQPRPnUwvpLszI4J6ZEc74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109897996},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"316d13c6f4107fde8a16405658496551b49f5132","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.586_1781538708569_0.6470247846374715","host":"s3://npm-registry-packages-npm-production"}},"0.1.587":{"name":"ugly-app","version":"0.1.587","_id":"ugly-app@0.1.587","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"41397e5035f193065f8719ffaeb4f60e0eb6c43a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.587.tgz","fileCount":4765,"integrity":"sha512-cpNFRpirP15/9EBCneSSpUgUC5sHnHHnyDtT0G9Z65HFOl/bG8J0q669s3yVg405pt0yssH/56UTTW8/gN41DQ==","signatures":[{"sig":"MEQCIFFqyYa+jSYeUKn+yhdFfSmHUmx0gXko2v/4vCWEEiExAiAD50GI2W+eEKMxCRdnCGFIf6x4buZQ1ZqCjNVyg6Nn4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109897923},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2cb4fc5c7aa7eb5a2c989d7b007275a9455f899e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.587_1781538985729_0.8606107094021069","host":"s3://npm-registry-packages-npm-production"}},"0.1.588":{"name":"ugly-app","version":"0.1.588","_id":"ugly-app@0.1.588","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dd9aac8ff59433abe2ff3fa5c2dda48aa60e2129","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.588.tgz","fileCount":4766,"integrity":"sha512-sREVEoivCIAyC/Zh7qIoD9ScFgTS3gmx5SoUQc4yY2HpPrzYiBcxy5XTEizSMI6iD6IhnUQnlXeHG/NHJysOlQ==","signatures":[{"sig":"MEYCIQDj5SMVsluWgq7+KqfBVkMfNiHdCMfgwG3Kr0G4HLVh9gIhAMR08jPdRbj57Ro2zIRQ0Z/sqAhttg86M+obgstDOAcs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110059734},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4002bc46aebf6cbc026f6d57d756f264d317b628","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.588_1781539532207_0.4482611297207779","host":"s3://npm-registry-packages-npm-production"}},"0.1.589":{"name":"ugly-app","version":"0.1.589","_id":"ugly-app@0.1.589","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1f8fc2cb9a3309e143c68724e7685d3b10ba2660","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.589.tgz","fileCount":4787,"integrity":"sha512-uerl/ZHUagjQWyFbpqs+srFYEo7HU5UYdipE/hrGp0TdqFRKDcynTQEQEqefgVFap409BPxqe5tFMyfZx5oPZw==","signatures":[{"sig":"MEQCIH6rKrTz5TlPIy6ltavFBzsJ/ayqvxC+6lxGMOWwnHWPAiAJrIPa4H5zDuSycaxh9yFyMWFq2auBuYt6zZBsK9jlxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110259385},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e82e375c8db27778d3dbd7cd3f3526979566ca98","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.589_1781540212132_0.42345547725731003","host":"s3://npm-registry-packages-npm-production"}},"0.1.590":{"name":"ugly-app","version":"0.1.590","_id":"ugly-app@0.1.590","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"506d6b7e86ecd7c11a235a41e2304dfecbc471cb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.590.tgz","fileCount":4787,"integrity":"sha512-zusrzsWDV5tsYmaQCynAb78FueRG3OanDBpjPqjl+0MbZTZQHLtvbnWrkxNpCQjTGx5f1G3V+IKRFWOG6shJsA==","signatures":[{"sig":"MEUCIFOA1X2qRBlIzi8KMw0sy6dPIFA2EZGbEUpOrohE+nXBAiEA0mcLY6ElqdSKwPE3LzJL9NoSPCXKIS7ObnAvR2G3b7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110268893},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a752fca4ab2446e03b291abd9a0eee32892882eb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.590_1781556963295_0.765240662633395","host":"s3://npm-registry-packages-npm-production"}},"0.1.591":{"name":"ugly-app","version":"0.1.591","_id":"ugly-app@0.1.591","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d5a8b169357c3fb74dcfdcf83f5751c9ebf6cf1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.591.tgz","fileCount":4787,"integrity":"sha512-169iVtsJozUtQAdSa0151a6PsdX9dDWFPAbQfz9bMSOdWB5F5WOIRmxnVjnOVJjb3JrrHfL+sV9tYue8V2OE9w==","signatures":[{"sig":"MEQCICMPQXzp+LZJ/x4ZZyRNEbRbZDj7GUe/X6ery9ELfddnAiBNybA1s5jznP7SshtUy6kyzh8Z88m2bf6YONJNnOBwUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110268600},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8dfbaf90a34c47fae8d9f00d4dadcc7692a98caa","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.591_1781557655778_0.8711967542551584","host":"s3://npm-registry-packages-npm-production"}},"0.1.592":{"name":"ugly-app","version":"0.1.592","_id":"ugly-app@0.1.592","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"64eac2c74935c5b95d664ea0c1fac3f9be1f3b7f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.592.tgz","fileCount":4787,"integrity":"sha512-l6/SohX0LTeeqbuF3va+EIkXgVo5/LbAjWotjSNmdK3GddYVrySgBeIuBNSP6d4Rg3IBcmJEpojWAyCTrG+h1A==","signatures":[{"sig":"MEYCIQDQuFG1iW/4Si3jI8kAV5SlbjGgK7rh219I3BJ9wXPyZwIhAJMqyX48DMLVvULdeTAd6lj2o7AEajCr9HHQDA+9zyRh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110307869},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ab095afd83c84160d3f3fa03e1c4d6b2be12eabd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.592_1781564493995_0.0019627134499753396","host":"s3://npm-registry-packages-npm-production"}},"0.1.593":{"name":"ugly-app","version":"0.1.593","_id":"ugly-app@0.1.593","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"018a6a901401cfb96bb92c0ea562e5d0f5227ec5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.593.tgz","fileCount":4787,"integrity":"sha512-+pZfouVWLSWiJkl8D5+OVQ1L7NQkLcwB7LHPYkpcqpGomm7DClqSZi103dKTX6btvqYfE0Lu+UQiDfNTh0hNLg==","signatures":[{"sig":"MEYCIQDPji2ODxNJ3wCKjeoLGvEQ/+hY6amPPJam63xFfc5MUgIhAP06XTz1Tn80I3xdOXK3jC45HnTn8xiassmhJ25W4cRo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110313893},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"63f20b5c61ddad1dcb18eefc85cc56396f813ecc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.593_1781565428921_0.21342119731924591","host":"s3://npm-registry-packages-npm-production"}},"0.1.594":{"name":"ugly-app","version":"0.1.594","_id":"ugly-app@0.1.594","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9072d8beeb1b793201222cb43074c1f0663d26e7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.594.tgz","fileCount":4792,"integrity":"sha512-iPpUNfdd00hSI4tgwUYQh6Jzn8aKqgThUYCsyIJTxOfqcCqAotytaMl6yfiVEWQqzKdaaM1vNq6bLFg+ODgrGQ==","signatures":[{"sig":"MEUCIQDamoSBsuk3GSFnrmCgAe93UQt79EEAfwWQ520ayq1WsAIgNmoGU37KoZFdnDJf/E3tG4QQ1EtS2RF0AL2CRWNDUsQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110373449},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cab55f545c2ab9eeefe840cc880912cb6d3dd3ee","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.594_1781566958193_0.8204605534738612","host":"s3://npm-registry-packages-npm-production"}},"0.1.595":{"name":"ugly-app","version":"0.1.595","_id":"ugly-app@0.1.595","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8a20a43c48cbc239e8e5bccad39a3110d605a889","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.595.tgz","fileCount":4812,"integrity":"sha512-kYyqCkb1P+FLhvOKTVvRs+7rOJovO0lHKrwHz77lMIsGaS8+yLefOorP/HTkt3uMW4Fzh2hSfjh3EM4nhWjvzw==","signatures":[{"sig":"MEUCIFZFLALvfuS2gH/zvJ12teDDmIMCx5w6gBF8r3PXqoTeAiEA6pd+WzqDXm8qUdYATyYGGU4mwMVnEgJEO7c6MIdLHXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110441130},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"90473d0193169abb5caa2641dc87747f3e1f37ba","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.595_1781584245009_0.17717578534289347","host":"s3://npm-registry-packages-npm-production"}},"0.1.596":{"name":"ugly-app","version":"0.1.596","_id":"ugly-app@0.1.596","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e1902599db2fe74f4f51c616bb8fe67dbab55d72","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.596.tgz","fileCount":4812,"integrity":"sha512-U9j9VfkQH5Va6Yhbv37sCdmrqUMPRx/dDNJQ8w34PQNk0MVTHhnE1AR6/mNcELHrNOD5c443axm6Ftpn0QctUA==","signatures":[{"sig":"MEQCIB90PR3PjRS/ViIg0pocqkmCTVU2YQpZ3HYjP0sysobgAiArsFF/09WyGS1s0x4nx88ylxip0kR/WcDJ1RM+L9H/iQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110441130},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"28ac793b7b8d768833e7f92379a16cc99444f643","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.596_1781585188206_0.05649551769617056","host":"s3://npm-registry-packages-npm-production"}},"0.1.597":{"name":"ugly-app","version":"0.1.597","_id":"ugly-app@0.1.597","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f2fc744e3c47ad6641d45e26c72d341d05366a6e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.597.tgz","fileCount":4812,"integrity":"sha512-LvRjPhufNjbmD0d3az3I/xTHTdV3dsj69jNNorb5fZ80DeJqhF9LF1PVJN3zu1nZTTOralhLx6xLFqqTxq2WJw==","signatures":[{"sig":"MEYCIQDGY4xMvkYbMn9gaFdktAytNyQjUXekS5ekqOV98fVzWAIhAII0uB/c+MBxNNz8J/lXfvBv0zRrVfBJosEl+PV1nRUe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110453774},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ebcce337c7c67b439ad5127eed08bf3558f574cc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.597_1781586258929_0.419496495321779","host":"s3://npm-registry-packages-npm-production"}},"0.1.598":{"name":"ugly-app","version":"0.1.598","_id":"ugly-app@0.1.598","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2ce5c0b7c2b82bc786da60da8ecd6ebd74c8b15a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.598.tgz","fileCount":4812,"integrity":"sha512-x5HPScHdJ6o6Wuwa76Us7cNPXxqktiHvLh6IyvQESPbia0rr1/YstvxmmsGqbAUoL5t7s4Cm1AiRwPAmc9fy1Q==","signatures":[{"sig":"MEYCIQClOVKciyT5z6Pq/IvBkRXY6zYhT9EuiDwrNls+Eb6SrwIhAIdPb04aZkdiAf0v/reFJGmmE3/r492wRGLel0y6zkxG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110454236},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ebdf53a92a13a85052f3faa5ba7fc7c9fb772db5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.598_1781588606686_0.16334280488846642","host":"s3://npm-registry-packages-npm-production"}},"0.1.600":{"name":"ugly-app","version":"0.1.600","_id":"ugly-app@0.1.600","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3649e45a62abe05c00390257d10cd4744123603b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.600.tgz","fileCount":4781,"integrity":"sha512-dZNfWfTw1/Lic/yAC79xaX+kYKT/+7+Imlz4lJmibxP6GFkSFSLPPBw54yT29OtGQdAMKPrFaPD9+XUlIvGdRw==","signatures":[{"sig":"MEQCIEW21sO3vQUIHgoJqCN6cA6WuarMFu3RKYlFl5vqs49/AiAS8rIw/DWtyUEilt+Lg1dn5tnxEIl8MFrw+AcLhwyEFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110376226},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"82178dea4f0a76b4fd06c93a38c65a000ad7016f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.600_1781590003017_0.22009336724676132","host":"s3://npm-registry-packages-npm-production"}},"0.1.601":{"name":"ugly-app","version":"0.1.601","_id":"ugly-app@0.1.601","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"92ffa2ad31a5aeb62658aceb6b4e335cb9a45d4c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.601.tgz","fileCount":4786,"integrity":"sha512-2qSvSwHDoTmLu65EwMGjQSVDg1fVad/wdbKtwIYrmeOU+qmBnJJVGt7hgLWhdB7dJ8x5Z13BeCufzB4Ug8c+Pw==","signatures":[{"sig":"MEUCIG9CUud2cTHCxWQbRr7CTv/Q8LylIwkFdQ0xw7nA2j6xAiEApdWqHiVgxdRxgFPo/hNlVbfRJ4VusdWEsdG4vFgkab8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110389326},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b8fde179333458ad859e0c235dc60b42f7f47e16","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.601_1781590344273_0.5893993031874898","host":"s3://npm-registry-packages-npm-production"}},"0.1.603":{"name":"ugly-app","version":"0.1.603","_id":"ugly-app@0.1.603","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"49740f9e438b9a82758882f70e8344252a6d9719","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.603.tgz","fileCount":4786,"integrity":"sha512-+IWuhUbbPLFEbT6FPb8zaeTznkVAsH/EhtcehglldM1lZvyTOTFDNPXNGyYTdBFFw3e/h7ZBrqxwi1ScGPOX9A==","signatures":[{"sig":"MEYCIQCXv93hjAy3ToXI2XYnAgVfUND0zl1mlpmxwZ+zwhKjDgIhANtP/cKYafsd0SuESZX++pJm4fkfJxBENdf6bh105sL3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110396797},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0946f65f8dc3446944ed0fc685c99d56d8733283","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.603_1781591004068_0.5826163947922112","host":"s3://npm-registry-packages-npm-production"}},"0.1.604":{"name":"ugly-app","version":"0.1.604","_id":"ugly-app@0.1.604","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1e2c00b1b8e2acf46d3bc82d4ff9cc48632e7ccd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.604.tgz","fileCount":4786,"integrity":"sha512-XEUrSRtu9AdFLXAMakJHhMrSh+TEH8KWuxuOKnw8Oj5tQ6gf23/YeAg4sahnTi5xyXyt4j/3NiAErcUskhQoVg==","signatures":[{"sig":"MEQCIAgywn3NjpqEdWuDi6JdFjrYS1vsMbL612ydZRf3WnJTAiAdbETlnGE1LbFJRwCgzcjWLs0tml+kGG6DdULP8s2p+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110408289},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"18a0fa53cb1aea496819de7601b4ad1bc65b4906","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.604_1781623795872_0.8040717589337443","host":"s3://npm-registry-packages-npm-production"}},"0.1.605":{"name":"ugly-app","version":"0.1.605","_id":"ugly-app@0.1.605","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1b7a1c710751f6d85b921a8bbe683c8203a94a00","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.605.tgz","fileCount":2040,"integrity":"sha512-AQG5h0SV5ToB2ooje1gvyELXgpn00Jy7GpmkT8+QpO0idXwDjzwyKoffTp6KbQQ+T7kyrURhd4S211sVnF8yIA==","signatures":[{"sig":"MEUCIG5Ucxi6HW4jmXHGdhXWZ77NbUiQth642QRfOFDapnQsAiEA2QxLhCoGXPomPrVFDeqki2HxJzx/BFVVAx1XM2zhrEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9680951},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"885bbe3669e466917cc7630f013414729ae9face","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.605_1781624441458_0.8575438178187837","host":"s3://npm-registry-packages-npm-production"}},"0.1.606":{"name":"ugly-app","version":"0.1.606","_id":"ugly-app@0.1.606","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"579640a8fa668e26f53ca533371e35ee96952cca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.606.tgz","fileCount":2045,"integrity":"sha512-cRoDrdMUjJbB1owGoXXqag7AnR9gyDp3/IlCPaMzfuq6Q3abCHB2DwWYkhuRG2T1s+gwpOBfPKZpHuR8iOL50Q==","signatures":[{"sig":"MEYCIQCxtqoSNaijkBVcrfXtDJScXKTiq86JuQ0TPIu2sc1giwIhAIb6ASTpYVLORwBg+Rk90p/0heFh5vJPFmjxJfzg64qN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9701253},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c72ac514ef86c0143050ac9312672df8bbfdb023","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.606_1781625730041_0.9484027560463739","host":"s3://npm-registry-packages-npm-production"}},"0.1.607":{"name":"ugly-app","version":"0.1.607","_id":"ugly-app@0.1.607","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e264171e061e8e8e09cc79edfc7802d062c448f3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.607.tgz","fileCount":2045,"integrity":"sha512-DWq+6wc++Owuj7YFahEk7ZOMuw5n/X/pV41EsaLezOMFurRJTPmY/NG3KWZrdfTyorrw0Q/C+mqHydcl/m1cew==","signatures":[{"sig":"MEUCIQC9I/igb0jditTMRHnR+2wfFLyKszGBlciQmJH2KEGkgwIgG01yvcSr0fXEjb1YhgKnvh8mp4Zi7lLNA0X1QONHyiY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9708198},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2426b631a31bb6a5c3b600c4593ce0c0ca1c984a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.607_1781629230992_0.9749439066262615","host":"s3://npm-registry-packages-npm-production"}},"0.1.608":{"name":"ugly-app","version":"0.1.608","_id":"ugly-app@0.1.608","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"71d2f9769695c2c4bf3eec2d5fd205f60954a780","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.608.tgz","fileCount":2045,"integrity":"sha512-idQq92RrRDBUdHoLv6jbYIuiLoFHsVUOfb/t/uRe/GECc0GPgtNsRG1YvhyjRWr649gh+jCZ99ZuWEE5YxcOIA==","signatures":[{"sig":"MEQCIEfkVKBb9V+i9OWBdG/B8lX1ObWNN2X9wMjvOlMX1ALYAiAa40YrxHwghvxx4GJ7npT/NtolYSV9n1+82CWes+p01w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9714639},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cfabaef2f10ba2d1d3a8b828a56ccddd8cb50761","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.608_1781652667138_0.8698912765808429","host":"s3://npm-registry-packages-npm-production"}},"0.1.609":{"name":"ugly-app","version":"0.1.609","_id":"ugly-app@0.1.609","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8f9dc139bfa213621c2411c5b6aaddd80407dda5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.609.tgz","fileCount":2045,"integrity":"sha512-Kn2nm2BE1l3OmO3IcgZVWO02SPWj9qX7AyyR1x2cLMHhuc4tziMhZ47VVCxeJXHaUFZRuK5cpM2fOuF2DADkFw==","signatures":[{"sig":"MEYCIQCH3Onufdyp1dwsCI+Xgq+hJeWiM0ruH7vBLteGSqs8lgIhALI86/gXuz7kQabPhzSAPKXOuy4ZkZb43cwRtGj+GKkJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9717431},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"49e76914890b816cce7d453a7e59e944164b32d6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.609_1781655264976_0.6496200007358865","host":"s3://npm-registry-packages-npm-production"}},"0.1.610":{"name":"ugly-app","version":"0.1.610","_id":"ugly-app@0.1.610","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0415d6a7f29cbbe85ee7d90ed5b53e96938eb74d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.610.tgz","fileCount":2045,"integrity":"sha512-6k8Pi9TExv2QK4lPAZglSITogR6PCqJZ9Imx41pqI+62MUhwjreb90JqDMTP38hmfgAp4wTGg/XiZoa6QIupGQ==","signatures":[{"sig":"MEYCIQDo53tPi8T3av8Kl4X+BgP/dwl39ykO9AQhPxQMQHLLzQIhAINudVSdoaKnhNg5YSsdFZ7F07nkyeti8l5Dk1n+8S+E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9723305},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ee0ac4ebcc4204b002c5e4f6769537fd61311430","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.610_1781677225414_0.9823406887791108","host":"s3://npm-registry-packages-npm-production"}},"0.1.611":{"name":"ugly-app","version":"0.1.611","_id":"ugly-app@0.1.611","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"053f5e6ebf0887386824c8f0b0445046e0a676cc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.611.tgz","fileCount":2045,"integrity":"sha512-aPGbJbnN9eqLTGDvnQQwpkX92y5v2HAhwN0aNz9K2DJbLf4340DitpyKZaw8FwxMBaBcsl2Cwb0+SMFkdH5opA==","signatures":[{"sig":"MEUCIA1u9yqKcGVecVonfxyfumOV+8gryUby/HNAH1WX/A2FAiEA8jfDvTYRSgAuX8mks9Q4JgCTQcnwUMP4+dyY6sAdQ5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9728272},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"556d51f43641004fc993e6327297d6bafd98884b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.611_1781711292389_0.17107771154141305","host":"s3://npm-registry-packages-npm-production"}},"0.1.612":{"name":"ugly-app","version":"0.1.612","_id":"ugly-app@0.1.612","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4c75cb2d480f85dda83c074a4c87195864764924","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.612.tgz","fileCount":2050,"integrity":"sha512-ZP+kd/VFORFhE4boOvTwJi8EXi5bz4/qMGKLtVlStLtzAuJrRIa8QZyOSQQBxnbfuaNbWn4f54CSsU7K58staw==","signatures":[{"sig":"MEYCIQDkeejQmSvtXgxoqxS/ru+TkcpBSPjAg5vRx/zfVnmhWAIhAOYKLesIpyuXmibXZ7aVOqeuvtbBtwh2VGRXwVJJrh9D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9793817},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a2d824067b08ad838fa7c2297ba19b6da9f55f2e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.612_1781716518844_0.2908558298670503","host":"s3://npm-registry-packages-npm-production"}},"0.1.613":{"name":"ugly-app","version":"0.1.613","_id":"ugly-app@0.1.613","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f697d6eed81e3d7fdb4534d399ba70a7ff86d87d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.613.tgz","fileCount":2135,"integrity":"sha512-AmnR3wkbgRqVASA2SOAV9on3NXbgwcFuJ9GY9b2AB1EiwPlkBGcj/6m1vA6834UAvhGUZoB3ZRbhXVPGyo532A==","signatures":[{"sig":"MEUCIFq7UI/dXQfnV7bghBcCouVaAH/PXRDCf3oQT1fXV5PHAiEAtQE3HUABHefST8QBakkT8pYw0BdZe9afJhSali7PEBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9948392},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c33fe1c80c96e716aba3d7841b8fcebc3bc923fb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.613_1781888090318_0.11934160409065186","host":"s3://npm-registry-packages-npm-production"}},"0.1.614":{"name":"ugly-app","version":"0.1.614","_id":"ugly-app@0.1.614","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d43b696ee8b91a3c34a774a8167b0a70f62aaae8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.614.tgz","fileCount":2135,"integrity":"sha512-VvuNI3EYntBZXZIO44y3VN4VxRBirVrSBcgamxZg7llyEX+PHkWu7qPLwU+rf7+YdpwETpeW3tudHJtnAN3jBA==","signatures":[{"sig":"MEYCIQC3zUcrS99IuXq53hUufPDQQEUk1cFPRtxG6YVtbOaq/AIhAPQ1+owmqB/S4dUjsbrjeEqBPL/UJCX1950C4rn3kbvG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9949013},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"90b630e7318904cf9421d83f789af74e8efd8bd2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.614_1781888266764_0.9331271410453967","host":"s3://npm-registry-packages-npm-production"}},"0.1.615":{"name":"ugly-app","version":"0.1.615","_id":"ugly-app@0.1.615","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"48b08badc23e31905c7f04430072fe8037244d1a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.615.tgz","fileCount":2135,"integrity":"sha512-h7oi0+o1kQ4Iw0yctygfk3A7ZKbYVfgFPEM7qNFjo0wKso6wZnkerFCjVf/5w4oNoBLHmnmgd2mACe4GHZ9f3w==","signatures":[{"sig":"MEUCIQCwwtdVNQAosTjnNrBDoICsIejrxE0UTDUiUmRh8iJ+8gIgJGt7bK6MwqdQlmalsnt18gwDhDPR8m0pJIVX4g1XOG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9954361},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f9fb759d1946e011a923a2d167cbcf9d34e67852","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.615_1781895142950_0.28198900274219096","host":"s3://npm-registry-packages-npm-production"}},"0.1.616":{"name":"ugly-app","version":"0.1.616","_id":"ugly-app@0.1.616","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e2f13d35c643ea1ad3da584bb7919206147d9ff6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.616.tgz","fileCount":2135,"integrity":"sha512-eAcNEPOxbyQBw13kF930nJFyXFX/VDoQz2ktH0cUZ4wBaIY7utvYRAjPveiCU+XatVAjwVnV3BrUTp7eSNZEDQ==","signatures":[{"sig":"MEYCIQCs5PDnHMS7yM4zxLm2uiZTCSAy3YLKa/bA98Iz50PL2AIhAMpsysW80+MjBSXBtywqrc82x9VT7F/Pt9MDYDD9ztP4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9959730},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d98d120e56ac4de25fe749abbb8d7d53638600c9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.616_1781901090157_0.2540981034303911","host":"s3://npm-registry-packages-npm-production"}},"0.1.617":{"name":"ugly-app","version":"0.1.617","_id":"ugly-app@0.1.617","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8889d71ad5e0b032e7ca0caa599458c3c2e70ef5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.617.tgz","fileCount":2135,"integrity":"sha512-6HjCYDjb/H5O6bfWiNyubfKln8sG8LT7oidJuEMs1OW28JQU8k+yS0J42Xh60Alt8c1XApgFV6/H1JuKEE+6Gg==","signatures":[{"sig":"MEQCIBrtqD49JW+4E8IYMRSn9NOPeNzHVOO/XcEzCaSXtdzHAiBnUkLU9sdCKePp7+vsDP1L6/BCjJfRbTYOSf+U5lyHCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9968196},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5ed4863e7836e49a208b80ec8d14663e5cfba814","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.617_1781908884211_0.1180365463946702","host":"s3://npm-registry-packages-npm-production"}},"0.1.618":{"name":"ugly-app","version":"0.1.618","_id":"ugly-app@0.1.618","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6f754487e6730ec7ebf77dd7183a385e694e7d88","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.618.tgz","fileCount":2135,"integrity":"sha512-Vxm62M3D1r13fzIV7W2/3RGsrge64yeV2yGrqPFxwL3QrzqNG/FGKbCvAzRgMrw+sZClgbqDvt0c4WEnKXgrbQ==","signatures":[{"sig":"MEUCIQCfTpMtAtN/VpK0UQXAEtaiypJfvXzfgC7bVgd8NOmnbAIgH7vzq2yG0Yk+Th+SSE8zB5SHCN4xRk6q1QNf41OvZJ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9967281},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"18513597d98908d7dca96e26cb78acd95ecee65a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.618_1781910038591_0.17965244882034392","host":"s3://npm-registry-packages-npm-production"}},"0.1.619":{"name":"ugly-app","version":"0.1.619","_id":"ugly-app@0.1.619","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"875baff4ba549de0c2af4fda6f3cfa9ddf8ce9f0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.619.tgz","fileCount":2169,"integrity":"sha512-mEB3S+D1fTIEvcFA7Zb8Fs5Y9wmETldX80jng7LrHtd6KSBrHTvzSBxzu2l1q6H/l3E53D1/Uv3EV1CnFp08Lw==","signatures":[{"sig":"MEYCIQDMNkhONvZqvh5MhsjX9h7crP5XEqALQtStJ2Um0kUUbwIhALT5IoudyWLFjt8WLIqyJR7pZL1WPfIfL16zl35ORQEe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10022323},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"23a3b843a554dd5c3a21072a9340a8696cd0e07f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.619_1781914858080_0.7409268485161817","host":"s3://npm-registry-packages-npm-production"}},"0.1.620":{"name":"ugly-app","version":"0.1.620","_id":"ugly-app@0.1.620","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5ea889f49c5267ea7b649fcc3e855c3fbfaf24d7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.620.tgz","fileCount":2169,"integrity":"sha512-M4Vvl0YY4v94vyUhk09FQTJUGAHqmKhFVhxNtO14kKvN8NnVHoRy/rNbnyzZzh0FqJmstm0P2oSIe+zJLu343w==","signatures":[{"sig":"MEUCICyUId8HsUlWSaBYjFVNBKWMnC5UJnp3F6oeamscdwIQAiEAxDmYOrqraWkMPLtju8U0LMteoVKn6W5oXhYgDIBjLMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10024488},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e711c478b9e7615a1a607c24018d90472f546d4a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.620_1781917219202_0.18711478322912956","host":"s3://npm-registry-packages-npm-production"}},"0.1.621":{"name":"ugly-app","version":"0.1.621","_id":"ugly-app@0.1.621","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"38b549e718db4342d41b4ee8fea0b5fe66dfe6a8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.621.tgz","fileCount":2204,"integrity":"sha512-g5U8vku5zDe8m9hCIJmcGnaklUgiDEDX6RBAax/MnJG3c8twifw6E4174hogW94AwGFbgjpJl4f7hnM8u/TMbQ==","signatures":[{"sig":"MEUCIEsihwwW6a4a483otTWrEWY8ZpCt37bKZK6TiJXb9VuXAiEAjCI5i1bH329byYlbxDpJtCFm4nYe31vVJ/5qFyIzdLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10119413},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6085c9fac470d89c2c188f165e8fd9c588cd4804","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.621_1781919316328_0.02966231298145594","host":"s3://npm-registry-packages-npm-production"}},"0.1.622":{"name":"ugly-app","version":"0.1.622","_id":"ugly-app@0.1.622","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d021cdf3b1b0d4487cf878c6aa35b2b98999499b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.622.tgz","fileCount":2204,"integrity":"sha512-7Z/x9frlQPUvYQJ++okU7gusOciEgn2N+aEH20GydCDZu+oHlAd79NB6Ip+CqK7lD6aEqNcfuD5KGm+zKM2UtQ==","signatures":[{"sig":"MEYCIQCdNBHwoEs7kusFWXSk0PBFEpkw3Btni8X7BtYqowsLnwIhANPud4GrFO50OytVQ2X/jYUe63L5QKLoFr8DQqMFqpF2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10119694},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e065d40638131f4c2abff85afe70e6a00f4c4486","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.622_1781920708470_0.9079929915609088","host":"s3://npm-registry-packages-npm-production"}},"0.1.623":{"name":"ugly-app","version":"0.1.623","_id":"ugly-app@0.1.623","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"00319f3ba05ddc03c36795c34ca8aa544b90ad47","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.623.tgz","fileCount":2204,"integrity":"sha512-S64JgLS5A9uRZcyLQnwB192V3ICDEcbDNiVwQdqSUjX09+s1JLcUctNgNeb0mq5czZg5cSmxLHFy1v+bDt/zPA==","signatures":[{"sig":"MEUCIHxipW1hyyhbCcPnSje3DahyRShVz03QpXOt6kHgd2XzAiEAuHRy2kARB46Em0Gh+vHlMD9Ahif8b9Em9y0NwwuhU6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10122597},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"40419460427905dee0526753ee41b51fa60bb6fd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.623_1781922033048_0.28917531010836695","host":"s3://npm-registry-packages-npm-production"}},"0.1.624":{"name":"ugly-app","version":"0.1.624","_id":"ugly-app@0.1.624","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a286c6ce19dc028ab38ef9c336f1b18599111913","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.624.tgz","fileCount":2209,"integrity":"sha512-QDv+675t5d9zIL3hIPWftN7UGeZB7qUZNDo0SERxMWRI72ktwYs9lr8TjScr4bSXudszd4kSKZaEnnwrfgIlcQ==","signatures":[{"sig":"MEUCIQDSllq178dMBDJ9hRXa9AFuLGWVj0EfAE9TfRpnxVNZZwIgRDoBXtGV5g1sgx4W2ihDHO+Uv/dIH6Dbui0KhXFyevs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10133885},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bc917404c65d6d19b66b39fc32c32ba557da2fdd","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.624_1781928737467_0.11215274382287155","host":"s3://npm-registry-packages-npm-production"}},"0.1.625":{"name":"ugly-app","version":"0.1.625","_id":"ugly-app@0.1.625","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ece998fc1fe03951947ccb8d596778d66e00b155","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.625.tgz","fileCount":2210,"integrity":"sha512-lAo4lWPzra5x2z9Rkn2qysHNQOtWqJXPzaDSGg203NFDm7qD6AAqtDCgp54OSdPFVoEnmGVEkm6VmGzz7UPkpw==","signatures":[{"sig":"MEYCIQD97EF6o1s5fq3RrODaarP5mHp/AO2BrakyKmtO/DyI+wIhAN4uCYwKLRmAddRF2P4QceU/TYqz8mwL9BkMpcOmgdz+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10154675},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5becfa86c1a5f4ef84caabef6345a19c1c35687c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.625_1781931347156_0.32733039630801275","host":"s3://npm-registry-packages-npm-production"}},"0.1.626":{"name":"ugly-app","version":"0.1.626","_id":"ugly-app@0.1.626","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1fbb6fd841caf026c0218fb5f985fcc733be392c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.626.tgz","fileCount":2210,"integrity":"sha512-zSU2ydIpDXRUhBbSMr6POJrLUyi33AwQ1VjB43Jx7NuQGOu55I4W5d4btQ8dys+Y6qmtd3H27EAwJlM6H4AdwQ==","signatures":[{"sig":"MEYCIQDlJVN1P4vlp5D5CUCPhiFvlcVTao5o9/RbrJvqIQLDbAIhALmb8aNom7WMcyNuRTjd/H8AE3K0QE0lbmvMUZBa0zFO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10156211},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2d2eaaae2f7bf00f19fdd9e7b63cb2d04621e4f7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.626_1781931754490_0.08291140964303212","host":"s3://npm-registry-packages-npm-production"}},"0.1.627":{"name":"ugly-app","version":"0.1.627","_id":"ugly-app@0.1.627","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d39a42c1c3c49fef075ac20ff19a563e61e2b2dc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.627.tgz","fileCount":2210,"integrity":"sha512-4hv4BB/DQfOQ/z0t7Qm/DY4W1zGNgtHw1iNsO0zNU7fGHo06+TRrLZR15w4mBqYdJf0D5APG641es4lNQrYGRA==","signatures":[{"sig":"MEUCIQC9jJ8lHga7ht4RQHeYJtlIKrYZE54aowhTgSIGOTIF9QIgDA0RYcEm+LYsaRDE/0qXajKXFRRtR/y2kojd0FLi7Pw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10156277},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1e3caf36bc69122beb24dd3b0d581949df7a6ba1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.627_1781931837497_0.25300766647645756","host":"s3://npm-registry-packages-npm-production"}},"0.1.628":{"name":"ugly-app","version":"0.1.628","_id":"ugly-app@0.1.628","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3e367a92a8106833cd7e0a356a16c4e9649bebcf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.628.tgz","fileCount":2215,"integrity":"sha512-FMFT4mHSU+1HbFtwC5MOCMMlaDNjVB6gxRjOhXZ96k/AU+Dv51axyYKwkcpendVCWbstOnfvcDZ2h2IBCss/zA==","signatures":[{"sig":"MEYCIQDdul5o80w6JHFpHrCBb1XxOeMfiK/2iQhlZavsi2eVVAIhAM8Lo7UlACs/31uyFBHU79pAAANNZTWWm5UQv7NhUtVp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10175681},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fc9cf913420a93c14cbffc2900b093510dabcf2b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.628_1781932227303_0.1648457570960844","host":"s3://npm-registry-packages-npm-production"}},"0.1.629":{"name":"ugly-app","version":"0.1.629","_id":"ugly-app@0.1.629","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b00089a6a8f66ac9116596c8bd5815cf5eee84b5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.629.tgz","fileCount":2215,"integrity":"sha512-hlDUUqqfvWM8gdOncBmnUBFczLEoX7DTl2pOcoeYWurK2C56cWwZgHeJf9smahbOtyvAFRnB2gpXhpIUmAUlqQ==","signatures":[{"sig":"MEYCIQCa4xLIAPm1ozWI68ITAoAd/zCAukAXfN+j7Jy34L98oQIhAJjYsG0NaPAjA6Y5kuhz8LOrItYPB0swZLUMOpg/APaY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10176229},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9e8ccb8b1bf8e660dc99b071865d9ab3c4126c8d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.629_1781932444146_0.6917612727156719","host":"s3://npm-registry-packages-npm-production"}},"0.1.630":{"name":"ugly-app","version":"0.1.630","_id":"ugly-app@0.1.630","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"dd6fd22796110a0721aebced064dc169d72bfe95","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.630.tgz","fileCount":2215,"integrity":"sha512-iOTk3ByopozLQ0OwVUZUM3l2xMw6fLto07PKQHbtSVfVQNRjEg99oYLKCqx27hFHUiwzEnd4iEocHCqlU5BVLw==","signatures":[{"sig":"MEUCIQDCk3LRddmSTH31xgexU4xZp0s1S9S33buqBwHQo4FhOAIgDpEEz5aXT8pGGz1SUkYGLpffpX3pfbtK7UNzN52SWSs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10196841},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"48b90ab9c6485d808e7666e2f3834820120ff9d1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.630_1781982630318_0.4718497223822604","host":"s3://npm-registry-packages-npm-production"}},"0.1.631":{"name":"ugly-app","version":"0.1.631","_id":"ugly-app@0.1.631","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f28d035a11c70870f48b650b7ad5bb2601b9b962","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.631.tgz","fileCount":2215,"integrity":"sha512-/WimAfMBekObhRi2qF3T4vN97rAqbu7Y+Wkn8IHr/DjOrto0B3YpLL+z2OwUtj5CElA7Z4Il/d3yU1UoglPaXg==","signatures":[{"sig":"MEUCIQDWRgdryLdX8kd8ZOck4mFJGdB3RUlm3Qf0pY/BTr9cbgIgOF2ADWscH0iwP41E2LzPJk3gCOu9O/7t2+FBQXsE0CU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10210885},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b3efe07acde00ba5638386c3608e5b9c403d91be","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.631_1781984133704_0.1571103878772826","host":"s3://npm-registry-packages-npm-production"}},"0.1.632":{"name":"ugly-app","version":"0.1.632","_id":"ugly-app@0.1.632","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4ee54f2d05896dea2c3866b9defd1cfa564cea9c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.632.tgz","fileCount":2215,"integrity":"sha512-HqoaT+i9oXJGu/EO6ctD6Rb30pTPj1+8D/lVyEHU3akknu9FAmG3mofIGoVZoUjyh2LULhVJgzATX4cbbgJAow==","signatures":[{"sig":"MEQCICxIC3Q/O1hZAgoQaScX5jfrOTca7dVTSg2ADdJttY/VAiBs/cESEtEVgiBRz2HiFYqI/F5l1uE9BxGvVMNnUsKgUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10221056},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"08b0c73222ed42cc29993e657e4469781f09e51f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.632_1781984507179_0.260923929007727","host":"s3://npm-registry-packages-npm-production"}},"0.1.633":{"name":"ugly-app","version":"0.1.633","_id":"ugly-app@0.1.633","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b5be1badf8aa938f30172b5953013aeba0ea38a1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.633.tgz","fileCount":2215,"integrity":"sha512-SD7R9MYYOfRsPzvgaA9ABbP7OhcjlSAwH0viUTceeQh1GJEgI9O47rdUVxOoCE+zz1rNgWpQUf/jjH4e7BBIlA==","signatures":[{"sig":"MEQCIDSWVnBNlA0Xv2LJmiEKbek8iPIyW6D6fpJ5qkVYSn7yAiAFs1wrJcDeES2On8Hwoe3GnAMxYfxlALZGKWWRltBvYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10230575},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"505490601242b30b3823037552e64c471bcd0cf8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.633_1781987644631_0.4533028585029173","host":"s3://npm-registry-packages-npm-production"}},"0.1.634":{"name":"ugly-app","version":"0.1.634","_id":"ugly-app@0.1.634","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5174102f9b499c9b3080636186bada5c27435429","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.634.tgz","fileCount":2215,"integrity":"sha512-vRH8KzpIyoNDIKceoSI6znV4B2uPuT6D88WQzO/ErVCBCkfyF1MfO35CgxO4vNccv6yKu6aXKEXqAQAsRoPt2A==","signatures":[{"sig":"MEYCIQDNCJ4evd9IaO7AVyrwujYqK2b2gTlvEFr27Xtks/dFNwIhAKxgJDb4xRVkd8v8Xf/FHWhAXtHzkpv4abkXgmE/fNyK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10233831},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"57d723ef1a0d074973bdd931f4391b23baea723f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.634_1781988953024_0.08215538514619714","host":"s3://npm-registry-packages-npm-production"}},"0.1.635":{"name":"ugly-app","version":"0.1.635","_id":"ugly-app@0.1.635","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"391796050a6e9bdae3373b1d2033a0fcf4468434","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.635.tgz","fileCount":2215,"integrity":"sha512-O9fqGuEMgU5W+DTx2xot4zmOu4URKQ5TmNDs770IzTXjkqeBgDtQkpce+iGDkPfAcI1ELd/F/OghcfPWO51tfQ==","signatures":[{"sig":"MEUCIQDlBwJLuIsz9HyzUO4XPCYRtorhR61RmwOdvSDhgN+FwwIgKlvebvUKg0YpG+qqnIf0R/XNT81iLCvfU9vJ0V1I3HM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10235929},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a65ff407c58fafe620ff0acfa606a673f72651e9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.635_1781989690226_0.6190804714508349","host":"s3://npm-registry-packages-npm-production"}},"0.1.636":{"name":"ugly-app","version":"0.1.636","_id":"ugly-app@0.1.636","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9a3fbff21d7aae7a445e61816123372e838a0761","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.636.tgz","fileCount":2282,"integrity":"sha512-QeYemoCzRAp7WJauk1DlYxKxAxIUYXwet4P+uJiueK4LRIZfnG6FOYYg7qRVhA8U3EQ8T2yAtlKrqwANWd2ExA==","signatures":[{"sig":"MEYCIQDnatPWS4KY+1RfJDcuxvy+pNGDvYMOlyTOHIoywG4sowIhAM0txLzDtlzF9lb5xWzr0TZqDcZP5dquMVbr4Cun32p8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10418694},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a9d65027ea8739f67657464894ab56aed9362c9c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.636_1781992969670_0.47791996758435396","host":"s3://npm-registry-packages-npm-production"}},"0.1.637":{"name":"ugly-app","version":"0.1.637","_id":"ugly-app@0.1.637","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3add3d550b9333191f2af04bd96b8c5036a1e726","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.637.tgz","fileCount":2282,"integrity":"sha512-lgQfGxxXpDaIveTS6ltccASNyMiTCEH3qRCEOcZUjon8ob4M4XegqttcQqHVLoEdRpUaGRNN7WX3OINa31ZBLA==","signatures":[{"sig":"MEYCIQDKxUMo/+r7X6SRhCX7MTYa4NokUjsplj+PBk+3loaXhwIhALoYAJRL3FA5fROj4onMxaHz9QCZuxNyQJ0x8lYu7+yn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10418694},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c6fe4a0928ee0a4ab29b85d180d0f9282bd013b1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.637_1781993052658_0.3620767427752436","host":"s3://npm-registry-packages-npm-production"}},"0.1.638":{"name":"ugly-app","version":"0.1.638","_id":"ugly-app@0.1.638","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cd8d54cd893e881046db27361739b368136d9ef8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.638.tgz","fileCount":2282,"integrity":"sha512-KQlmQ9SIzlJTCiTI+p45lf1CThOdUI4KiwNLXfh/UlApwY7O1yCu/fzZA/EYWeRqGizSGxK6EXnXIvoCeu9UXg==","signatures":[{"sig":"MEQCIBb6KoXlbKfIQ0H4xe4ozh0RUbjG5OeNfxoKgxYrT+01AiBCEHtfrJ94/Nh2NTo84u4xuEdC95O5E1T3TdiZEOaYQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10421605},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"651bdf59d10590422f4cf66218bc795398f6e443","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.638_1781993342369_0.12212087260980731","host":"s3://npm-registry-packages-npm-production"}},"0.1.639":{"name":"ugly-app","version":"0.1.639","_id":"ugly-app@0.1.639","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"15e29fcb5b047a37981d842a7a6a09375a97950b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.639.tgz","fileCount":2282,"integrity":"sha512-i8qq3xbAAFLS8TJuw53h+R2SRQhDPyQtqGThzlkmTYQEnKXt65KzSlKcCIRxMI1HHafpLOYUj3Y9HhFq1kb2Lw==","signatures":[{"sig":"MEYCIQDAy/DVWrEbE+Xmt6/RhnLc7OFjygXaaz8tfW4AP9VBtwIhAPAtZCNP0nqd3Lc38wIj+C7dLKasNbJRcb1g/laMa3vg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10423172},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cf95507a87e6754f718b827f52feab36d7ce39d2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.639_1781993478780_0.7725643202444488","host":"s3://npm-registry-packages-npm-production"}},"0.1.640":{"name":"ugly-app","version":"0.1.640","_id":"ugly-app@0.1.640","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"310b31f935b991da9c2f4b52a4b42365ba3d2e76","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.640.tgz","fileCount":2282,"integrity":"sha512-rHnUTzF7dJcVK/ENuJ4b1jDSVne54wTr1UGq3a2sDZIP5t1vXBGvFzOwZ7XIS1x2R7xBpmhjb3n+fHfmDiMprw==","signatures":[{"sig":"MEQCIHn8/fzaq9tPj4VSBvk2LXjvmfuELpL1mCklVBr4OdhWAiAfFrAsLfeNrlcl0FkDbKgzzDbqO4gu9msTdOEbxPkEAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10426125},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1e74b631f216f2284f192db6591a00d21e2e46fb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.640_1781993963230_0.37433774401471465","host":"s3://npm-registry-packages-npm-production"}},"0.1.641":{"name":"ugly-app","version":"0.1.641","_id":"ugly-app@0.1.641","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a00635c6ccfbc82657ebc9298f1cff4c8fb4775f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.641.tgz","fileCount":2288,"integrity":"sha512-JBRyVx5q9k5WEswnvvJxpmz1Zt9LkzCQpqzPyi657qASuehGJJ40Bfpa7nOqSZT83sgxACiIBL3/2Mw+yweeZQ==","signatures":[{"sig":"MEYCIQC2jly/JWkTxmUuNHzj1sc07wvOcXIvP72O4Wif2Obk/wIhAMz4dTgAorkzdiipJ2KmLykW044eW+gT/VYv1m3Ftt59","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10476520},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3e65ca3aa4f44ec6f8e308a7194e2db3028c5100","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.641_1782003589019_0.839320823131319","host":"s3://npm-registry-packages-npm-production"}},"0.1.642":{"name":"ugly-app","version":"0.1.642","_id":"ugly-app@0.1.642","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6726289cf265dba57a6be8eb9ab78ea7016c1de4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.642.tgz","fileCount":2288,"integrity":"sha512-V7VqrvwSVHBEjxwufqzExQ48pTwFmT1Nn4GXxOm+bW87DT9/eiQquEJRbzMHjiajzzraz4nV1Tb85v1yp8g4rg==","signatures":[{"sig":"MEQCIBnfquzQGs17M1HIEEWbgqiWj9nt1/diqnZcoBRPyppRAiBKiPY/5hZbx9QDVLoBH3yiOW8FfcmgqEqm/uyPKWHnFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10479306},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ebd3836694c2f8100342df3deab70542beadec87","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.642_1782005294948_0.6736092917031855","host":"s3://npm-registry-packages-npm-production"}},"0.1.643":{"name":"ugly-app","version":"0.1.643","_id":"ugly-app@0.1.643","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"12ed4e0b3a8fbd00bdb70bb504dff80aa2d501dd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.643.tgz","fileCount":2288,"integrity":"sha512-6bEoatXf+ee8SBHdhsBlXfGKLqxBJAK5/yxx+B5wVB5quqemXZsTN+zKVXAaCRCF6qal2496m6bvVllrF3XvsA==","signatures":[{"sig":"MEQCIAaRLdYAQkXuaAxnBAIdHCHFSfBwt9pUZqINNJ/BmVzwAiADEduhWHRpEPULXaeEV//87/4MUcBLcE6UhKICol6UKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10493446},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"685ea5c7ed348b093cbd38bb9d9c0d68c8b88ff7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.643_1782009935788_0.21571864310501376","host":"s3://npm-registry-packages-npm-production"}},"0.1.644":{"name":"ugly-app","version":"0.1.644","_id":"ugly-app@0.1.644","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6f4663258ac2902fe3fec09e0de526a4dd40e452","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.644.tgz","fileCount":2288,"integrity":"sha512-vEpKFd4QkfycE+rSKpgSs+eBjLeMIwtmGS+MR88xpU0ex7EquQHB/sOHRj09gMH9RSSi/eivpKIStpqTlq51dg==","signatures":[{"sig":"MEUCIQCp3jBkbSWx9Wj6ef1ErHZInhyMyex5ggYOd1V/kGKEsAIgJDyAmLCmO7XKdF+hZkb5fhabYFH3Jxy/Ggu3Y5G1Q9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10493076},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d7093701ba7d6748ef88e8333cfd8e7436dda4f0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.644_1782010780336_0.8901667857123448","host":"s3://npm-registry-packages-npm-production"}},"0.1.645":{"name":"ugly-app","version":"0.1.645","_id":"ugly-app@0.1.645","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1b954d67d79e5a5a1a9a6cdc062d018cc20dfc36","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.645.tgz","fileCount":2288,"integrity":"sha512-juzGqEzg/j153YsxqBoSJziOK950p2y5X38PgXpBGWsE/A2WydX4xRnHMnmamsgVagZc8JpZXxRnArrpw7/OAA==","signatures":[{"sig":"MEQCIFUoeC5pRg3R6pN4xRRqGdxR7CI75kS2ZOWfSYxc/UkDAiBpWf8Wjnwu+Yf4HUiVak6+rRQ1ym6ZywYBjBiTw0vyWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10494084},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"97e0022c5228875f0d76dc233a2eee5f7cbadbb0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.645_1782022905349_0.1826380155125098","host":"s3://npm-registry-packages-npm-production"}},"0.1.646":{"name":"ugly-app","version":"0.1.646","_id":"ugly-app@0.1.646","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"56fb1665e898ff70c3ecc3673fdf8870aa314844","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.646.tgz","fileCount":2288,"integrity":"sha512-7uZyTMHuOpXiXHGc9r09ReUvTFj8D9Zlz1rdGjGSYb0/G+eVqkLfIjK0+JytqLpLXKFRs3/qoEMRvOX/zOym0A==","signatures":[{"sig":"MEQCIGyIVhxaJAMpJQGtsDc1rIXmL8u/GoP+XWFxXoKaHAMQAiARL6hqh6yEmDQD2ksAdlPx1USBS8W2Q+nLa6F46n8TQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10512689},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"86345d131b43ad4a54be6e545ea13180fe395022","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.646_1782058348728_0.1051696360983092","host":"s3://npm-registry-packages-npm-production"}},"0.1.647":{"name":"ugly-app","version":"0.1.647","_id":"ugly-app@0.1.647","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8389581a5baf82ad02fef62b187246ae86f469cd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.647.tgz","fileCount":2293,"integrity":"sha512-j1AU7W4n1VGQMy1GkKzaXd6Z772FJT5OKaPjDOxn+0AEA8K+2ZaShDAsoN/JHvlO5cWInomgEFNP7deyz9g9Lw==","signatures":[{"sig":"MEQCIH+RQRCwod1AorMQH0JJm/Mc/PkbfuDKgBIbCHWWB7eHAiARsKNWyzT7jDbmUkR7dhViqL+QYVnYHqvnytWkmCN/eQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10528530},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e8135bed0ee3362206d874f316da10fa7cc2a3df","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.647_1782061102929_0.6356169057428112","host":"s3://npm-registry-packages-npm-production"}},"0.1.648":{"name":"ugly-app","version":"0.1.648","_id":"ugly-app@0.1.648","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8d211896d094fbd414632dcf10e12fa7854411ee","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.648.tgz","fileCount":2293,"integrity":"sha512-jI6ulc/+DTtUlimmN8BlAn/Fox5Ba4SjawUuLXGA/SefCfhmp9IAlUekLQeso2sKi5iWeWvjXqHLwOL1Jswqxw==","signatures":[{"sig":"MEYCIQDNMsAkaRFexPofVSrwwQNe5Fy0yeuJMwQTbDALq/6n/QIhAN/xr/w9yBudq8yMrdQKWXO2c2/hVIBRw2cZcHY8mf5h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10529238},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"80039707e5723beb38a592e76ff54f64a5342fbb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.648_1782061393780_0.14158380098283163","host":"s3://npm-registry-packages-npm-production"}},"0.1.649":{"name":"ugly-app","version":"0.1.649","_id":"ugly-app@0.1.649","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5923d51b4e5733a54bb3875a18f8d75787fdaf6f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.649.tgz","fileCount":2305,"integrity":"sha512-/KKtd6OKBxdk7zKTAtDqpK/+Ay9EL4WnEclIt0gmZYluQgwUIpjIiwW+FO2XkWJSaq+pTB2lK+qAOybSawRl5w==","signatures":[{"sig":"MEUCICjOfftaOvNFvcmh3wLydwcuAff4m68WDTJEstQtNNZYAiEAvWnIpA3wpr6940l19hrTXUphFhxPkFN+1djEVFTm6UE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10571732},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6ffa758cf7ea5bf180d51a11cff04c9fc2236bbc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.649_1782062186960_0.5120683770344481","host":"s3://npm-registry-packages-npm-production"}},"0.1.650":{"name":"ugly-app","version":"0.1.650","_id":"ugly-app@0.1.650","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b9ebec07ff9116ccfdc74cae2448b32271aa9b25","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.650.tgz","fileCount":2305,"integrity":"sha512-uyj92K4XjLH8Dp1nj0eiOtau2idERKXBxwoym0RblpQT7pssIZAa52SbQjpDPQ2NkItBHkCnPeHe/8JEZrmdmA==","signatures":[{"sig":"MEQCID4ZKz58pZQF9EBlvMjmGKbW1uE/HWhZ6JmuaJubhaPbAiB+zwy/MNMFl7bI9WnWnY+cCeZd3IjvcX1bxS7TlUg4ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10576000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0d640822f9d6552edcd2227989af0a8d21992c58","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.650_1782063027833_0.29246085260632815","host":"s3://npm-registry-packages-npm-production"}},"0.1.651":{"name":"ugly-app","version":"0.1.651","_id":"ugly-app@0.1.651","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c3aaa1c25eac2d03cc27840e5a4429210bb59220","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.651.tgz","fileCount":2305,"integrity":"sha512-pBtfXiPldbkrEvrIRNX0AA7eT54sS0yk5yrumcQDgkpRHM4mU4UKHAxIvZpCtU7Hr/tyUWiMcRev/Aqc7ks/nQ==","signatures":[{"sig":"MEUCIQDuZJc0v9zWxPq8OaQT9f7qkJKnZUQWQDddosbgt+J3UQIgGrPKcDs9RAvpPc9HLKkaghJyEwGBzOiaqbEXEgYsJ94=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10583276},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e88c8a4bc02397c279ad84e2fe2d73f60910705e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.651_1782063369241_0.8376020887712268","host":"s3://npm-registry-packages-npm-production"}},"0.1.652":{"name":"ugly-app","version":"0.1.652","_id":"ugly-app@0.1.652","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"587ca4288b1408aac4fc08c5fdf5169a9ebbb7d5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.652.tgz","fileCount":2342,"integrity":"sha512-vpxSyYQ+ITqPj9NEiTAKhpiMvBbzs8+PlWZ4dcwFqiGq4gCupmbPWEki+K2gkDTrtYXQdJO+TX0flSog9v3uPw==","signatures":[{"sig":"MEYCIQDz6isLwWF8KjehVZUtdth6pdFlOmfcz4kR8L5tvWRwbAIhAIcyb6IemZfj+Ng3sWtIImJ9OSg5zea+j8Zp25nuRuI+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10664020},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"314c3d5046be0a30eb4f7a79ccfebdb74260c373","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.652_1782073069612_0.327112701965504","host":"s3://npm-registry-packages-npm-production"}},"0.1.653":{"name":"ugly-app","version":"0.1.653","_id":"ugly-app@0.1.653","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"954271607fee7c4661108a328360d4b6e55027ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.653.tgz","fileCount":2347,"integrity":"sha512-L8fCYvvODgv62G/RxndLIiNBIpkRwcq39/M1bkm8m273ulkOp1CYDOhi41FnJ8pSu9lZ/EZPjiNTOfK8Y0Db4A==","signatures":[{"sig":"MEYCIQDAogXGIPVpriKv6e5zr35RTlDyHTVgpbxXK73YIt02ZQIhAKmiNDQEC4Z1zzlumU0Rft0cSPBG7H+RzOtbdfKM0kmo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10673424},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"548754c5db1dbf01003787fb01d80c35eddbc484","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.653_1782083505268_0.01406968632530159","host":"s3://npm-registry-packages-npm-production"}},"0.1.654":{"name":"ugly-app","version":"0.1.654","_id":"ugly-app@0.1.654","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"441863d77434f480b0947bc2b75baee4e441d573","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.654.tgz","fileCount":2347,"integrity":"sha512-HfCc6mjLAYrpLjauJF/AwXx97vo8oPJa63NnPU4Wr8eWiuABX9R+gkKMVBm5ug4q0nqVRe6N5BenWEzyo7nRJQ==","signatures":[{"sig":"MEQCICyMaabx1oYfK/vJtSB4hTPef52CHg8/3gVLIqjclSnTAiB1QVhziesCZHMSd1jUMsMj+waS/T41/gICtz7P5dqNOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10677394},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ea84a2c7aa77b7a3bfa9d1d932b808a063655bf8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.654_1782084902363_0.6206815543041315","host":"s3://npm-registry-packages-npm-production"}},"0.1.655":{"name":"ugly-app","version":"0.1.655","_id":"ugly-app@0.1.655","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3a46631b2d4ca205c1ca8a600bbd3c98607293ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.655.tgz","fileCount":2347,"integrity":"sha512-ferUpkvA46M/qxc4vo1Ym/LVnrHjehS2FchysudQId0q64gSFHA9FoXJTUyTGdUtwm8ofT5kllXvks74+8r/cQ==","signatures":[{"sig":"MEUCIQD8rmC+E8z6/BakB6u0Zl4rj95NhjKRm+5Sqzv9LOWAtAIgAXORD56VeAsRB0iK2okEug0GcZQnlMg0UObklPFTGl8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10679616},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fae96ee1145b70c5a19ce4bdd7f95226fe824f38","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.655_1782085208293_0.7284761728091349","host":"s3://npm-registry-packages-npm-production"}},"0.1.656":{"name":"ugly-app","version":"0.1.656","_id":"ugly-app@0.1.656","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7ee703caad5a0ef3196ac91b6fad7e942b45d49c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.656.tgz","fileCount":2347,"integrity":"sha512-Vcj1F5wCkVAliqPp08W4Y/hq7EB4UKA98FUGG/hKV8nDeyw8XRgSR+qge/26rFSXnkkGPFphhLhdk/dnbX8axQ==","signatures":[{"sig":"MEYCIQCHObIkg3WnsatEzESyKYpEt6YMn6vV+8H5P0e83H2uAQIhAL3XlbP9ZArrY2zE5Onnjxucg57ikBElUqjdXuvvpl5r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10681520},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d9a96bcaf54a8a90bacee80223c54e79890ff983","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.656_1782086408463_0.584782245871007","host":"s3://npm-registry-packages-npm-production"}},"0.1.657":{"name":"ugly-app","version":"0.1.657","_id":"ugly-app@0.1.657","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"90ee4530e0435c62615b0715804d8c9951983840","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.657.tgz","fileCount":2342,"integrity":"sha512-MPPpp/Kiijb76Jq+KgDv7uBOiAUJ9qhdFVfYeV8yHebpAXEev4BNTwO4336A1KaP81s4Wi/i/bC+skDnRi+MBw==","signatures":[{"sig":"MEUCIQCiiDA/Oz/Elxy7c0fK4zUUDXISSca+brWCTbdMwhC+vQIgeclAI8MMR+X27rKUVfu5XWrp1JqJOzNp7vua35dhvZU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10669188},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9ab1c74b619e5600fef54aed296f76ae9db5fc5e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.657_1782087505154_0.4724188704359493","host":"s3://npm-registry-packages-npm-production"}},"0.1.658":{"name":"ugly-app","version":"0.1.658","_id":"ugly-app@0.1.658","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5bd985f33993a027d63399594d7dbb749dc67356","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.658.tgz","fileCount":2342,"integrity":"sha512-+4HiBYeQIIyEbxE9GeDCUpqaS3rd7jPJXDj8gqtw5r6ncpROtH8CMMDRz9uck/ZbJgAjN5oUxc/iUf50GFexOw==","signatures":[{"sig":"MEYCIQDkPwqg2P20UtQFd+A2YSvFdRbaAmUEAo81S2IdzAs8+wIhAMNN+zzxkYcOAAnKPdl33Pq+YYUZgs5+gUX3P8lqhybd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10670564},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"83f58b7386df643553ace3161245431415cebbc4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.658_1782091833335_0.6512208905096495","host":"s3://npm-registry-packages-npm-production"}},"0.1.659":{"name":"ugly-app","version":"0.1.659","_id":"ugly-app@0.1.659","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6ec354703180cc5aebbc56712d051f2861c15d72","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.659.tgz","fileCount":2352,"integrity":"sha512-DQrOSRhn06utickSRu1UV+28t2rsrRdpG37LiGHtKVcbdJaxCmxLO2CJqE4dP9KG+YNrRs7LW1cJ93kMTUWDhQ==","signatures":[{"sig":"MEUCIQC6JCBppodhFrPGFiGDZ8qVvip8melB08QUxTogZaXlvQIgaQ/7E/vm/hJByy0T+GjdX/HQ8fjOa0XisVtVvNrX2Bw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10732141},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5c7ec7611832a699140422682abe1641073fb86d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.659_1782095017982_0.6939726098437673","host":"s3://npm-registry-packages-npm-production"}},"0.1.660":{"name":"ugly-app","version":"0.1.660","_id":"ugly-app@0.1.660","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6828b918fbd4cc8c320f2d7ae4795349be8b2bb3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.660.tgz","fileCount":2352,"integrity":"sha512-LH6oURpnzJ1D0qP9fCOcvNickP4Au0VQV7Gs6Xg0fQPsBXZ5TaEhpzA1XE0KGCnQqLuytVUcp6N28XTtqOgFBw==","signatures":[{"sig":"MEYCIQCE4ssI6GW006nY0pNB6+ctuYi0LGxZ8f6IJ2NNmM2GeQIhAM349zSWF171+1k0RWdpW8XEoKixgEwCvzWgDS762+Ju","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10732141},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ad6accf1c8fec8d04b8c619bc7791dfa2580684a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.660_1782095288779_0.9821095250275615","host":"s3://npm-registry-packages-npm-production"}},"0.1.661":{"name":"ugly-app","version":"0.1.661","_id":"ugly-app@0.1.661","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"984886d1763a6d36b3c5598be2cb65f15b103127","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.661.tgz","fileCount":2352,"integrity":"sha512-mAtyB6IBpU0bJuY7foNi5x1d8qpghjucKutsMxeDCr0av3naKoXPtAUd+fNyhmDbD3LMiWV4kwmz/AJtsjdqfQ==","signatures":[{"sig":"MEUCIF9jbXGteAv/9JuZY6TqMqFlgDELR+jwF7MfH5TKdPW+AiEAoYXBm/G5R3AN51XRFX+h4UPRu4Pf9QgvhF8OIK5qu0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10736478},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c19815de62597b14860ce4d00b676a6039c83830","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.661_1782095445305_0.8088688401804887","host":"s3://npm-registry-packages-npm-production"}},"0.1.662":{"name":"ugly-app","version":"0.1.662","_id":"ugly-app@0.1.662","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b707300132b02963a40f196ea8ec31bb462b9c35","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.662.tgz","fileCount":2352,"integrity":"sha512-D5IeXYyASNA0uou+TpTGRKM22K2t1D34ktGOb64K8u6RQlj1wj5YpuBsOPNagIRw1QgYSOYfrAUU0+cnC22FpQ==","signatures":[{"sig":"MEYCIQDDEFXkyron3UXSZWsgjaO16v4qDK5+Xg5DHVU2VRaxiwIhAJm3twXR9D6HwxdsuZebNJFr4lx8V1PYJTB069/JNPRd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10737716},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"59adc377bbe37e294aa7ed3819662153b49abe00","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.662_1782096058360_0.08841361497012556","host":"s3://npm-registry-packages-npm-production"}},"0.1.663":{"name":"ugly-app","version":"0.1.663","_id":"ugly-app@0.1.663","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a7fb48d5e2fa7d74d9951edcb04d414283f29b29","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.663.tgz","fileCount":2352,"integrity":"sha512-lTY61bt/rkDA2YyYoGHX12ptn02y3/fVRXEhpGjg5X/kNi+Dq8CcQK+5oE5vBW9ux4eLUjLZwJDG1iMc0vuhuw==","signatures":[{"sig":"MEYCIQCxAZXe3eHdtRLVu52/b9Od874mGzwmQtsdxuM0WyeScgIhAIv9WL5X4Xhp4+DJ9BvoIaVb//7gH0oEK6Xa4cKl2rEW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10738553},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f0a2858e8f5b0bc925fe4af1dbb2c92ca88a122c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.663_1782097178326_0.24157795472472743","host":"s3://npm-registry-packages-npm-production"}},"0.1.664":{"name":"ugly-app","version":"0.1.664","_id":"ugly-app@0.1.664","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"89aabc727f6c86b919a9a25f30d87cbf1b2bd8e4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.664.tgz","fileCount":2352,"integrity":"sha512-vcivNf+naoktdxKS1VrtTogOdq3XZgJmHUuzJNrKdUIhnnjonkwlaYG4i+r2RYLgU49khE39HHm1g6J55aZv2A==","signatures":[{"sig":"MEUCIF8ANuNir93zKYfRdCgTMzjC90FP3TP+Z6+/ws2pslFTAiEAzOorr/ULp/2oVxk3KpyW16eXIMwzFKHmMe3diId2HlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10744024},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9b805e595be009ced525cf48ec4b8ad2f08c33d1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.664_1782098213357_0.3868031613054146","host":"s3://npm-registry-packages-npm-production"}},"0.1.665":{"name":"ugly-app","version":"0.1.665","_id":"ugly-app@0.1.665","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8abe41b55ef80bcc12655328540fd0ce056624f5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.665.tgz","fileCount":2352,"integrity":"sha512-/Tr6MhZZbjGGZcaT6V9Yir7SzFyweHLq/DmT/tNSX9b2hC2bPdAx9QTWigVkn9++J/Al/eDrpxE/ywzyStKXJw==","signatures":[{"sig":"MEYCIQDeDGdPKQU4de7KHAQUC/A/hTEE2GBCoW8WPVMW6gXycQIhAJsxPsJhXpr82OWA6zCY0uKiZudPyWWY/zSz9HIvXSJI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10746547},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f230ab274840ff997084096091a4a7f94964daf4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.665_1782099149114_0.272070594450462","host":"s3://npm-registry-packages-npm-production"}},"0.1.666":{"name":"ugly-app","version":"0.1.666","_id":"ugly-app@0.1.666","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6bd7a98f1e95bb89a285222fe9c0fa8904e84fd4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.666.tgz","fileCount":2352,"integrity":"sha512-OS9LgqhkbtBWIGDR6xcfq+KTyAwrmZQY3b6Ovo5mHvb0VhIa9vTRctyTRXpmkUo6RAJb8ilxJGnXwUKEGyCDqA==","signatures":[{"sig":"MEYCIQDH9aT9c8Bvoqsin3uc8iQKYhO0Pc7CngeagJ2f/3BOgQIhANO8KShjkdIKl7OcJVpu44uNYAKYlqIb6lPTIBpC+Vas","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10759067},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7e064339d180eef6456ffcfe64e4d4e605068bc6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.666_1782100784585_0.12423409704134802","host":"s3://npm-registry-packages-npm-production"}},"0.1.667":{"name":"ugly-app","version":"0.1.667","_id":"ugly-app@0.1.667","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1f16f178fb994978adaa460b5ed1092a46c940b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.667.tgz","fileCount":2362,"integrity":"sha512-9x/OpEeYTpZ7JXVzdldosWpKyjyyfuFtnKZZ31H1JaE8TQLTtKbmDpAQGAqhaOUxfrg2WDUqN2jgBVadbl4xmw==","signatures":[{"sig":"MEQCIAtdIGMp1cDnuGmGyvqZ0Kp2enK2rRplvUOXFeswvKXeAiALi5HXxBnwwL7uJ7xLQr6T4KI09Oi6oh9PCrGi8JsNEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10799287},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b189d1cba1ddee4c715f9267b957945168351106","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.667_1782104520318_0.45265780225208996","host":"s3://npm-registry-packages-npm-production"}},"0.1.668":{"name":"ugly-app","version":"0.1.668","_id":"ugly-app@0.1.668","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1fa2fc5f9ce24b95dbf9fa571b85731b0d56722e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.668.tgz","fileCount":2367,"integrity":"sha512-pOL1/fnS+HRYKguayWdQYSBOBMylGjjrGc4mBLDW9pI9CxFW85W1k09M2wEALUGiagODex8Z6AKeMxW/uzqm+Q==","signatures":[{"sig":"MEQCIHT49igy/QaPWZvznkM5Vipgj7EUoPPAf6KF++rW50IoAiBxumFqyq/gXD3caHSfZqZbAg9ngAMo/h26XSlt0GV0dw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10811414},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8fd023e28d0fe3ae182848bf7108b339807d59d0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.668_1782105651711_0.47797501371326034","host":"s3://npm-registry-packages-npm-production"}},"0.1.669":{"name":"ugly-app","version":"0.1.669","_id":"ugly-app@0.1.669","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a6e5591ec0c0c5b9bfab65416434c16453a5e0bf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.669.tgz","fileCount":2367,"integrity":"sha512-C5/eT0BA1sUDDk4OKpey2QrsuKm8FtQgYhAnWOG3Ub4bgNTF561thjRVD/++dxebJKPlbDvkVgbvFX9g7ynHCw==","signatures":[{"sig":"MEUCICG8m6MPtShwNuGkXPlCYmZ0nErfw7oliJCRRgsmquU6AiEA/eyC2UK80Y5xhkCpKWgZfFNUP+nAOC1g7fLzY0iUYm8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10812314},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a8e7c2c44cf08916ee4c39715d0b314058899de5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.669_1782106047705_0.4343840707138451","host":"s3://npm-registry-packages-npm-production"}},"0.1.670":{"name":"ugly-app","version":"0.1.670","_id":"ugly-app@0.1.670","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a30a76d90b93ef072dea44670941f6dc08bd1985","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.670.tgz","fileCount":2367,"integrity":"sha512-ceuadndWC3atbNFRGcYL+IUPMAieuAEIi953U7iDb8LESlK0B+X5lPT8VMv3j1p/gPlnQ2ncIPzHtInqLsZ35Q==","signatures":[{"sig":"MEUCICHIF63lDYti4PQ9pc/qU6/PI8130gP/ozcfxDL6MeocAiEAxDx/UNIKXN5wr1MLw3aQWMjAyHKrq+YquCZUuJrRrRU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10813116},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"247d385b4d2b09ee88eea23174b97bc317cde7cf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.670_1782106829337_0.2509908086079058","host":"s3://npm-registry-packages-npm-production"}},"0.1.671":{"name":"ugly-app","version":"0.1.671","_id":"ugly-app@0.1.671","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e4612369ac4ea1300e67410ce153faccc9a0d4c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.671.tgz","fileCount":2372,"integrity":"sha512-ADqmoWCYoO9oT7aARwjQ2S2vcNJfy8PpbUKEMJznzAqx6RmUYkhKDUdOXgj+RQfHoAAEhWWW2fHQZRqSaqp9Ng==","signatures":[{"sig":"MEUCIH0ZY9J8qUpxAMEDS7YZX7nctB4Rt0tGxHLp9bDUVKxVAiEAnhL9i7CsF62EUwKsBRjup6SRsuUxdKm7krencF/C/xc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10821509},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"808f75e390bd542f1e9c8e7baedf43e768154b1d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.671_1782108229508_0.007629801954050608","host":"s3://npm-registry-packages-npm-production"}},"0.1.672":{"name":"ugly-app","version":"0.1.672","_id":"ugly-app@0.1.672","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0a18d7266d7c4d54690ad6aa20c89f1a5a13e4db","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.672.tgz","fileCount":2372,"integrity":"sha512-+he1R4Dh01Hn3zB0/BXoD6RbRnX4Yl5bPtIvvwQiNTId432+hj6PsAIapkQ/75MfXZYmwAc/k6c1ojlUlUuTDA==","signatures":[{"sig":"MEUCIQD2lOgdZDH54kM0xX8Gu+vB6gDj9QlsQ1KlbmrhJ96ogQIgXMmdztOv6ydN/i+5ow+J1b3ArDxuQJYbHaSzib2Vwnk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10819851},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"83fa8a9e25dd49843d900b18c0eea9e269d2d16f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.672_1782108569141_0.9637443830881971","host":"s3://npm-registry-packages-npm-production"}},"0.1.673":{"name":"ugly-app","version":"0.1.673","_id":"ugly-app@0.1.673","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e2a527e149cbddf28eaf7f34fd48e9e46902c4ce","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.673.tgz","fileCount":2377,"integrity":"sha512-UuhZgsJtYUnkjvvFxvwDYFXrZpKc+dDWDOaug+WGya7jBcYyiNQvRIiENLjIjCWCFVapZ3LSEkMdXyX8dPcApQ==","signatures":[{"sig":"MEQCIGznof4Lpk0eiCzQ/UtBpWnj7pNGCL/kzYuGzyukrvYwAiB2Oz3AZblUE9B7b7RbpJgLgQ+xIxt2ChAGUw+/gVjPQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10829024},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"85f0ac31febcb5efecbf9c0e140b9bae5c096223","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.673_1782141832571_0.6739897874572749","host":"s3://npm-registry-packages-npm-production"}},"0.1.674":{"name":"ugly-app","version":"0.1.674","_id":"ugly-app@0.1.674","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d8ee3c114c9fbe97d091153ba64489600f40c9e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.674.tgz","fileCount":2377,"integrity":"sha512-sVSpZdmv1XXMsQLR1uLoFPaJBD67C1MD+L0fL6WaJSRRuiQ7ZL08UUOzrHWfdfvjxljbz6svwklYNQ2Xd2/YEw==","signatures":[{"sig":"MEUCIQDYv6sVRJQ7hygIjUPHqFWHEy2cWp1KmjeyW0sIWQHL5QIgGaOsjr5bW8hPgn90TUDgvSHe+PN30DAJFxVKIFVYVIQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10829560},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6edeac572a683d47e628054b6c7244e8d2777849","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.674_1782143019425_0.10676150858090083","host":"s3://npm-registry-packages-npm-production"}},"0.1.675":{"name":"ugly-app","version":"0.1.675","_id":"ugly-app@0.1.675","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ac78b333a5941f0cdabfb3c29d831adade7d3fc5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.675.tgz","fileCount":2377,"integrity":"sha512-csXA5YhbyJ6oKhTEX3N9BbYQF8gNbSzK4M3rOE2U4n0hzaTTjmwSKfs4aoA5PQ0dmS4IAtd3KFiu5cDlzZiePQ==","signatures":[{"sig":"MEYCIQDro1L43WhwsMD25Ad0OUOnw6Ssk0RtDN8/78oC3Ni08QIhAJGUd4MlMiVSlQLSHIxyR1oWVMw2pnL+9gNqbUVAsVMJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10846389},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"70b9a56278e0c441d5cc95f9a60a5e802d35254e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.675_1782171361065_0.30216602292074857","host":"s3://npm-registry-packages-npm-production"}},"0.1.676":{"name":"ugly-app","version":"0.1.676","_id":"ugly-app@0.1.676","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"330245dc197f356814e5fb177b8fa9502f609159","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.676.tgz","fileCount":2377,"integrity":"sha512-Sc+h7Xp6QRsz/qClhFN/3sy/cS0YU0MA8vBbrdvi+OUdjMopWEk+KgsuNlu0NcW+t45kaPJux3ou/+9nIMdQVw==","signatures":[{"sig":"MEUCID/lbuArR879P8jB8ijE/5yLtOLqFTvdVPvrnf1D2H+gAiEAmTtnpgcMPp0DhUl5ijPeOWVFks12QP3cGGxmKgzGYQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10847997},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e78b26f15a6b5d5d5db730ff9b571050087c85f2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.676_1782171641588_0.17050897820408029","host":"s3://npm-registry-packages-npm-production"}},"0.1.677":{"name":"ugly-app","version":"0.1.677","_id":"ugly-app@0.1.677","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"25b0643c70c16edd49726f7315ceb2c164541783","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.677.tgz","fileCount":2395,"integrity":"sha512-yFM9OBtW1mua6q7hmDS7nI+f0GYq+BBv7KJocgw/wmHdmocrK0FT1//zZBwtslxed3bkPpLSXrXwmkf+A+qWlA==","signatures":[{"sig":"MEYCIQCZ4wnrqQL63nG0GDt9/iplzMsuGy6JIil9Tf0/1MgQDAIhAPw0uxYKgfaix9sYSA81KWHrfZfGlsG077As/feXjYcw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10899078},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"aa014f5e10520c12855e4fab2f192d07890c2ffc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.677_1782173309313_0.6307465815541358","host":"s3://npm-registry-packages-npm-production"}},"0.1.678":{"name":"ugly-app","version":"0.1.678","_id":"ugly-app@0.1.678","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eac26f321dffe11d846fcda295d21e402ef6cc09","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.678.tgz","fileCount":2395,"integrity":"sha512-luHYcW9OWLQhJxXRSpV046hnAEwQQmSQmZJzpjnfLo1bZr0MwWt453b0/bfSYQfb+aqtSAXm9bL06/3iP7KZWw==","signatures":[{"sig":"MEUCIQC+7U5pd6n126M+AMWz2UmsnD87nBZCCAv3Uh8J8NZaHAIgT2nzQcvQhOgOph9LDEcDocC7AzJkXWLhMUCnTGtp/hU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10900942},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"735da3d16636efc61c55a3cd0b764e9fd70be0a2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.678_1782173720022_0.48631141012766643","host":"s3://npm-registry-packages-npm-production"}},"0.1.679":{"name":"ugly-app","version":"0.1.679","_id":"ugly-app@0.1.679","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"80e87e7be2437d220b8e7a1125d8c457dd59195c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.679.tgz","fileCount":2395,"integrity":"sha512-C2p40ueP4/g7N7v9cIi2ho+KMYNAZ193NB4/hXinLevHqE7MpB1jGSGTzyHviJdNJn7n3uAYHaLMGT5e/sKP1g==","signatures":[{"sig":"MEQCIHXpkutWqzqjtUcAP/Uw/7lWuQ/rzciZiqt8PdIwINoSAiAfwdHKl7US1KjYymbGUgbgpDWM5rnPr6wI+kI5LjiCFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10905236},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"455b7567c5260fe11a997207248339e043c789dc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.679_1782173842664_0.016886809811607284","host":"s3://npm-registry-packages-npm-production"}},"0.1.680":{"name":"ugly-app","version":"0.1.680","_id":"ugly-app@0.1.680","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ba2c3b674e333277dcd8e2f67cf45de3e3861adf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.680.tgz","fileCount":2395,"integrity":"sha512-EtrbyIisZoBXq1V1vzTbJ/mB+B/kwDw2dGeorHiTeKcJJLiTmouwayfP76+lw5cAiiG2Q45r6JXxNFlLW1AFag==","signatures":[{"sig":"MEUCIBjIwcG5IBhel/eV2hfYnNQUtD7p6Fo88CGgl+9/Nm08AiEA8jq+JZs7QNcffD/tKaegf8fJtnk5xLHqPD1+y12zmUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10909807},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"452ef800bb626b9f94c31f7cb53e1c44e5850384","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.680_1782177107045_0.8000615392130934","host":"s3://npm-registry-packages-npm-production"}},"0.1.681":{"name":"ugly-app","version":"0.1.681","_id":"ugly-app@0.1.681","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cb4cbf89789237c26636a6863776eea81d0f4ae3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.681.tgz","fileCount":2395,"integrity":"sha512-zT1bWcPEsafIblzOt5n8Dgo+PS3rGHHSlLBlBur/7y1qPC9tctmVNSz9++vjRuHilanKS8Z0lXoQy5XCydpLQA==","signatures":[{"sig":"MEQCIEBuzjWxcIPIsm5nHRfqDaXQ56MrhBKkjsw7ayH2ZYMQAiATe+5er3oGu3SFYkFhtlsRQyxWZnWpL7CFBqzv+kSaLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10913992},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d187269f632474f2eb8c9dd5c09b57d7c6e6e389","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.681_1782177320117_0.9090303105789397","host":"s3://npm-registry-packages-npm-production"}},"0.1.682":{"name":"ugly-app","version":"0.1.682","_id":"ugly-app@0.1.682","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"88153cd1fcb7723fdd80be73413e0645e4cec763","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.682.tgz","fileCount":2395,"integrity":"sha512-knrX8E+3U4OxO9TTvIPgeVXz+ZeYdKLQrguSZ2pnBZ7OwWyGaLymBzIqE4TSNs3e+yYNssxo9mvUSIAswP2DBQ==","signatures":[{"sig":"MEYCIQCtDrTtbQZ20nsMB4CrhbreJSEk58CBiJCURFLCiEfKewIhAOaPP/H08AZlAg0JTQEtu/VYdSNUAUHkFCQ+UkUXt/Pb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10915686},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e1b656b04d889cdcd0f35bafff8f84992655ec6b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.682_1782181136211_0.6750201866020611","host":"s3://npm-registry-packages-npm-production"}},"0.1.683":{"name":"ugly-app","version":"0.1.683","_id":"ugly-app@0.1.683","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a901e5a8ee4e19f3d149e51fbe32f80bc10e85e1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.683.tgz","fileCount":2396,"integrity":"sha512-/SK854uIpFOFWZL1OpaPkhpxj0NqCcf2IJl59sgsIjmlu+rYQl+MymNlIrP4C/DK6+yT2b/6owJAzFv+YKSAcw==","signatures":[{"sig":"MEQCICe7W49vIuWOfG/gINQUp+QLMGnTegXtZH8fjwGFfQeIAiB9Bws6mJyhEID8s2gFebPfkM1BfaY7iiF2kXmuas7sFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10928503},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6517da33ea79b83b4c77b22b0d86f638ccf717de","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.683_1782181940210_0.1959118434475957","host":"s3://npm-registry-packages-npm-production"}},"0.1.684":{"name":"ugly-app","version":"0.1.684","_id":"ugly-app@0.1.684","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b18bd52806dc0b15d3352d5f6337692f968e5177","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.684.tgz","fileCount":2396,"integrity":"sha512-vSuqCsWT6GKi+HKNI94y3K6Sb0hcVbIatZRKvzky4TQjdusdh36X4ZXA2nFtkIrRwe6zIjTAC1PS3sl7iqHtuw==","signatures":[{"sig":"MEUCIQD9Qruz9XcbUDnHyq5mHLjUpRhRmp24v8ctK77Kj4rUqwIgEA6wfQjOK7FD7G9X91fbovt2ef0CbnCAzvfyXgKHPd0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10932004},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7d1f6475b30d0b2f63da9ae823915cff23488b9d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.684_1782182032071_0.3844291745642541","host":"s3://npm-registry-packages-npm-production"}},"0.1.685":{"name":"ugly-app","version":"0.1.685","_id":"ugly-app@0.1.685","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"64862f7f94ac0442d8eb8622da97caef19d3c244","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.685.tgz","fileCount":2396,"integrity":"sha512-Z6Of2NY43XvGW2GosyHuPzHwm1WK1IfP5k9YUuiS4TmINePIpgaMeEXtbpc2p3gbBgoSGDTDobNyYzxJx/kSfA==","signatures":[{"sig":"MEQCIECxaGZiJoIMup3+EScLvbuhOP3obYHelCTmDAz9vHIjAiBdstkNwCbc5zHb8zterYsvl5ZrYzqzZHssMrzPUwsGVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10932960},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5be1ab74b5ac62a609781c97359ddaa7a64bce39","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.685_1782182417267_0.2145157424731401","host":"s3://npm-registry-packages-npm-production"}},"0.1.686":{"name":"ugly-app","version":"0.1.686","_id":"ugly-app@0.1.686","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4e8301345e9e9b0ebb28577b32eae13621d46a4f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.686.tgz","fileCount":2396,"integrity":"sha512-5fFY88dpass/OxYA2rmF2SVRIkz9V7uU696UUwdio+iAVDVidTJPCmI1Fxs5BJYiDgnAyOVwS2r1RJ8jINtahg==","signatures":[{"sig":"MEYCIQCWIvVpm2Ed1SjeEC0fmNVF/7qJJReqG8T5pAFWMd+2vQIhAOi0Qa6zCmf6cxTvpv/wEv/xxoHvOJQQAYG9G+3Tf70H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10936740},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"919067388ccc6f8d43c07b478a8f17e99b1ade1a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.686_1782183409246_0.6699229293846574","host":"s3://npm-registry-packages-npm-production"}},"0.1.687":{"name":"ugly-app","version":"0.1.687","_id":"ugly-app@0.1.687","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"679067d19b8c8277dcfb73be5ed77230f82bf434","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.687.tgz","fileCount":2396,"integrity":"sha512-20Q+z4qqY5s4yHsSBGk4uax53cp0Z5I/3MP1aBQ2s51A8OIfqcUn3qQ4T5tYEI3+JY7WDI2Nprjn+ZRI648ciA==","signatures":[{"sig":"MEUCIQC8rK9sFghb378xhUGtBS2VWBuI+n+T6OfcLrGagWmX5gIgfq5pLXiLor7bf+FlH2vREM6repgCU0U9BQs29rFYX+o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10938043},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"74f3fca5944b03c7d3d6239c4b199241a6535934","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.687_1782185890287_0.08823708933301888","host":"s3://npm-registry-packages-npm-production"}},"0.1.688":{"name":"ugly-app","version":"0.1.688","_id":"ugly-app@0.1.688","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b19e73aaca3736bc76561902088f64c5c722eed1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.688.tgz","fileCount":2396,"integrity":"sha512-NWhm8xhvb3h0MOJhWA30fLqT9CcPylrezO3Q4X6YfmZekHeanYJlFRUPfnHaGLBla6WIOoAT7mV8QLhc9NsoGA==","signatures":[{"sig":"MEYCIQD09VO/o4+XhqWtw7+IkyzPgxHN4sMi/dG4A/G0hkWwRQIhAPFIk/tm3ap6NhKyGioJquRwnKl610LAmyvjy7evDPks","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10940146},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a428624e7ed2242ba331c1c56842b150e17a12b2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.688_1782187098973_0.3999978665378907","host":"s3://npm-registry-packages-npm-production"}},"0.1.689":{"name":"ugly-app","version":"0.1.689","_id":"ugly-app@0.1.689","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fede3adc89de8edb4301d72f478a8da16969b046","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.689.tgz","fileCount":2396,"integrity":"sha512-NZchI3oI6Zuc0F21RWB5KRTr5mHqyVIia24peVmgmvJtfdrRoIYPCbXS9FjyuYdGDMGCgliegC/7f1G86E134A==","signatures":[{"sig":"MEYCIQCIlO6s6cWrIJcde7xJHzOXBA51k9gZZez+QqTRHCZBywIhAJVjXSkMYpjoZZfZoYyB4N/TQ3XFi4WXkWB5Cfd6sDIh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10940669},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"055617c350babb7ce276d783fe2f40a46f6de146","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.689_1782187317355_0.5988109982456085","host":"s3://npm-registry-packages-npm-production"}},"0.1.690":{"name":"ugly-app","version":"0.1.690","_id":"ugly-app@0.1.690","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d0c31a82dfce4cb9c53080e3c9f712a7ba705b0f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.690.tgz","fileCount":2397,"integrity":"sha512-JXqLhhESaBNmFbIFK/iFCUSW4DO70+LfAx4eY0J9bJWi33/J98MoUuRBnbtCSPMG2R6sU1ltYQSOmqYaeeLJbw==","signatures":[{"sig":"MEUCIQDyAxa3qNBVHh+LvuCy93FZYrN0plKgeOqVcrCfJUQ6DgIgakDAeVK6PQ45tcRKLQG5DYfL7lCHvgPVLvxFf6i/+cY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10956477},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d258e3a77dd589bd5cf324e29875f011fd532bac","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.690_1782188912209_0.33129925791874704","host":"s3://npm-registry-packages-npm-production"}},"0.1.691":{"name":"ugly-app","version":"0.1.691","_id":"ugly-app@0.1.691","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c0b03b55dd5db714654b13ed740f71c63b46ba1b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.691.tgz","fileCount":2409,"integrity":"sha512-e8Tg3xaimI15qv3tKYh60SsxfzEdBNPpXuc/VQjmxpI2/MKoCMfuB8I2F8GgFi/ZizqqHXbQ5qXN1gjooPuuAQ==","signatures":[{"sig":"MEYCIQCG5XuFV4dbg8kq6qHNtsD/iGx4x1j7LxUhXPtu8OgUswIhAL2gFujq7iAoCPk18G5Kf3zVQfmA0zKZAgv12NnGwm3G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10984532},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8f2e19e88019c0c487901641d31d3ff5805c9c99","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.691_1782190089064_0.07725519305646089","host":"s3://npm-registry-packages-npm-production"}},"0.1.692":{"name":"ugly-app","version":"0.1.692","_id":"ugly-app@0.1.692","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c9e9c25b233d1a6e9a04e97b73e93c02f9fa7616","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.692.tgz","fileCount":2409,"integrity":"sha512-fjxkjvcU/Kx+E6Quo+edObaVb5DsFLmm8RsC59TVnWGWkgA4gwMv4Ww3Z/JFH5KkptBhkbpk+Nf3ZPQwzEAilg==","signatures":[{"sig":"MEYCIQD4cxKCJryZaj0UM0QJJnFEDBmbiO+0u62RiyfHo7FvlwIhANFCILeJ5CpJYl+gbg8FylXubUDtF57+osbtfk/iEp+O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10991968},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6488bcd8d16665694940908f68261379577a63b7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.692_1782190387939_0.3445555778610139","host":"s3://npm-registry-packages-npm-production"}},"0.1.693":{"name":"ugly-app","version":"0.1.693","_id":"ugly-app@0.1.693","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"43f73aab91bc62b3e5dd6ff9b0fd6cf8fe600e13","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.693.tgz","fileCount":2415,"integrity":"sha512-aMC4/qc2QkLfsqDMmghGogpxR6YkLp6zQCtfdc3mR8c/qpHo+O6k1m33qrx7pJ7A0gTHMqPPE8JmXYl0bv0OkQ==","signatures":[{"sig":"MEUCIAzSwjLWmEc+JFkF9LeJ3muNJKuG6OgsAKOzDFYGXH33AiEAy77/58BhW1RAcstV6htA3dyMDVOeN9aLcZjAfCz2Er8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11013048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"baaf923fc43fc69c54707a9529d3ab99f7b50cd8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.693_1782192099701_0.5015080450000631","host":"s3://npm-registry-packages-npm-production"}},"0.1.694":{"name":"ugly-app","version":"0.1.694","_id":"ugly-app@0.1.694","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"505288296f2dd933bb871067b5b597c749301a3a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.694.tgz","fileCount":2421,"integrity":"sha512-B4MUgIZZc3qpBuCul2rjE29Ok6GGNOvqom8jGTU7yhMKyM4csgN6BeyoGkKiBZRCtXpMgSD3SJG5+dhg/SP2YQ==","signatures":[{"sig":"MEUCIQDZ2DXZZ5KEq/orq29Nnv/n/qEc0bPFC8SFzSSCnptnlwIgXwAQvkXpEgpW7zQhUWh1os8B0fZeqaWXlaf+R42O5WA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11035559},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d0b468dafd35eefb51d7b5cf8b872b5faee0f47e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.694_1782193545741_0.8055222582659722","host":"s3://npm-registry-packages-npm-production"}},"0.1.695":{"name":"ugly-app","version":"0.1.695","_id":"ugly-app@0.1.695","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4b6a15e1d757412c59408f481fe945a24e560a04","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.695.tgz","fileCount":2421,"integrity":"sha512-cVU53WSKXjzwFvLxil+cpbBQ4ilxPoZuimY/1cFTzQiOxiDt1iNk8NakYafJ+mFYM0w5yjpSSKw3xFZu5Iypvg==","signatures":[{"sig":"MEUCIC31WCIcW+n4VcNRlQYY8hiINIy/+iRO3v7XVT+7P9pVAiEAwab6IGS8329EbJuEhDrKhPLvml2U1PTBRhIX4P2UJ2w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11036346},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ef86a38a55a7cef907ca32fbb9a3fe3ebb8e856a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.695_1782197550365_0.17117378555502993","host":"s3://npm-registry-packages-npm-production"}},"0.1.696":{"name":"ugly-app","version":"0.1.696","_id":"ugly-app@0.1.696","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1bb8d726488b2edd1677f04a90c276b2f46bd04","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.696.tgz","fileCount":2421,"integrity":"sha512-8Byv/MqdU31HvIg+m5Cx4tLhRpi73dhLO09NKJlL0L12YYtlqXa03jeZv1weys6yv7gqOzcljQlWYnM6rajoWw==","signatures":[{"sig":"MEUCIBPbHzaRGqw0QawZ8zHiuyKJOzuOledMdCSXor68cYDaAiEAmfmoupCY4flBzCaL8QEHU5P+b65ZaNMGbpjn52seR10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11042295},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2c96e8dcd7c81b0f9c67425f34bd11ed75694296","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.696_1782259687802_0.5289927075464251","host":"s3://npm-registry-packages-npm-production"}},"0.1.697":{"name":"ugly-app","version":"0.1.697","_id":"ugly-app@0.1.697","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"02db776529c26aed43aa0c259b0c268bba32e02e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.697.tgz","fileCount":2421,"integrity":"sha512-6Xny6muNALxS7CIwElM/7+F9uACFXuSHfixgxqaNcg5stYTGiMXRc/nOdnvZMEfuBCmuGLHAbQ2nHj6qWCzUxQ==","signatures":[{"sig":"MEUCIQDESian3llHTckMJn4P0dpvSbXDveuu6HsXb+qdcj3GMgIgV9ei0VFkGDW9a8/PFewzKaCKSO9zRFBWJnss/glQA5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11042683},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6c732847844dd4c91b62a102a822d540c0b7c254","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.697_1782260037489_0.5236135758066489","host":"s3://npm-registry-packages-npm-production"}},"0.1.698":{"name":"ugly-app","version":"0.1.698","_id":"ugly-app@0.1.698","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ea1ab85e0af502364a39c1fae129539fa06c4373","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.698.tgz","fileCount":2421,"integrity":"sha512-abduhwkX1oWaWdE31jHb6gj4l6riFGk6oazu4UQy1bIp+EtSr1T711Wqq1aS0RYE2iN7t7JL2kB83d0akyXcvA==","signatures":[{"sig":"MEUCICtKVXO6R9NOHPHh5JliGIkWUZ6cLg9+YzU4h/XHiEl6AiEAlM9hnfxkVnKKLDPjWJ3F7XXpsgUI/OFQYD9l0NhyxLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11051304},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c649a4d6eafcb5a995f517892448582226b55dea","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.698_1782262714760_0.9700780926654582","host":"s3://npm-registry-packages-npm-production"}},"0.1.699":{"name":"ugly-app","version":"0.1.699","_id":"ugly-app@0.1.699","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a3efef4846401e189e93eba9242e1a33485ba24a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.699.tgz","fileCount":2421,"integrity":"sha512-YUAT/wz9/RheGlFxcdEjJqb49KqD7Hr+H0A9RI3f2m9ELaiV3k0OoIIfgGGcoT+7Eondgl+NdwjgQNXU9i3QLw==","signatures":[{"sig":"MEUCIQDD7BBTufsfjzrJCMkNCYGphiJYYicme5W2acfrH2/JTgIgLkTYWGkvX0nR+QApoM7c5qwhrbxod9yIC3NPa7Q2XIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11053697},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"256f1f27af5e335ad9bc1fa589026de07e1ac0a5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.699_1782362666087_0.8875032761622133","host":"s3://npm-registry-packages-npm-production"}},"0.1.700":{"name":"ugly-app","version":"0.1.700","_id":"ugly-app@0.1.700","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a8c84b6903dd48aea5ba5e1a0565638bfdd21fea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.700.tgz","fileCount":2428,"integrity":"sha512-YiHLponeGHjFVD+lIyXBJplZhMwk2z5RH9zVK7yjNhXqBF83E6i7xfhtQLWQ/COWOdjn7iZ87p9amRdirMoZng==","signatures":[{"sig":"MEYCIQDkWdLyHU5k94TlHvGwbrMtbpRygxjvUVP7ZVBBWMDcqgIhAK5sB9DgVNBwUkSTKN1cKtrQ41J57+QRqSUV/6uBXmli","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11101237},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1eda45e233e0a44d28a8b05ab0ce2524db1e112e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.700_1782401417794_0.3294109590550611","host":"s3://npm-registry-packages-npm-production"}},"0.1.701":{"name":"ugly-app","version":"0.1.701","_id":"ugly-app@0.1.701","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"88f0bde0d06d331b26a6a2e8309b0183bfaf260f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.701.tgz","fileCount":2421,"integrity":"sha512-ElfGglnhMtZ5nkIePq2fwo4j71vlVuz03Q5QWjfHaJ5iUjLSicxt3NEc5sapbGg4/nlPU+j2VOMunZIx60GYKg==","signatures":[{"sig":"MEYCIQD+mlUiRiAzWs3MfkR8bEKvGHc6TGXz40TDMutUVmAoWgIhAPyB30tvz49XrTEuZ6WyrziYhOB161/5CQNJlBLUcITj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11053697},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"be2d1f95902747b27643d95fae213e5dc997e958","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.701_1782440328900_0.7443145571152454","host":"s3://npm-registry-packages-npm-production"}},"0.1.702":{"name":"ugly-app","version":"0.1.702","_id":"ugly-app@0.1.702","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8a56f32fd95a882f39da6c14f1bff514b5c05563","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.702.tgz","fileCount":2421,"integrity":"sha512-Tsh82CbKr8k3fafpAIkGd0JZD4G7eC2ogGbwk0ieJj46zlumNvHkPBLqZ7rIi8B96OqMTKtpNKq4QAadr6JDMQ==","signatures":[{"sig":"MEQCIArQYBlWwE4Z7gF0eO1IiWXSmj3gI5QjsJfLLzNmMiKJAiBhn4UKriFlwpjp4gAu3yf1rneUpgqiulvVv6mV+9iKyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11055194},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e3fb167b6fb99e6bc70832ee4fa80b5f5c6a1711","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.702_1782444423681_0.23051171566564266","host":"s3://npm-registry-packages-npm-production"}},"0.1.703":{"name":"ugly-app","version":"0.1.703","_id":"ugly-app@0.1.703","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"322d1a8e922d33d842104085641e0d119f1c3fca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.703.tgz","fileCount":2421,"integrity":"sha512-54Dk2om1QohZifLo4+oYnn33dnf+n8PcpCRxrqcq06YFBBEKDtCGA4x+m45tPZkcpEkbTWjzK1ZhMztpakpi9w==","signatures":[{"sig":"MEUCIQCyO2OC0VEBjYzAsEsB8Hmtl6d+KEXodo6w0fGes+jtEQIgPJXv10bhJnqaZhswMiin+5q6av+7hG4rJFboAi9RfaQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11056027},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cac03980ca3acfc2c750a0ba0bc496ff73bb3eb7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.703_1782449721352_0.1762400226482974","host":"s3://npm-registry-packages-npm-production"}},"0.1.704":{"name":"ugly-app","version":"0.1.704","_id":"ugly-app@0.1.704","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8ad0001163fdf3814c18ec8892bb76cff4415699","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.704.tgz","fileCount":2421,"integrity":"sha512-fMm6f5/aUMhcBAE8wrFPFnxtlpdM+kshaTJ3pruEjRbx+7B1q/sExBR3VS9acbP1q8DSO5KADYjcgDmVj5cl9A==","signatures":[{"sig":"MEQCIF8/n4OaXzHair+SLbbcLnA4kO2G3Nq/BQ851vtNRJrYAiB+lcuq314fXlJ0RPR8D6cKYf4bJ+6ti1b712Ega7IR9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11059058},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"aed4dc344fc47191a0ecf6281677c4e499062d39","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.704_1782453192691_0.2541607140221429","host":"s3://npm-registry-packages-npm-production"}},"0.1.705":{"name":"ugly-app","version":"0.1.705","_id":"ugly-app@0.1.705","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2eab70d4e1be43a9d82971a1e76107927308f9c5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.705.tgz","fileCount":2421,"integrity":"sha512-R3Y9Rxj1+/7/mgosr9g1OhXnCYi+cgb5Vh1vUkmv1yyl0yS9Bont2AdNi/zdIlQxLNFRYwAZfhSDP/xJhN0ufw==","signatures":[{"sig":"MEUCIH0XwhV+468Ykcstjjr8T+R9cK9s3dmQxAVYRjrPvMWGAiEAtOveKf0jljZX2TQtqcB27lrRG/zRtpCKBqhUuEakrUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11060022},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"621e7827fad42d5e517bc9a057f68390f6f997d6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.705_1782453642988_0.789280703259984","host":"s3://npm-registry-packages-npm-production"}},"0.1.706":{"name":"ugly-app","version":"0.1.706","_id":"ugly-app@0.1.706","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ab726e1ed72964c07a5823d12f1c6b57d2d5d88c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.706.tgz","fileCount":2421,"integrity":"sha512-wtM+N3ulMIss8gLDbiK80VpEOOGtFrhA14GIiYrwHewzvOEH0UTF3Rxjjn9TRvVoNdtth7m9QmLyXQtFGskNFA==","signatures":[{"sig":"MEUCIQCi8np8KrIQ9zwss5c0lIU4AvNeYX6r3KXuJKxF5G9WqAIgUwZ4RPe8VwNbBw9BEryAy+onmm4SBG3gaXJTpJqwpHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11062216},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e9e0a55c3965c6fe0691b7b1292108eea6d7c0d4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.706_1782454264689_0.5873927214833283","host":"s3://npm-registry-packages-npm-production"}},"0.1.707":{"name":"ugly-app","version":"0.1.707","_id":"ugly-app@0.1.707","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"88f954b1022188b8f000665ac56f3de1e045172a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.707.tgz","fileCount":2427,"integrity":"sha512-aba9W8OGYwq8bMqMzv+uDIBdk1hzkNgEAY0pY1DHfR0Z3iLUir/Qyzrd9AiIije1fTAGe4oPehZQU9J5qZtEVw==","signatures":[{"sig":"MEUCIQCslOm01y3R064W/4rBhr2+daZ94Z9OI8Aqy4sdygoJGgIgO52LkfwPN6U+SnphvuLMim27KAjHgYTZTlfr8Fsf3X0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11086426},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"253040acd36cba518e1c940e1c2bff998b778578","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.707_1782587993754_0.3511934593048063","host":"s3://npm-registry-packages-npm-production"}},"0.1.708":{"name":"ugly-app","version":"0.1.708","_id":"ugly-app@0.1.708","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5eaa3d13b397be940eb73189559e8788bfaa90ed","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.708.tgz","fileCount":2427,"integrity":"sha512-LMDu8bmIucJcUdVyC0qd9YFSsV0fkAr9bZ1BM5fdItPu8w3sUUSUhtgh38Ja9eWZxFqOgr8pT4T+Ak2LvVdIYQ==","signatures":[{"sig":"MEQCIEVlbZ7ZySqNlYp5JVvqqtHvWzeEMBDWsqSEkotybLHMAiAxHD33uZUVAj6mXJjLj2tSObxEnoSxsfnhchEiN1sgjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11109499},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f2e5f03e6125238e1e18bcc873fe2010bdb9df99","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.708_1782591205889_0.968153218000529","host":"s3://npm-registry-packages-npm-production"}},"0.1.709":{"name":"ugly-app","version":"0.1.709","_id":"ugly-app@0.1.709","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e2ba85cf739e29bb71273edfc17e17d93524353d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.709.tgz","fileCount":2435,"integrity":"sha512-Z2X0u7cFJCe1pfJu8nRd9R2hOUPg2NXJwwmk3IZUM+gdbnkoN4cninnXi4urJdMb41iXuc3WsHPK+bcBqAKOuQ==","signatures":[{"sig":"MEUCIFddCze8wEk/pZE3A9Pw+HdH73ZwSOqP6xJyx6mFeZs/AiEA2BSbLtmaYmCMJ3xBfGK6VDsGq95Lckg5/K4KCZsbYDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11135311},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"98bfb3731eacba11a40a47aa4a902be7e5d646a8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.709_1782603782029_0.2369069837415798","host":"s3://npm-registry-packages-npm-production"}},"0.1.710":{"name":"ugly-app","version":"0.1.710","_id":"ugly-app@0.1.710","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c132a495250270dd18beeedbc36d4c50b2154743","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.710.tgz","fileCount":2436,"integrity":"sha512-Rh6jMfEjolT+VtoOg8iu839czHOCJr9tK12E1A3S+9l5wwUPyYB6OJCsj9P1BTOmk+i6e8X9u1MdLvda8hmzGg==","signatures":[{"sig":"MEUCICGQ+FHll2SXeCLzbCRKMqO17KXpKPrrkjPnZNRH+3XTAiEA5sZlDQ6QBOhoI0BCS4oMUK6sxtOK89bM/jQ7Qtx1Ts0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11138843},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"193bb64c3d57cfcea278a9485b08d14d20c6d7ff","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.710_1782610318833_0.045546692246332565","host":"s3://npm-registry-packages-npm-production"}},"0.1.711":{"name":"ugly-app","version":"0.1.711","_id":"ugly-app@0.1.711","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"43d6e54741bf5d596c07e987e3c9d63f380db6df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.711.tgz","fileCount":2447,"integrity":"sha512-sa0QrFEsMvmKVBbzCztUUdvJ89xyPwkQQoeqfxr+3O+pGhUZCPfPb3kzMBOvgqK9JQJrDJ9jJdAkAtK5y5aZUQ==","signatures":[{"sig":"MEYCIQCxKUahOHQfQA01g6DburIwDBDEUYGMiG7RZnNDqHsf7QIhAO1FVuDmQYaxLcbXmysmV1WYL2pLDvemE1LbpGKrUvxw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11157543},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d9e2f088e8b469d591325c6d2c22c37c2cd3d0f8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.711_1782671758958_0.19202959079570103","host":"s3://npm-registry-packages-npm-production"}},"0.1.712":{"name":"ugly-app","version":"0.1.712","_id":"ugly-app@0.1.712","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"15afc350822f80e3ec8ac6834e2988958159ab96","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.712.tgz","fileCount":2447,"integrity":"sha512-HVfmeNgplmxPJnLTgPVd8Mn/BV6V3xO0CzgnM3KZbjBTdAa0aBvoWecjl60256NnXOssFX9huMu8oEr/FMXYmQ==","signatures":[{"sig":"MEUCIQCLaiI9OfGuijgLLouHCZC91TX/O48ZxZEGcUYnXMsgwQIgAsD7YlSACqaTiLG8budMQMDkw5A5U3qYm87Sx77hi2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11175231},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0bb27651aabf1e10ccef7c69179f3a4c93901ec0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.712_1782672110613_0.8769702741898542","host":"s3://npm-registry-packages-npm-production"}},"0.1.713":{"name":"ugly-app","version":"0.1.713","_id":"ugly-app@0.1.713","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6fb26423346bf035f7f725c8cd819ddf0982aefc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.713.tgz","fileCount":2452,"integrity":"sha512-6GahmlngVG2EFjdV7+0bqN1OGb7iZCFB9JUJz7yY/BXpDdhku3YuLDTxYRgpU8Li7EAyf2LAceo4aMcCn099dw==","signatures":[{"sig":"MEQCIBBCFuSWHYgA2ND9JxW+sOaZwdNGOs4OgdaSyY8RXSQnAiAHmdwK5Zp/Vg/fnQpwNXj9RerJNWTHU8Qiqnl8TrRvJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11209145},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f6e238b0fce5f2e80c61ac78411e3f61d43ed8dc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.713_1782672483270_0.6229939252854535","host":"s3://npm-registry-packages-npm-production"}},"0.1.714":{"name":"ugly-app","version":"0.1.714","_id":"ugly-app@0.1.714","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"600b719c3588e5b20f3100660e9a6042a8fdbdeb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.714.tgz","fileCount":2535,"integrity":"sha512-CtG8u9Krc8KwLZJyRElr40n73SEcsQ0hNLlwezDisBCub2CL7bX/OMglnoS2OG2RXpXKF4ArA1zbj3Kr8X16kA==","signatures":[{"sig":"MEYCIQCNLU/vyPOsfwfLaW+cZfSrpBPyVHaf3wUIfOiYAYt66wIhAM4ChCp0b+5SDiswUvGNL3tlELa94oD9Ld7TimTsrSnb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11399560},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1e744fcdbb0b8922c0023ef21bf24ffbde66bb62","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.714_1782673462801_0.4076252988637663","host":"s3://npm-registry-packages-npm-production"}},"0.1.715":{"name":"ugly-app","version":"0.1.715","_id":"ugly-app@0.1.715","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6e3a7855d3d9e8e6b8b3610161107529e01ef701","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.715.tgz","fileCount":2585,"integrity":"sha512-WbOuZVPvXkR1vPxby8FXYp/bSE0CjSDRif3C9OGzJvvWAN09d9Uwmr9dwrj9RNVtqdKs7p4i1NN1VjRqz3pzKQ==","signatures":[{"sig":"MEUCIQCc4p2Q1WLgguMQfIRiHyIIp/Zy3PgQvRFucc3ke+UrJgIgMfBMWPzFp6DmUujV9+QC15AV8ovxvMsXpNbJ7T0F4Uk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11538347},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7412c210d6441fa3f4f3833a06de7edf151cf50e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.715_1782676682270_0.34344545658150705","host":"s3://npm-registry-packages-npm-production"}},"0.1.716":{"name":"ugly-app","version":"0.1.716","_id":"ugly-app@0.1.716","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d8aef20cb567342a0714e4d0ef4fb226971562fa","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.716.tgz","fileCount":2591,"integrity":"sha512-PjqFDAoVwmRlvxm/SHtuMoNWxxY39QdZHbsOT6eBzioI12utfDDK3Hvbg+8IjukfDiXZJau0WnAjTco19zTQPg==","signatures":[{"sig":"MEUCIQC1ZIVKp7jYGA1VQJ7YIuw30yu0LDYnHnBZy32v1+3+BgIga797VaqRVkvp+rZ72uaxhRaWOTUvO7PMSkRn5QvSJJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11559125},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eb428cc81e794d43fed7a89838b4d036a92fb0b2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.716_1782677744143_0.3585597375220113","host":"s3://npm-registry-packages-npm-production"}},"0.1.717":{"name":"ugly-app","version":"0.1.717","_id":"ugly-app@0.1.717","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c0cc55acf79238a182adc4cdaf15bbd4cea4525a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.717.tgz","fileCount":2597,"integrity":"sha512-7WKfHApcuQdkoXFADNh5+fNwkKRA1mnI58prSsH5EJuv2/jsGa+osozqhIdscutN6w8dRRq67Uxy2Gek+PNArg==","signatures":[{"sig":"MEUCIHbNZr6dYyiUDR2BLfUkDT6xwBhmVlujM96WeReUdeYvAiEA1iqEXS4hdwlmkZ3GahDxQL06JKPPmgXR+GzVz2fsWiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11570119},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"198b17ea96a191e0906b21fc57fa299e8bc6b41e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.717_1782680049202_0.950402919794717","host":"s3://npm-registry-packages-npm-production"}},"0.1.718":{"name":"ugly-app","version":"0.1.718","_id":"ugly-app@0.1.718","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"af858962b1b08723905ef2e652a9f55850594afe","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.718.tgz","fileCount":2603,"integrity":"sha512-jcottl3GE5RZA0Q5VlJLyLDkQejUmTZVGrTT0XuwzkZzLsZTvjcDeWp7+ymh0K7NjKj4bgYtwzm6N42VeH4Avg==","signatures":[{"sig":"MEYCIQCtBG2xnRhp15Vbq+v+YAcjFjWk0/LLd3P+ApSf96DHhQIhALKKz/ROCq9gHIIXBJcmAs7A8OELjzwsLTPbeCWT0A3p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11598222},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0ac2ac41855a8b12e5c7047791b913414632ce69","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.718_1782682199506_0.7594196184729511","host":"s3://npm-registry-packages-npm-production"}},"0.1.719":{"name":"ugly-app","version":"0.1.719","_id":"ugly-app@0.1.719","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a6019b4b594bd9dcce99d5bb6e0f3c56fbcfd44e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.719.tgz","fileCount":2603,"integrity":"sha512-/Il9/dh9XTGUpvMh4gTRvJZaUYwDmOOhpomcnq3qAaeL4MbtOas3AcH6yjK2mRqywBdhHgArg8GrqtZECzqGxQ==","signatures":[{"sig":"MEUCIQDEj6xKNiHqwUeTfaBziXffyZ5PdZOFHShunHUHBFkKAAIgGx/UMzSXGK0WUIOVkJC5RBNOJ2PNUaXFIXgrvN7GmPc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11598222},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fc196c85780d9756946caba4a95fd38b8576ed1c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.719_1782682257461_0.03449404933362432","host":"s3://npm-registry-packages-npm-production"}},"0.1.720":{"name":"ugly-app","version":"0.1.720","_id":"ugly-app@0.1.720","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"390fb8bc680a993d4f25c377050ccf146107bdc2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.720.tgz","fileCount":2609,"integrity":"sha512-mEwpsj8OlzP/9QrY+mP4ssyu25oOotFzgvngYSrgqLdoK2KQDoruW/7V7do+BPkKVPI0yo0qRCAaC35Lui6GGw==","signatures":[{"sig":"MEQCIH8zuh3HiSTwo7vp3kmGID7B6r5hQoN+u/PKhM2CDdBmAiBHfO2Q9tw4oHC6/Apq/03cECK5mwBjHuRvrIaKaxyJeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11609663},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5dd711732eda7b8f08bd8d1c628e3c2d0cd4bf7d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.720_1782682477614_0.726690556508893","host":"s3://npm-registry-packages-npm-production"}},"0.1.721":{"name":"ugly-app","version":"0.1.721","_id":"ugly-app@0.1.721","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"05553196cd78ec968f6be60d60839dfcfeb9c68d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.721.tgz","fileCount":2609,"integrity":"sha512-pNa4Pt12J7cg0OZ0o13QxHocoj3K5sXOV+hCZAijC0fWb7Br4+mcCQuvDQkc+i2/Dqoh6Tb2yAUfeuWG/1G+IA==","signatures":[{"sig":"MEUCIQCHoOggA5NcHdglTnA9tgX++Nxvjmp/awjJUBj4hYPJhwIgEzjsDxlQr0BIiuzueI6gG15J1hQfL9wEU+G4950f43s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11616707},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"376a994091e94ed171c61ea3cd747664726ca632","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.721_1782684129030_0.4946209924646161","host":"s3://npm-registry-packages-npm-production"}},"0.1.722":{"name":"ugly-app","version":"0.1.722","_id":"ugly-app@0.1.722","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0e78e2bbc4525a8dcfdaf1a1880c24cec5f58ba9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.722.tgz","fileCount":2609,"integrity":"sha512-4ZF87QW4Je8GxAdVNkXpe6kITI4BQwPfWtDySAfhqkfuGMXFB5FuOkvuzCoHkOWS3JN75xs6Ae3pbc+SX22mAQ==","signatures":[{"sig":"MEQCIArjVYtRniturWiAWLdgahGlLIEMgDTnZh9iVMrfOGniAiBajFi3YlAM/O5b1qEmtHQkRoxvjVU3T4tvBOyte/VWuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11619443},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f59f5b1390f8181539691450bc2a9278e15ef509","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.722_1782684466996_0.2555314311360146","host":"s3://npm-registry-packages-npm-production"}},"0.1.723":{"name":"ugly-app","version":"0.1.723","_id":"ugly-app@0.1.723","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d5f902870f93afa8688d66c4f3baac5971802348","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.723.tgz","fileCount":2615,"integrity":"sha512-EtNMMLIMz2icQNn30WZlo+hKiAKY0AQG0grAaE5m8+QXG3JqLWZmeRsFkHBv2EOyT3VLSwSHn3S8cQdzgEkRVA==","signatures":[{"sig":"MEYCIQCaJyrf0ZyuueQF/i0CBvKZu+Lh2u6PMgyPX4kyVVBXBAIhAJ8mnzq10hIbWw+nPmcuhFgtbA4INzwZcns+yl7GmJgP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11656295},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4cec55e3c45a162f549fca48f55ab4e0ebbcdc4d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.723_1782700614582_0.7797563636470735","host":"s3://npm-registry-packages-npm-production"}},"0.1.724":{"name":"ugly-app","version":"0.1.724","_id":"ugly-app@0.1.724","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6fa1981430aa4fdb3ffa6d31434af23c89ef08e7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.724.tgz","fileCount":2621,"integrity":"sha512-GpgwIl1FJ2Ea1xYeX7CtQfhG5bAgGZZgFzf+6Ch+QUWRK8vKWoYTVHHvkt4XVo8kKxdBqslZ4DqHskHzOVyooA==","signatures":[{"sig":"MEUCIQDMpoLvb409vUZdpO3dNY9yMYYEIH4If8k/z8YDDoJeUQIgY5emlA7bS5AuuZG9+S+iYeHhwiF1d7ZRY5gV7zYJ89A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11751277},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6cacae7ac517469fc304b689ba6c18c92218631c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.724_1782785643852_0.5977448265666179","host":"s3://npm-registry-packages-npm-production"}},"0.1.725":{"name":"ugly-app","version":"0.1.725","_id":"ugly-app@0.1.725","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"81a9f78d0e991cdccc8c2b66aeb87fc586fd6f65","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.725.tgz","fileCount":2621,"integrity":"sha512-lg4PPv1pkTOtYgFCt7zt7M+6hHp0qFpRgVu+l7Y7/b1fBPETf+U7v0XZBLXTkeGE4leheFJDzqrOUD3C+UEWww==","signatures":[{"sig":"MEUCIQDcq1CtPeVHFamxvdPopp+9WnMp3EnrtylmogrrfVhfWgIgSxcWM7Zwd/9qSc6bvosSN4NhcJQcYrGjP+i3e0fOXIo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11768691},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1c7002502331cefb004084919c7c571173387012","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.725_1782788801759_0.7444961763736566","host":"s3://npm-registry-packages-npm-production"}},"0.1.726":{"name":"ugly-app","version":"0.1.726","_id":"ugly-app@0.1.726","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b28c6dea3dc40014e3116fb95fb270340875510d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.726.tgz","fileCount":2621,"integrity":"sha512-IyxwsaTJY0PkBkZQG513OpQZn6IAedmu/kazWIsrNsnNJfbftj9JI296ZEqnSFSnF3irnUEcmCRForTzbEOJNg==","signatures":[{"sig":"MEUCIQDNWdrfqxmah+MHrl5KvjOxkvV4I0gjOW+Yjtt2c0Ut/QIgVuOqz0VYYhtt6P9rX7gMFJuHKioIUy2Oe4OWEhG8BmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11771758},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3ba1ec37bb8d089ccfb3b82134870f06a1090039","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.726_1782795793417_0.3899027599378231","host":"s3://npm-registry-packages-npm-production"}},"0.1.727":{"name":"ugly-app","version":"0.1.727","_id":"ugly-app@0.1.727","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a40397872acf47b43506d6798180fae6cb89e3a7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.727.tgz","fileCount":2621,"integrity":"sha512-QngH6RZMfpLx6Hyw/6r2/Pt2j1SkKjIG52wqeWQIgunNBKwi188PP4aytia7CtZHg152cXWze6uPqxMnxX1q9g==","signatures":[{"sig":"MEQCIA7vmB5uIxKAtDWqxCcVP68pObMBCZb4KIFQrjKTgNPfAiA/hBidfm2q2LWwucKgjN0rWIj9nQo94psC10GlNtOlLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11772365},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5749d1e8dee4ac98a2a12aa2920f5b71f5bc0a5e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.727_1782800310073_0.6982388345680048","host":"s3://npm-registry-packages-npm-production"}},"0.1.728":{"name":"ugly-app","version":"0.1.728","_id":"ugly-app@0.1.728","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a3000776966dc60e81b537c68e867b5c5eee076f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.728.tgz","fileCount":2621,"integrity":"sha512-dlccJS36OLBGjJCj1p5+h3Awf/3//jGa9QFDDTN3JXZVuyBZ6udcpAtlQvZkL+EgAH5IX+r+n8wAkPB/uhvuXg==","signatures":[{"sig":"MEQCIGkdRnjy9dPXKKJT8NkrgcaQmT+vdE4gMvxaRYWbplHRAiBFCXlSCyRuh908GRrdcPMyBKGqPpm7br9VmIjQVCzHMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11782657},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2d988beb44294bbc984ef879bdf76ff81439c244","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.728_1782836778505_0.7258172685085253","host":"s3://npm-registry-packages-npm-production"}},"0.1.729":{"name":"ugly-app","version":"0.1.729","_id":"ugly-app@0.1.729","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d85e2b471180cd7510a15599b794c54a44cd7d1c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.729.tgz","fileCount":2621,"integrity":"sha512-Y4+h14EBZS0NeOF6rzsv/cZ53JVfSXtuBuBzOhKWFBqPwcRKZfEsaZ+54C2LVSkaD+HfcfL/E0fWL7MXhvGKgg==","signatures":[{"sig":"MEUCIQCRIW/nzdIKPvJNxZMr5lYABJAhY1Y1fkluPmCs4X90aAIgYoCUS0oui6tTF9O3wsiYFZszLOe+LNL1jKWyseyRZmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11787022},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"95a8074904eb7717f45ac137504c205b32f5b132","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.729_1782887332309_0.24168147204307888","host":"s3://npm-registry-packages-npm-production"}},"0.1.730":{"name":"ugly-app","version":"0.1.730","_id":"ugly-app@0.1.730","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ea02f881697f374ccedf51d74bf9b790962bab16","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.730.tgz","fileCount":2621,"integrity":"sha512-5NECplm9O0U3dunqoD0mgARkX65qHfGvpxzd6ip/gZ4+1gbGOPW6k+HTU5LguYfOKJgY8EBH2wPnNtQJ2LRInQ==","signatures":[{"sig":"MEYCIQDBl+zavQGPYcOJRxMHz5drskJ5MSfev2yw/JplO61y0AIhAOxL41/nTsL2GCS+GDEsXRltUzNmaih4w2j41+EzdYsq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11790271},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cb8724a362c4c64455b7ccf6533db336d2d2bd8d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.730_1782890364871_0.20671088507555235","host":"s3://npm-registry-packages-npm-production"}},"0.1.731":{"name":"ugly-app","version":"0.1.731","_id":"ugly-app@0.1.731","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"247d6962574b3cb7898c938f124caeca59121a8a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.731.tgz","fileCount":2621,"integrity":"sha512-z5jAI9q66zR09vxSc/cyJbvNbavzspcOiF3tvZDOz67DA3fSwo+7Q2iqqQ/bEmKzmVvzYarUQUZH+usgo+QZ9w==","signatures":[{"sig":"MEQCIFPGyh1GMkeJZbE3maeqCDae/v8EewiePy359mbZqnDHAiAzZ6B7BNrxDjcIbkgOaknKjpDmUAnescbiLiPgmmxMHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11794994},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e2b798a042a3006594e5998675e6a52936badc66","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.731_1782920014851_0.9613127024767161","host":"s3://npm-registry-packages-npm-production"}},"0.1.732":{"name":"ugly-app","version":"0.1.732","_id":"ugly-app@0.1.732","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ab80b575f4cfed3cea46a438e71c868f58de4625","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.732.tgz","fileCount":2621,"integrity":"sha512-gnC7TRE1Vfe/q4GK84dq3ySfz6XJDvFFUH0Ya09leNb2D4vKSu4bz9jrGbxpqukGGbo6V5WtDszEyRpQNlqZdw==","signatures":[{"sig":"MEYCIQCDfbQUe1QECzEeP2Dd5qPSCpdzCCWmN8JngaEK5JauAgIhALU7tY0nZlkQXpE4gEjZlnG4bClB0p2VO36ZIHrQvWCI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11798853},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8ace7300ad23d78abbf27588486c1dc4fc44c431","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.732_1782964176011_0.04298856901842729","host":"s3://npm-registry-packages-npm-production"}},"0.1.733":{"name":"ugly-app","version":"0.1.733","_id":"ugly-app@0.1.733","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b8f085ab0282361bd998071bd5905c611af30ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.733.tgz","fileCount":2621,"integrity":"sha512-GnOCYz2Jcy7mnQgKb4Q5ZV/LDOMgcp2V040dsi3Qv5z/REQ2RrtHMxTF5SqZ726n/+a8GNbIxmf8VnltTLSRUg==","signatures":[{"sig":"MEQCIH98LnQ0vO3vJHDfpKR7W/6RKVjDzbQCRQxE2BeraePqAiAFfVMjSytVGjMNQpnfbM4DDv0Hjg3DT262Uoz6Vezl3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11802314},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2a1e168967f4dd609dc98dcaeeaebfd64eba9af6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.733_1782969494708_0.8267917322635645","host":"s3://npm-registry-packages-npm-production"}},"0.1.734":{"name":"ugly-app","version":"0.1.734","_id":"ugly-app@0.1.734","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a698fd8825fca68731b57412647b800063b68146","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.734.tgz","fileCount":2621,"integrity":"sha512-cH2+0NkE825y9MCBpytlcX9bhmBLv1jQScixCAhGmFTHFIA/NYE/BJwfxzH8QFKs89FFLSEwKVZw7BjzZrt/Zg==","signatures":[{"sig":"MEYCIQCPaYL/d+fqffMoOS8hcPBve/rVf8PawszSvfNzKpkKdgIhAJip8GDxcVizgmBbtQUkQXNW/Zt1K/1X50CJQ4X3d3wm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11800029},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"219031e0b70b339f263688620bc167a49cfec4ae","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.734_1783012418179_0.5371387147244107","host":"s3://npm-registry-packages-npm-production"}},"0.1.735":{"name":"ugly-app","version":"0.1.735","_id":"ugly-app@0.1.735","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c38dc492029d7456ba3b61e2cbc04a5d8c0f298c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.735.tgz","fileCount":2621,"integrity":"sha512-Lx+DPqbKZKooIRkOE5OGaGohFus7VvxWVLu/q7fOCEBuhLjlHYJvChro30NHxW5WlthF1wKQ8T5YH23CGe2deQ==","signatures":[{"sig":"MEYCIQCj0+AQ9VFIB43Q65N2x0W/pYIm/S4u4qCdSVMrCi3ugAIhAMeptRkpTE9+VpyUCdV5V42HHK7H/0SAO+eX4lNFp9Pr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11806717},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ac912e5078f588afb690e8fef948a501f5ae3b4e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.735_1783013337047_0.41677983336585744","host":"s3://npm-registry-packages-npm-production"}},"0.1.736":{"name":"ugly-app","version":"0.1.736","_id":"ugly-app@0.1.736","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9f9ebe6aa3b336c84de81f7ffcbfc7796fc4186a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.736.tgz","fileCount":2621,"integrity":"sha512-S4InaneW60EZY06lgcaI8GGrQdtK5tIQORGF1U5NuAJgWCqp3lHuqwKdh4d3LdIWIxJAq2tjb0tNITvG8C6Q4A==","signatures":[{"sig":"MEUCIENw3hHX8crrxljWAnP07qMLUCwV3fnQaVvz2+r4Ago5AiEArycFOkCzPW9soaRWJWcKaq49Ay8YSNyA8WH/F6NDVCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11809840},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"352832b166ba2878b935a0abc75da3f5506c3403","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.736_1783018648401_0.6978109714517551","host":"s3://npm-registry-packages-npm-production"}},"0.1.737":{"name":"ugly-app","version":"0.1.737","_id":"ugly-app@0.1.737","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5b78b6ed2cdb6f5552b12653f1b1642842ef7f8e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.737.tgz","fileCount":2621,"integrity":"sha512-jTW4LGRcy1vbmsrNhNL9a+kEpMhAooS/cf1LuQlEPLbl7DTMtZ+YGTU8R/fR+T5xgtWdMCxZXcEfeIpgrxV68Q==","signatures":[{"sig":"MEUCIQCh7fKza4VjAjsUhcrYNvOvo7/LQ/sXWbWF2/hD29qyTgIgMnU0jffxfdmBHtSfrjBnH/pKV4vqJzNoV/RqIKVMMUc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11812245},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"31c74c5922f8c249698447ededc88e451917a034","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"deprecated":"Broken: circular init in ugly-app/shared ('Cannot access textGenModels before initialization'). Use 0.1.738+.","_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.737_1783024762679_0.3143411459034029","host":"s3://npm-registry-packages-npm-production"}},"0.1.738":{"name":"ugly-app","version":"0.1.738","_id":"ugly-app@0.1.738","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3fe2ac8bff668308798b492ea36399b04cfc117f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.738.tgz","fileCount":2621,"integrity":"sha512-IpuYMnAuL36JcOf+Q2Bm1mtMoNyW0M6fvZGkvvRhGJY02cSfJu0OD32r+LOVHGUnSbiq1xWxP+sLTGV8emfoKw==","signatures":[{"sig":"MEUCIQCDTWDx2V+aJnvU2Go3E2wquXBkuhg8ODpdlfuEF7pLLwIgDvTZaSmdt6g0o0OZHbivkDNatK6n7rHPpfoyibPGKxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11813717},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0699c9293ffa4fc43fdcbe7d45ce56a4ccfcba8b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.738_1783026616944_0.7610037348225733","host":"s3://npm-registry-packages-npm-production"}},"0.1.739":{"name":"ugly-app","version":"0.1.739","_id":"ugly-app@0.1.739","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52544e5f27cb4cd4bcb4223fd74c6bc3d193c92a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.739.tgz","fileCount":2621,"integrity":"sha512-5GMH+A/UAwYyS5vXu1SGJX4XXma5vFT2jr7AOHeQsaVelAmebzCT2JgruLOxVoTUaCvkHR4hh04rb04mBMa0Tg==","signatures":[{"sig":"MEUCIGsHKkM63rUq0PDZ0gfKDIIE4amllH8YP/fZ6ddKIvGfAiEA2K4xoWzpy+o5MWZIf8/WEOQOSkeEXNKE6wNmABut8Rc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11815300},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"810381544a3ea204779347a1cc39d5cdc699dbdf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.739_1783030124524_0.5735420999244623","host":"s3://npm-registry-packages-npm-production"}},"0.1.740":{"name":"ugly-app","version":"0.1.740","_id":"ugly-app@0.1.740","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d40c4f37ef653557afa5cf2905109efa37480efb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.740.tgz","fileCount":2621,"integrity":"sha512-bzT7bBfdrZXT2GkE8WK21P2JN42j3f5kGEwat3ccuVB43nw/Db98nj1g4yGAqJXKnvnQyL/oQVYOnWLVyXWijA==","signatures":[{"sig":"MEUCICrxt8S5kr5b0hnLN5jn3c1ZQ2xPiHMR4X+CTnEvESkNAiEAuwxtBwOvgIGjjOP7/plZ8hQ+sadCvRYZNJ1WfB6lht8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11815597},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e9baa0d18e2f115d7209509709ec9fda6d5bcd29","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.740_1783034399668_0.6349047537603683","host":"s3://npm-registry-packages-npm-production"}},"0.1.741":{"name":"ugly-app","version":"0.1.741","_id":"ugly-app@0.1.741","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cf7e6136fb989d1f36aad5a52f2dbda2263b68c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.741.tgz","fileCount":2621,"integrity":"sha512-pecdWlaL18j7NMbn/JjlQiJjlSUZ/MIKsQ1AawZS7o+Qlwd/8s/YeJJgtj3ad41a4aHo9lpNfavpiVlPCgO0Hg==","signatures":[{"sig":"MEUCIQD6rDD5hQ9fxek8bQjRNWHCK7sY2/Tn4Dkq47EEJkDZ2gIgCPxn+ab/6epsqE8yqc7sQ9UzQF9nQtSIu4NaPdwWOeo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11819282},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"49fac0a17d84902649ecba42b22deb814bc2dda6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.741_1783035185383_0.6953870239955366","host":"s3://npm-registry-packages-npm-production"}},"0.1.742":{"name":"ugly-app","version":"0.1.742","_id":"ugly-app@0.1.742","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"62de64bf4b244277d8976507266d62ed6d22ddfb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.742.tgz","fileCount":2621,"integrity":"sha512-REkRoTqqLziNwOGiJE7UVPpenbkI8xBbxognhq4AfoJcGc6TTyhEaS5cGa1nYKgPQRUgskz0MhTeesDAhglIyA==","signatures":[{"sig":"MEUCIQDXPpu1jex3zrLaYrA+24VmJ8NSFaxq0ChZ4K6Fr1pL/QIgHYljlAsKYf3JWJPckKXjRQnnxf+ilOLc+R9iTg7NovY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11820171},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ffdf37c4623f2099c22ce04087453a6cb863e76b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.742_1783036346510_0.8992007451847548","host":"s3://npm-registry-packages-npm-production"}},"0.1.743":{"name":"ugly-app","version":"0.1.743","_id":"ugly-app@0.1.743","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1b6867e5750d1604e9f0e7bc3df8d4210fbb7e0e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.743.tgz","fileCount":2621,"integrity":"sha512-ga9OxHi03nL01CHcPa+TNC/JFm1rc3Qg1FQsuqTgZ9fFURjM1Qhob0DxrDjTXdzJciwLXMQYDsf5SVgj+klgLQ==","signatures":[{"sig":"MEQCIBM5k1GKDs9ub9et5d0Cc57T82IexXRkbsksW/0nuKXoAiARNCPjUQA+ltacJNT4bpbue8LtR8HX8hIuj8Pkkt/O3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11830656},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"20f4c4cc3c6f9d179a5e5c55e48279d867d5fd28","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.743_1783040535106_0.2054709810015538","host":"s3://npm-registry-packages-npm-production"}},"0.1.744":{"name":"ugly-app","version":"0.1.744","_id":"ugly-app@0.1.744","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1a690abca3661ae0177c4328d696874d0589e75f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.744.tgz","fileCount":2627,"integrity":"sha512-es4hgijRj+FTixI89LoFRr0c+GgP3/wGnlJPZATBu2pE+I+jkft4fZIBI/ZcpgE5VxPUIu5BzWxP3gO7igqsfw==","signatures":[{"sig":"MEUCIQCwL3opfigDyernqkZ9RjICvTF+JMgY/VHk8JgGmYV3BQIgMtYm5rDh9oI677ouZfBSw5Ehks8lm3/98W0YsmUcS0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11841063},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bd90316f745bdac18747f3d26f56b57fcd9d4c2d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.744_1783042418090_0.16767215553769965","host":"s3://npm-registry-packages-npm-production"}},"0.1.745":{"name":"ugly-app","version":"0.1.745","_id":"ugly-app@0.1.745","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"af88ec8e529fd5f26a866ce0aa56ea76ec051b9a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.745.tgz","fileCount":2622,"integrity":"sha512-rTkt9OcAZuhVoxJvnVZXdV/tTfTqCedmEGy2uXXMdVr1B7YlWckN4RF3AHarsab/rfnTGopH19NLTgqoN95VLQ==","signatures":[{"sig":"MEYCIQDdngQOswmEr7wktaLj5UXyU5CydSMFlYcZ0VIw86eNigIhAJv9mauqWnnXE2obL7FcKl4q5wvUw/0NaTPpcdQfaBcm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11821847},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b6f874e62a5ee9296f835af7cafa91dbaf58841f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.745_1783045377989_0.8834163196046032","host":"s3://npm-registry-packages-npm-production"}},"0.1.746":{"name":"ugly-app","version":"0.1.746","_id":"ugly-app@0.1.746","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1893022d07327463cad274264b1ae9d24bf71d1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.746.tgz","fileCount":2622,"integrity":"sha512-UgdtuzrVqm/EjMeRQ/0zNGavO7/TpPJ6wtndvFQHKVCX+CE/yi9LMIHUrCv2ytmVhyMohmD6SOHLdCBxA7PFLw==","signatures":[{"sig":"MEUCIAiSvzhnEdSNU/G0SDvVmQMNkFKmJ4kz9SyeC4Qp4FLaAiEA1VyXs+joLrIakf/IC6EK0b4NoS7wKecBjUnT3TytMXU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11836655},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8abcf8ae8bd01e9ad04ceb357e46bd23d6c5ff9a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.746_1783051927684_0.020799401234735226","host":"s3://npm-registry-packages-npm-production"}},"0.1.747":{"name":"ugly-app","version":"0.1.747","_id":"ugly-app@0.1.747","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e4e18378e481057f67d4e91fdb688b966c9c19df","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.747.tgz","fileCount":2622,"integrity":"sha512-uiDhiIcT8iAzWknMiu0/Fwc8cO10H/BlpgaTNHG3ifzsJFHSt0M758bn35liuZFf6kFegWvJ9gFARgoStZwlsA==","signatures":[{"sig":"MEYCIQDqnOzVBYAnuz1W+SKduxZAivUfwxbxGpjNoeslc5tU5wIhANq8wyvV9BSGDJV9OgSAQOlA49/AgJWBiXBQem/0evoP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11836973},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c8f10672e7f16541820df5dc34dd080b94dc07c1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.747_1783053582336_0.18804018354089336","host":"s3://npm-registry-packages-npm-production"}},"0.1.748":{"name":"ugly-app","version":"0.1.748","_id":"ugly-app@0.1.748","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e64649b7e89ca22cc592a52b2e3639c9367fe39c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.748.tgz","fileCount":2622,"integrity":"sha512-Gl/pYskzY0KALtPFtVPaqW33TNCRNlirTRqaqhEN88kI5njrxspP0CZkkNu3KU5/DHWjbzviRFR825ROZ/GUhg==","signatures":[{"sig":"MEUCIQD8B7D3zfGkkHIwbcKyr9vvxTMnlP+5UraLa55iNFDz4QIgXb/7T4gTRj3RDVx+JfaAmP5ROGEkmgQyFbb/dTn+hgA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11838944},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"538bbe3b3421667953e490464dab1389eda37af0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.748_1783054859481_0.8756830828876276","host":"s3://npm-registry-packages-npm-production"}},"0.1.749":{"name":"ugly-app","version":"0.1.749","_id":"ugly-app@0.1.749","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6f3874bce2432d1d7d89284d34de546689f74149","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.749.tgz","fileCount":2622,"integrity":"sha512-I9dU0B4DXw6wHbrPxkk1XUcC6vaAaJmJWnaUdoFVu3hWSJzwV2+l/4YK4yC+i2nnAaUFoDA42OIgVjSfEp4ypg==","signatures":[{"sig":"MEYCIQCIM6450N+cMV8JWc8R/v9z1pT4LEaH908R1gGgqaDYbgIhAPcXPr2fqrxsJDQ2bJjNJQ8RaT+eE+XzQmj1Aof2ONG/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11848744},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"714e78644c2b503bca347b3fa8751877059f316f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.749_1783055680840_0.726122443632607","host":"s3://npm-registry-packages-npm-production"}},"0.1.750":{"name":"ugly-app","version":"0.1.750","_id":"ugly-app@0.1.750","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0345d1b7a372af10ef517ba7aeb00fb2535a674c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.750.tgz","fileCount":2622,"integrity":"sha512-jLQ9C4pYg4dxrWeuMO9AJkvU44frBf7/YIfXWdFkHRR4cUDPN+irl6t3cIGKdHef/kc8xuAp3f8pOryYyc1vnw==","signatures":[{"sig":"MEUCIH7BetHk/LXL4rx9dTeup7WU+GA+FEdx4BGaZS2lgL6LAiEA8W3ZIgJMLOTOrU/8kLIEc/LXFJYn6F+P55ZsIIuSdEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11849427},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c2988e613dfae9fefeb425ccba1af6f27e558874","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.750_1783064906108_0.6709946322051794","host":"s3://npm-registry-packages-npm-production"}},"0.1.751":{"name":"ugly-app","version":"0.1.751","_id":"ugly-app@0.1.751","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d2c553009c1c9b2eb3dfcb8636ba2f9a634b772e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.751.tgz","fileCount":2622,"integrity":"sha512-O7l1B7qWIiQItRbF07ppDqCogf+8pcfLI1lI+qa5piMVwEeCL6X9StG6qoLxHOu224HfygvKwe5rNUNfpwgB9w==","signatures":[{"sig":"MEQCIFeg1G6DtQc9XQgaddHGz8Klo8q12bGH2+6OeDriIZBPAiB7Lcy1SmKxpCwjXueH5qjGpmIcYnMUNcMSQx7YT8md3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11852826},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a2dc42f4b24a6f6cd73fa4cc4f3e1ee6a124f707","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^9.15.1","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.751_1783103489176_0.9167674127309735","host":"s3://npm-registry-packages-npm-production"}},"0.1.752":{"name":"ugly-app","version":"0.1.752","_id":"ugly-app@0.1.752","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c8aaac094a1d5e8b701219cff93942c45dacbaca","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.752.tgz","fileCount":2622,"integrity":"sha512-O4BwQisHkhdSCZmd9kPwh+6zVTKjA8LJ4VHJNIrqjs1UyLGbjbiTq2gwsKm7cs6jxh/hFUXBZjYzzyj2EjhPBg==","signatures":[{"sig":"MEYCIQCoSYTWdmgQu5E1U08fTWMiT2VGLshacs8bi/KCQb+GBwIhAJ0A01IymACnDSUImGBehlHQpoHr469tBnk0Coqwx63k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11852826},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"72a7280ac724c7acc023239884d2af2e33d42397","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.752_1783104759851_0.36033151521929363","host":"s3://npm-registry-packages-npm-production"}},"0.1.753":{"name":"ugly-app","version":"0.1.753","_id":"ugly-app@0.1.753","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"667d399f3070b02689f4a6164c85493f762c2bdc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.753.tgz","fileCount":2622,"integrity":"sha512-1D3aqp9GiU8e3VQvgbXbv8gy/KTDVOfNO3AoCLNKqTu0FlhfP683B+Q0BHL2vRmVXAqngMwDpQU5lrmnXZ230Q==","signatures":[{"sig":"MEQCIFvFkz0wnDfAFLhCK9LE0+u1s16MZwdRKMwgbeLG8yL5AiAP7e8nhUx04GyiQxYG6HDtrbKD1F8RMEsp2C6+0WG9ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11855130},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9d2d8e42ef210add976e1430c98e2edc0b7c384e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.753_1783106961382_0.7705772809805069","host":"s3://npm-registry-packages-npm-production"}},"0.1.754":{"name":"ugly-app","version":"0.1.754","_id":"ugly-app@0.1.754","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2509a15e1e1dd8dd344130f1392cc465f759edfd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.754.tgz","fileCount":2622,"integrity":"sha512-KtSgNFtvLKgWEKJb/l/lO7Rw7Xi07WUhy/w9U4laM1uam9tl6Ic5jNVOYtwFd32Z/moetHZEh4DkB0XxRmjWuQ==","signatures":[{"sig":"MEUCIQCmOeoY4jY2TxU8ng6ycbcqLFo4mdwjkyFWmSlnCBdIsQIgRJ2IsCb9OX/xeZvqkzfdfJEfQM6pAgm6oh2MfOkZ10M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11878383},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b48616d2403c30ac37e60b3d032bd9c378ff01e5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.754_1783109694956_0.6304328075064558","host":"s3://npm-registry-packages-npm-production"}},"0.1.755":{"name":"ugly-app","version":"0.1.755","_id":"ugly-app@0.1.755","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2e2dcbc7af4aef192234d4e8e2e730e0258c195c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.755.tgz","fileCount":2622,"integrity":"sha512-EsvZ+6F7E7yzauGT8olwVzkWZYd1o4QwnC0vXW2NMKeEW11apK/SeJNJCoe2LSRqkloclVuIbPNuVU9rIAs6/w==","signatures":[{"sig":"MEUCIBbhYsIKyZjJzqlAN9mcCxyqsENnavIF9MW/1tItfSWqAiEA4BfCjKGgPVFOSC2enw/T14TJ9/IDZui7yqPF1EX/wB0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11884881},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4907def80be2e560e0b0713b49e74ccabeab0d02","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.755_1783120695942_0.8111680127356904","host":"s3://npm-registry-packages-npm-production"}},"0.1.756":{"name":"ugly-app","version":"0.1.756","_id":"ugly-app@0.1.756","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8fa4038eebad903a2149f9715af49f302c1c19c7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.756.tgz","fileCount":2622,"integrity":"sha512-/V3Ymm60MiFM+jRa5Ag7v9wmCI0NDuu/+0kBrcE/X8yNVzz6OA9iOODxtRCcN0slvebkRDXTdRzNTGsVxlsDWg==","signatures":[{"sig":"MEYCIQDZlNCO6Rm+alyAIkQwmntXX+2Tjih+AQGiHae0OkncxQIhANfrMisGq8El67DDvDtto52gxmXWwc5GXb7YY1CKIhBc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11885769},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"998bb21d465e44e8dc71742418c722eefdce4cf2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.756_1783123547208_0.32923882506918156","host":"s3://npm-registry-packages-npm-production"}},"0.1.757":{"name":"ugly-app","version":"0.1.757","_id":"ugly-app@0.1.757","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6994de85efb850376a52edbd43c4babfd513ce2d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.757.tgz","fileCount":2622,"integrity":"sha512-JRmX7ug+jZW9ZbhD+7fhBPZnkr5fuPex+grw49srpcD6pmXWU48D5viR5iHrpz57AfxA3TESF2aOozX22bxB2w==","signatures":[{"sig":"MEQCIAbRJbAPjJZfAaiAnAtanpsImPgE2Hn+ZNx+Rlf1dH+NAiAsMRlLO4Yl7w40/eWms+8ooai4dUYThGj/wvYE0ghsNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11889330},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"929cb71fa4afb75674d4776077a996b100ebfe4b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.757_1783125279964_0.19182551773135748","host":"s3://npm-registry-packages-npm-production"}},"0.1.758":{"name":"ugly-app","version":"0.1.758","_id":"ugly-app@0.1.758","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"556413950ec73fc3db46271f86cc5a239b173f36","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.758.tgz","fileCount":2622,"integrity":"sha512-yL0ojEDbNZXtcUQkmIgrWaT1kXjMZRJNuNyIt7Fe0+ADzLq/yEZOPX2zWV2ZLnRKxEADOAJidfdo940qq9Yzig==","signatures":[{"sig":"MEUCIQCXZkdjb9itt7CrPiJwjGAJfRps8g4FTdDnIPVmDFzt5gIgBxq6Ve8QXB6TDreyLiDeeyod6PiPrzHSjSxzeSylaco=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11897152},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"81215965640bd81dd7832e0d404f0f5feb2c726a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.758_1783126292513_0.2829381559154507","host":"s3://npm-registry-packages-npm-production"}},"0.1.759":{"name":"ugly-app","version":"0.1.759","_id":"ugly-app@0.1.759","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0b4a07f56e142f86519cc25e686f594e91b9e3b3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.759.tgz","fileCount":2622,"integrity":"sha512-XPMaQRAlIvddszIZS0469cPWaZ47GSPYrl3chZgwWzd4PhKaJdKrutF8aA2hQkDEmkZrIj4ZWu8nyqqXYv0V2A==","signatures":[{"sig":"MEQCIBazOzFiR9m5D/c8GNj6WjD6Rxdt/p0ueW421DOdarELAiA+KyC3QZekGWsH7cu2m2qfvMOsePezQAR6W+tLizLUPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11900991},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6b426325dd2e1ce69ebd36889d82258af5d47520","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.759_1783127664127_0.5123867318470277","host":"s3://npm-registry-packages-npm-production"}},"0.1.760":{"name":"ugly-app","version":"0.1.760","_id":"ugly-app@0.1.760","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7df28f9e10d00fd4e79999605b49cb6a326128e7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.760.tgz","fileCount":2622,"integrity":"sha512-MCtxJUs/HTmrzC3WYKNqK8XvpaeZzdZYa1mbVUDYpZ+EHOnQBzgvZk+ui0ortaPpFrh1f3k1xteq1BZpD2uGuw==","signatures":[{"sig":"MEUCIEzzKM7S5EK6O11vnAD9Noh6wrci498Lojr12KNX5+LgAiEAgQL2lOgWCvtxNBj0lLq5QBVDQtqhrbRt5U0zYhB5L5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11904187},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1e699743abdfdf9848a5e4134c667395a8ee5af8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.760_1783140238646_0.8651348006854318","host":"s3://npm-registry-packages-npm-production"}},"0.1.761":{"name":"ugly-app","version":"0.1.761","_id":"ugly-app@0.1.761","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"35e42a85aef5fd62fb1c8541c23dbed215b98733","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.761.tgz","fileCount":2622,"integrity":"sha512-KOrVG5QFC0n/UKdIgi/TQqTtUd6GXmryjBu8Alp6LGJTadAg3wq6BXn0HAkyBCwhW7CAe7ANRUskwp0xMIMQpQ==","signatures":[{"sig":"MEQCIGd1xKL2Bc5e0V0VwqCyFikL0muE8wrFAXOjTqu9LPliAiB/baQx3mAudsvxsCgopUUOqDqB0KXv0xryffqJh2nu9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11907061},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a169f7b02ae2eeeba8af951c1bed4e0e7512d441","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.761_1783143948406_0.6972033218818281","host":"s3://npm-registry-packages-npm-production"}},"0.1.762":{"name":"ugly-app","version":"0.1.762","_id":"ugly-app@0.1.762","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"35c2114ab51f7061eb660e30c36d4b2d2df02878","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.762.tgz","fileCount":2628,"integrity":"sha512-FbP9l6xCqk98T3AncKEM/at1FHPhwhQmwmUdqAwt2g53enY+6WAQzuAwRBrnKfbPkKRL9b/SJpWddv7CrOD60A==","signatures":[{"sig":"MEYCIQD9k3BWIzRGlllfxjWIlTzUIRH/NPFftgV5oRxLw3ouygIhAJEk+iXB/TC/ZdnDswgZuR8npUHZThPx5pvU7aeMbs1h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11914966},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a1ba5796510f918caf99ad10451802a75873db80","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.762_1783145391138_0.4479160960077373","host":"s3://npm-registry-packages-npm-production"}},"0.1.763":{"name":"ugly-app","version":"0.1.763","_id":"ugly-app@0.1.763","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"78fef9805d897d03cf4606187bd192dec0b4cfc5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.763.tgz","fileCount":2628,"integrity":"sha512-RzRy9w6opAEEEiYzYaq3eyTjOc/fic7zAGrxJpnWTtTBp1KelnIwcHmdQ2YMB56HuYQKuUGfOPIU+xM7wbu6/Q==","signatures":[{"sig":"MEYCIQCh4iGVowZxNAet6Z2ffAzr7lIRPkWffa5Cde/th83zHQIhANZPBLVNUfEaCx3JEmJW8cNahXl3UfeJg4GYo/7WQDtJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11919528},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"db7b161e8990e374467836c0d4d9688c73c4f529","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.763_1783149119937_0.10952542166912216","host":"s3://npm-registry-packages-npm-production"}},"0.1.764":{"name":"ugly-app","version":"0.1.764","_id":"ugly-app@0.1.764","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d24390305995da4186e4c849b56cd1005ec22f2f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.764.tgz","fileCount":2628,"integrity":"sha512-vqnIXvKvmvgtNbAwgb+/dK/EPU5akaYm8IeQIYsBIsbQL9iTdxCb7VS5AEUh0ncdvTV2AmTB2FxZbDiPBbLWOA==","signatures":[{"sig":"MEUCIA2e3fKruFZw4mg1hpq5v+SIZ9fcp7WPd+XMrz5gXAR7AiEAzWGuSVBcgINStfysxOMDeXf/U5/HjdtrxkoQR4qWNSY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11920075},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"02f33f74709e4e9efa397b26504116e78c0718dc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.764_1783153293227_0.09279972991346419","host":"s3://npm-registry-packages-npm-production"}},"0.1.765":{"name":"ugly-app","version":"0.1.765","_id":"ugly-app@0.1.765","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f386fed6ec7b2bfd542f56049ea7f268063d7098","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.765.tgz","fileCount":2628,"integrity":"sha512-jkEM/jQ7IsM5j7VoHOBwTDVkv9NhjhuXfeErmjJb4JqnFNXs2BPbr1CWRCFP7nI3JcQHgWYEWRHS9CaUjGepJg==","signatures":[{"sig":"MEYCIQCJgfEDuXt2o72QnLD2BBegkJTSVaUN5O6TFZItt6PQVgIhAJxQc56nkjOREuOx+HqK8zxfJoF4WVUpJhGVmfH6Js8Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11921047},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"da9c482d6b9d528776bd99035d153aed8dd28f67","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.765_1783186731011_0.4045124711711958","host":"s3://npm-registry-packages-npm-production"}},"0.1.766":{"name":"ugly-app","version":"0.1.766","_id":"ugly-app@0.1.766","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3622dbb27c704015687a06cdb5cf3a6486745584","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.766.tgz","fileCount":2633,"integrity":"sha512-WGaBt7ukEJsi7AFA+d8Dmd3H+9zscnVCeWLttO8pLv2doJFw4yyE0yHq3GWabIK9gQbCvxutVlaPNkZ4ChRvsQ==","signatures":[{"sig":"MEUCIBAZ9OL6qQFDCcctkD9LBQXmKTUVI2qBnogBF8tNswQVAiEAiuWdqVyIvrbl4x3m31qoftbgyHnF9nBLxWC/juhOSXo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11928160},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"71ca032b3dbea764b1421650d0c0079809c66831","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.766_1783187077511_0.8510689030865395","host":"s3://npm-registry-packages-npm-production"}},"0.1.767":{"name":"ugly-app","version":"0.1.767","_id":"ugly-app@0.1.767","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3ce7dac9a33853f3aa61bfebe8c7c4ef2f0515c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.767.tgz","fileCount":2658,"integrity":"sha512-5tn60lpzzxyUsjaUiZ20RNG8JCTKKDnkrkiKAjNnStkG3ORt2XH8X9BoHVf3V/cjne0+4aXwWHoZNkO0BZnVoQ==","signatures":[{"sig":"MEUCIALGcX+jngeUiKaU9LvdV/724SefDCS1t3VNCoB8OtPMAiEA5cP2ornQk6olcv0ul8lV7/s/JxSC37bN3iDBncsiyr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11979390},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"194f5400d72a064333c35ff56563c5e94c3ba477","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.767_1783190414456_0.5943951496771158","host":"s3://npm-registry-packages-npm-production"}},"0.1.768":{"name":"ugly-app","version":"0.1.768","_id":"ugly-app@0.1.768","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"40d372e92fd01a64aaffbb1b95eb350e755ef297","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.768.tgz","fileCount":2658,"integrity":"sha512-prI5Gku3AqNleSfgAceFg+SIOlpJBXkLTw8afM+dcS/b9v75S88sD/udxRnAZzxrBl7k3a3khH9OFuDgLvWI2g==","signatures":[{"sig":"MEYCIQDAFehbp1j41PyopebbWHKleuE/A1r7UARZeC8+xNUaKAIhAO58MMWz3p+uxd5ycqHHFzcOvR9yTowFyfGdqOTLHzgY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11979544},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"82663c0213ebab0ea022f38ad50ebb1892e48dd8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.768_1783190689121_0.7268725975382517","host":"s3://npm-registry-packages-npm-production"}},"0.1.769":{"name":"ugly-app","version":"0.1.769","_id":"ugly-app@0.1.769","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f8a13f67a2dfb0aecbcefc595854b0f37af9a087","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.769.tgz","fileCount":2658,"integrity":"sha512-oh6uuUu0yRUfm/zH5l4wUAKHaPM86myYec8nAJHiSZbmDcegHRLlOVY1ervIA7Cqs6O45DtRWZAhrD5nQQEMNQ==","signatures":[{"sig":"MEYCIQCCRVp5iXWkQV1Xul/zwzutdrzlN5MmO0cxs4fxX6VKQgIhAKhd5kDid4keSj8ThTsYIHXYvihMmAYAftQyl29h0j4V","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11982712},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b9951c6101585868862b480c5796d296aa859c58","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.769_1783192381388_0.35189624943330666","host":"s3://npm-registry-packages-npm-production"}},"0.1.770":{"name":"ugly-app","version":"0.1.770","_id":"ugly-app@0.1.770","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb3c811b50cc8b7978716588f2b81ab9dbd360e8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.770.tgz","fileCount":2658,"integrity":"sha512-1CcDgkWStMv3YJx2qHU5KofCjU0JhgVFlYq5tSY5T81OYIJZqYmyQIUkR8xNbQQL5aGoKIImBZC3+iUI/zoBEg==","signatures":[{"sig":"MEQCID/mn36QlPMO6rgyXc+Qu192IBZcEe4yz2sUINwo3JjqAiBAisvA4RpnvxqBrFGHnf2SDGI7g3kv6J4i+5Bt6FdhSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11994080},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"34053e93542c3dbfb0218566bdda5ad555d4b6ef","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.770_1783195323704_0.08394523515542107","host":"s3://npm-registry-packages-npm-production"}},"0.1.771":{"name":"ugly-app","version":"0.1.771","_id":"ugly-app@0.1.771","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8b64a6f1aefa6a619e88a1759191722b3d1bc123","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.771.tgz","fileCount":2658,"integrity":"sha512-49TqfKKxdNfSAVqygvLjgAT7uX5y4NRS649cOt53EDNVrk0QAgBxeiqDIM2Fziw4Awl0oa76gaP3F4aVOkYDsA==","signatures":[{"sig":"MEQCIFZMdZVuKz/3BcK4mPspQEdDtyIb/+Ob4n3e8lHQ9oatAiBRU4IJK4arxtyD/pfvfGDfrzfYrEOFXUn6OBlEqS/d+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11999677},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a8e66f62b9a46f98167146666bfb932c7b0bbb31","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.771_1783201473577_0.8056245255223584","host":"s3://npm-registry-packages-npm-production"}},"0.1.772":{"name":"ugly-app","version":"0.1.772","_id":"ugly-app@0.1.772","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"397bae6c47b0ec6ab71743ebad271e44b610f283","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.772.tgz","fileCount":2658,"integrity":"sha512-EI5v1ir9qyDnGFOcIJrzIFwOy9pgWvo8qM1EWyTpE3yy2dsZnPp/jv5T60RKO3T4IcrDRRlTR7PiCn04Fro1Tw==","signatures":[{"sig":"MEUCIQDbVfBcJeQd+O8zBXXdnMR/rsPVvLjdIjQpURG5Ipa5cwIgEdoaOUz5PwGheKuGd1/RbgKt1vzdjATSFi2yvRmAd1g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12001353},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"13fbd0c4bf44246767a523a4a1a5215184bdecb9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.772_1783203033993_0.5813549719215234","host":"s3://npm-registry-packages-npm-production"}},"0.1.773":{"name":"ugly-app","version":"0.1.773","_id":"ugly-app@0.1.773","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0b62e9c5e9141e3df796acba40f52653f7dd3651","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.773.tgz","fileCount":2708,"integrity":"sha512-d+mRKtC5kIo8EOYCX/kATPLM/LAk/hZWrhVMhI7PF6b+lhDHor8NLNxVyvzPFDbqKuCa8VORrOVltfF/tKdUhg==","signatures":[{"sig":"MEYCIQDlH26UCrjtPS1pwLdwENe6OecELWRKL+YIYs4esxTcQAIhAIk22/ex4+CYwW9MSfkmWn+JtXfjng+qcnPTgSDeZZ/e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12105119},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"46f136deb4769289ca795c5e69d7feaac010eda0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && npm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"npm run test:parity && npm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 npm run release","test:e2e:full":"npx tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.773_1783207840202_0.6776874026839683","host":"s3://npm-registry-packages-npm-production"}},"0.1.774":{"name":"ugly-app","version":"0.1.774","_id":"ugly-app@0.1.774","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"49b0a63773c9befd8c5b58c22f946dc80066899c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.774.tgz","fileCount":2713,"integrity":"sha512-h9u7jWrhCGyHaBCwXGXJBF1FQ414u0aCUn7PMnARt8fMLbAbjDcgDjPBm21fywooNtOlVv8HrB3L6Skq1h3ZsA==","signatures":[{"sig":"MEUCIQD1LQdkA3JCKAxVy9hcb+oSQSkdwvh2eWT/tFHHTPWqZQIgbgsv95Bera+PBulVweRPf92qjcIlYopY4Kunfs8wYdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12109773},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"75298b5e606ac57a92598a6f4668b732e61bc622","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.774_1783214026313_0.37308946922418973","host":"s3://npm-registry-packages-npm-production"}},"0.1.775":{"name":"ugly-app","version":"0.1.775","_id":"ugly-app@0.1.775","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bab4df3114187753bcc11aaf5f3ceb5b2f6e6057","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.775.tgz","fileCount":2713,"integrity":"sha512-+icRaik6hm6VfufQW0mdAUblovIjntfLL0s5aPd5GkDr/qqbDJUFfkWndN63yPWp6/P7GQPc7xElTfXGI0O/zQ==","signatures":[{"sig":"MEYCIQDzafHelXP1oOJsiRMSLJJ3uhpYC1aMCR68GWWgMcg7MgIhALJpce+3MuReNsbc6m3TPIyZH50/KSxEeu0AEpSKw44C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12110160},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b51d775eead4b10c9ec15d3f5bd37e41b0ec6543","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","eslint-watch":"^8.0.0","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.775_1783214362495_0.10037479441127295","host":"s3://npm-registry-packages-npm-production"}},"0.1.776":{"name":"ugly-app","version":"0.1.776","_id":"ugly-app@0.1.776","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7d88afc03ff486d62398ac1f99d36c50f48c7703","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.776.tgz","fileCount":2717,"integrity":"sha512-PPSukh4Xb6NBBQJT38Annj9OS59snMnAIRXkLjtPuh7CJ5Aa6AlAssr8EOu+dzVYWMBVjoVyxhCDo7kmyVWPjQ==","signatures":[{"sig":"MEUCIQD63JWapJhZ3Uq3cuOJIdnEsvdZDwSX0E2n+tvXX7W2ngIgDCc8aJ1sM8F7B45UG7txB99kPqHKKdkmM71IeTuFRPc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12134229},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ade5d306338ffda4bffa1a73883d80c103566c7a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.776_1783234409753_0.07022146322250356","host":"s3://npm-registry-packages-npm-production"}},"0.1.777":{"name":"ugly-app","version":"0.1.777","_id":"ugly-app@0.1.777","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"076d0ca33480c393e353728fb15655577b1646d4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.777.tgz","fileCount":2717,"integrity":"sha512-6PG9Rty3lB0mjGKTQ1TD3OCZ18keKzByS5cH5VIW7yUpucVuktCyCYqr/cc77xafY7m+7gnJitXXcEGgYXujXw==","signatures":[{"sig":"MEYCIQCSyFGVgNKN4pwk3Bb0Q+wALnG+v4DxpsxyuLxtWoZingIhAO6vAGgF1aVEPSJs4DP+11+e7XdpIcLAUcpsNOFgf9CK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12136760},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2c71596736667e93d1fe01694df14edfb444496d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.777_1783234874837_0.8737747952479831","host":"s3://npm-registry-packages-npm-production"}},"0.1.778":{"name":"ugly-app","version":"0.1.778","_id":"ugly-app@0.1.778","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9d86b2e9222a9cb6fb281efbe83182ad09a7bf63","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.778.tgz","fileCount":2717,"integrity":"sha512-JdQGl1Hixschy62xu+pV1N5Cbu4J3ZDI4cMO3lax+XuGomRIqnDg+9W4BHHsT0xRtlUmk7ANET/pX9XJ6gybpw==","signatures":[{"sig":"MEYCIQDQ3PPHzgnG/j88eXSIG+zz+QaYrSreLA49dBVPqGw6QQIhAOeYWMmgmNhxMwvRKX7QqvWxrUuLldUQYDtcgDm10kYH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12182399},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2af2dc8890c2b6c43fe288903bf8beaeaa11bb33","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.778_1783263225265_0.6952292401015525","host":"s3://npm-registry-packages-npm-production"}},"0.1.779":{"name":"ugly-app","version":"0.1.779","_id":"ugly-app@0.1.779","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b1196b1c6e675e74989ef54dd379b2e6112978c6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.779.tgz","fileCount":2743,"integrity":"sha512-c6FeiR8hDY8f2Q/4mEAHorLXiHlUpmg7uUznQPgw10zxaQLUIvEuyHVoB/1G2IvpqkHUAaeXLAnj+00zdvMsuA==","signatures":[{"sig":"MEYCIQCNKzwfItKYLI4PRS65zerq5XOYS3ZXNYVPU1+mKTC0GgIhAPmF199FWR44tNm7I25Hf1PqY7x4UepXO/lLyyeePqoh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12626423},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b0b657e72a568a82a1c6c75aed7f63f28cef3eb8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.779_1783266593600_0.2068251058887869","host":"s3://npm-registry-packages-npm-production"}},"0.1.780":{"name":"ugly-app","version":"0.1.780","_id":"ugly-app@0.1.780","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6bb44910ca52acc0e6167ea473f32b5cdb6415de","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.780.tgz","fileCount":2743,"integrity":"sha512-sM1AAI8XCvMi3wyhV7I5+lALZFInt/UYgVuQoEZxFsC+nHMcP4vNa7/nUaglDqkfnfEEC+1nv5AOp7vz1mc++Q==","signatures":[{"sig":"MEUCIQC1mg+9yObb8kOBP30hqE/oaJETftOv+HerozWQYk3etAIgD7C+gQ5hLriCp5qhYVldUpt45NV6C/OxWLNsLyZLpOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12626423},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a9b95400c9a103f7380c0636b8fcaf0779d8c382","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.780_1783266625177_0.12485374508308311","host":"s3://npm-registry-packages-npm-production"}},"0.1.781":{"name":"ugly-app","version":"0.1.781","_id":"ugly-app@0.1.781","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"13a6859ba0a1d76eda5df4144ee5db5f7669000f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.781.tgz","fileCount":2743,"integrity":"sha512-AZHnBiApE9dNWjtwp7NhMlnYplKd8goj+RSAQirRGFgd53INwJFc39OlldHaL2Ekuw3Uwzyn2P7P2b5anOQiCA==","signatures":[{"sig":"MEQCIAK5BnKl13ln+dvM+z+wyhSZ5c4XMYwjEiJ3NjnaAwa/AiA7siHUtoTmrgzrGo1pVzcnhF4Z06U4WGUDQXRsj/M0iw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12627200},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"865a400b0ac225cf6bf67913026ba9fc89b48cad","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.781_1783267164119_0.5977283954251709","host":"s3://npm-registry-packages-npm-production"}},"0.1.782":{"name":"ugly-app","version":"0.1.782","_id":"ugly-app@0.1.782","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"906e431fae60717f69ad4316742b6d0781dddd48","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.782.tgz","fileCount":2743,"integrity":"sha512-CS4PdvhIt+bSijKDYz0M2RzVFTaT81Hzlx4wNIWRYbNAPqIUq+cg3zmdc9+0aYeaPSX6DACDlmiA4xrEv4K6Ug==","signatures":[{"sig":"MEUCIESbh/h/Ny9/vpbwnC656031H/TvCCZxc+iXOpH4Gm8HAiEA6sgsbbsd29fFgVpTiJcXgdOYPZ+QS2ttM1CqWpF/8xs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12643163},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2bc81b0d1744cf589b3e0996454ba87768fc185d","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.782_1783268986295_0.5325532617642292","host":"s3://npm-registry-packages-npm-production"}},"0.1.783":{"name":"ugly-app","version":"0.1.783","_id":"ugly-app@0.1.783","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9ed74fd8fbc9f3131de6208b59e02eb9fc564d9d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.783.tgz","fileCount":2743,"integrity":"sha512-3nqveb8BLTKH8+oq2Nk4Q2j3NTwXOmNqTYfbnuWNVqfuy4jbv/SuWNHNKu/uVMCr0CBrX/Eu21sJBRfIoCnpGg==","signatures":[{"sig":"MEQCIE2ohxDD4hHzkKeq9pL2rR58otABYs95Rn3Ww7s8h22YAiA0K9MWyCGo1c6NzgcBqKnavFBiY6lZZjwF3iOReMrJ5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12668328},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3e7891d2e8a094ec110ad8a1cf006986a79b33a4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.783_1783272259352_0.6618685970169418","host":"s3://npm-registry-packages-npm-production"}},"0.1.784":{"name":"ugly-app","version":"0.1.784","_id":"ugly-app@0.1.784","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"88032b72ea5f9fb1bee775fed11f07b678847057","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.784.tgz","fileCount":2768,"integrity":"sha512-hmQmaW4K0mISnOUlQ9eHaYgjeyPC6A1OAwjQKj1we+RN8RLZWarsVkmh3by75GjSr0Ihojqj1y9TFV8BBNlTOg==","signatures":[{"sig":"MEYCIQCaqc0GnvdJqEHHbUwk4yqIMndpuPROSpCVodPoqu2EzAIhAPhD9JCJN+1wDEx4VLT7ayfcXHTtFQuE0GBDunGHS8VL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12724048},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1490af14855f586daf72503790d21566857958af","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.784_1783287952927_0.07590141722788246","host":"s3://npm-registry-packages-npm-production"}},"0.1.785":{"name":"ugly-app","version":"0.1.785","_id":"ugly-app@0.1.785","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1237a6e125801541a7af34094661321d37117fc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.785.tgz","fileCount":2768,"integrity":"sha512-lNSTU3g2ekglzC4kp5ytjFMv4YfQZQSMjfAnv+W/05fPvbamxQdYUMMcEotPaWAMprhf2wK/zYJWdBFec83VAw==","signatures":[{"sig":"MEYCIQCoGhhdv61ufG98sQnVHkDZiW7g4lEhLThZKeKIAEn1pwIhAJjDZ/Vq9Tlxwd/KyGtks5xSDGB5dQvdUtypJFPcNke+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12725117},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e26b1eed4eccca66802441e31c0030f289000cb0","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.785_1783288748915_0.4786265731837731","host":"s3://npm-registry-packages-npm-production"}},"0.1.786":{"name":"ugly-app","version":"0.1.786","_id":"ugly-app@0.1.786","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5e1c74564c3d57268e50bb191180d2cff7917a7c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.786.tgz","fileCount":2768,"integrity":"sha512-yVUXqQDVdNsFEWCVt4w+UljVpoHaDBOMXBmr5FbHwlI56lYuSgfv44BBybtJI1phODp7k2qsaXxyZFO5b0vlqg==","signatures":[{"sig":"MEQCICxnM5WZowk5UHunYwASBoz5NJlqbFynXvAAgBKOpvq+AiAaSYeP7NYCU7zJ9qubMMytOqqE1phhvdC+FLBoD+UERQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12726670},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2a09cd316646735e46443bc63b62888ce4b0720e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.786_1783289434576_0.5105179763888137","host":"s3://npm-registry-packages-npm-production"}},"0.1.787":{"name":"ugly-app","version":"0.1.787","_id":"ugly-app@0.1.787","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"575ab90b776461db7ff9fedc123b2df68020f573","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.787.tgz","fileCount":2768,"integrity":"sha512-NEOgS8pE/pei2+flrteLANkYZ42D0CvJsKt27I10OYSVGhRlEEhrZGZIIdB+K8n5hz10Fg7w+aZCAaGd3oNupg==","signatures":[{"sig":"MEQCICoJMKiS7erUsvyCtnsvWwecWzG31swISvdnAN2C9hoNAiB0Hr0uHITL1QTWZK2WGeiX/sKnPFnAiTvimIw8dLsxrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12751623},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6df98752df9f75388716f40c93b2540057e41e12","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.787_1783292459955_0.5688833835574023","host":"s3://npm-registry-packages-npm-production"}},"0.1.788":{"name":"ugly-app","version":"0.1.788","_id":"ugly-app@0.1.788","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"927a12d9f32f4e53655dda93dda83a7c1f30fa00","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.788.tgz","fileCount":2768,"integrity":"sha512-+GgCCmBu2FW0qx9jk2vHsXOggzZyVwFvUjE8sp0mR/xz/5cCv/SPGgtum5/i4eXSmEyJVZTCBj2SRq8t2GUD+Q==","signatures":[{"sig":"MEUCIFWPVAVpVozmsHk5WS3gtkdEmLbLWMdPVC5J5PLonxaRAiEA2wMa/y/D3y95URezxTohe+ETBrhOCXopVCv1w1vCpT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12753216},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"41e478a5497ec4440bc7a2637c8a5740f9e7942e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.788_1783299913370_0.8352847811769357","host":"s3://npm-registry-packages-npm-production"}},"0.1.789":{"name":"ugly-app","version":"0.1.789","_id":"ugly-app@0.1.789","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"87550929d3c0dbfde253ad6598b530541340171b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.789.tgz","fileCount":2768,"integrity":"sha512-D0vUDXQkUj2S6e/BiFX8HGAGQE7gYJ/OtAfMv4Q50yeGPJEN7zAt/JzwtB6Fu3Ee8k+gOh7T12ihAxF6Dqwlcw==","signatures":[{"sig":"MEUCIHD9SmABqaNc9vejV0DxATgmk57d9YLketq4vqAblVi0AiEAvP02fxah/kTH255XSqG7WjHvlZMaMcR+eV3NBPVJ6nc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12753173},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f86740987b3162946c4ee30d0b0924dc5d7d3f3f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.789_1783309778685_0.3120237177482095","host":"s3://npm-registry-packages-npm-production"}},"0.1.790":{"name":"ugly-app","version":"0.1.790","_id":"ugly-app@0.1.790","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"39e77c5d1aca6d6d065664fe39aafb4fb88b5455","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.790.tgz","fileCount":2768,"integrity":"sha512-KVj86t+nEZpoZvpyPvBv0WUuyemGzDhps4u9MUchYn/vX/airxPReT09H67J31986CJUiaxNFRKZZIAF2YeC1A==","signatures":[{"sig":"MEUCIFVf+mLT5y8l1VSa0WMoSqgCFRpiMYDbnAsAjh4AmZDVAiEAqs64TIdwxkzF0I9PiH4QzWVowxeMU/u7jy8eQ2mxz5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12753251},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3fc708b2d983e9efcda0e62f0a8fbf2ccf03a4c1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.790_1783313672738_0.29322242665129417","host":"s3://npm-registry-packages-npm-production"}},"0.1.791":{"name":"ugly-app","version":"0.1.791","_id":"ugly-app@0.1.791","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"83b756568a7e832164f93efff6b4600c49d2c97d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.791.tgz","fileCount":2768,"integrity":"sha512-i/mLJxHLSF3TtImU2Kj+BoE9+fIMCiczvt5cxezyV8kUcUfNWNCKBRkwem9OPO7pkC5wfXJZSFgWRpY/GeEK+g==","signatures":[{"sig":"MEQCIAqlHEBTPwv8idYUxE7PI29O9INqguiduT129aker0zGAiB7ELoUmZjXKcixm6KnsdB6xNaeqI8hvuDpsVOIz+RMsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12753475},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7fc013ea3ff32b7dda489635e54eae21cc344922","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.791_1783319036833_0.043395284610434626","host":"s3://npm-registry-packages-npm-production"}},"0.1.792":{"name":"ugly-app","version":"0.1.792","_id":"ugly-app@0.1.792","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"27a6b86b80c9a57abef388cbf77b3b1ec8626d4b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.792.tgz","fileCount":2769,"integrity":"sha512-zWycAgR4GbafiGhZWPzO9qUrlU4ImObIyIIpgz/uYVC3u0TOLnTT3rOBDZPFlAN50oglwvYagF9EFFh3I361oA==","signatures":[{"sig":"MEYCIQC1HlD4OEr3zKf8PPLNvt5gH3bbttA2Ih/Dq5KUyKMr0wIhAIjvXcC2FCB8izFlVNNKTS0EWsqxwsgTAr+Gtn982/VH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12757501},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"87628effd45c42fae3138408b9a35c5d082d2232","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.792_1783322505092_0.10870559406280167","host":"s3://npm-registry-packages-npm-production"}},"0.1.793":{"name":"ugly-app","version":"0.1.793","_id":"ugly-app@0.1.793","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cb69198df26373c0b154ca7dc63c1c6202e02ce5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.793.tgz","fileCount":2769,"integrity":"sha512-cbzzDlct0ZlMbdQAiIUh5SOP7ds6SIuTewsMuWBA19xqjZlaRACWLU183CHRkz2rybuh7ZAC+xZU91C+f4mnFQ==","signatures":[{"sig":"MEUCIC8ieY7LFzX1p40RJh3R/LEUvap4eWAMofz5HAkhLsphAiEA4x6FNO8EnacvbmaDrOPdAIAcv0iNhUsX4ZdE045mjtI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12758550},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"16f56a5df7b3172901890c445c350d5400db7ad6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.793_1783353867464_0.8830285393790549","host":"s3://npm-registry-packages-npm-production"}},"0.1.794":{"name":"ugly-app","version":"0.1.794","_id":"ugly-app@0.1.794","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a5d8ed046e87413c540801e8ef7acb46281a0e76","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.794.tgz","fileCount":2775,"integrity":"sha512-MYt0LD1GXJISJA5XdQH7nsdhsDRWWTMUToAnMWSyNizYIYi1QKA9z7Q/6eU3fgGm/mSmFC/U6csjjUfOviDwXw==","signatures":[{"sig":"MEQCIAgwNhCYYTMmphakfVr2tjqY5RHnG0Xs2fLC09LkVhyYAiBODys0NzABQ4peAYaj9f5PUbmeMNOK7dpWYApoclxn7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12807810},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e05909b8749e6b3b5a8a25ac96b04664c10d7ae6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.794_1783356818309_0.22258414985854658","host":"s3://npm-registry-packages-npm-production"}},"0.1.795":{"name":"ugly-app","version":"0.1.795","_id":"ugly-app@0.1.795","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f5a1b5946a63cc90ed0c29c38a115586faea167c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.795.tgz","fileCount":2780,"integrity":"sha512-9NqIPnn+k3ReiDoYZZ8nVybW7wS7WNHEPQSufXV9fIx/EZB9KFVTnfBbXpiQJ9Zbb5oTSJ2zqCl+2onipb0Udg==","signatures":[{"sig":"MEUCIAy3AFJNGMWMhTTM6vZ0oKWUGFtgvKJNrM6xNWTprrVNAiEAwP5nw25AymI0Fm+7uQYg8qM1bfQZNYOFZbWXXXtSAZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12821987},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"64fa49d9c2892923b7638ea36fd09e201127bad8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.795_1783362203170_0.9893624118863082","host":"s3://npm-registry-packages-npm-production"}},"0.1.796":{"name":"ugly-app","version":"0.1.796","_id":"ugly-app@0.1.796","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"297b0637db702fcab63b78653829c75a98de3cfd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.796.tgz","fileCount":2780,"integrity":"sha512-Ie+688ZDl38mKh/id89k6Dh0CkDsZQYdxr0XaTrM6rFOLImXUBlqvTiextP55Su7xdmjuUCrpVgpuVsLxDT1tA==","signatures":[{"sig":"MEYCIQD6bw3/MvMIFqYSgbWVIC0LF9EK+lVJ/Nx0SB2JUZk1VwIhAMlUX9F2avRfl6arFvo1y0WDBKfngPEtepn3ctbml50T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12825999},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cf4c351c2733eafd587190de192374205960fe58","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.796_1783363471929_0.4020808741235835","host":"s3://npm-registry-packages-npm-production"}},"0.1.797":{"name":"ugly-app","version":"0.1.797","_id":"ugly-app@0.1.797","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0c2fee33994456efa1021490aa9092227bb26234","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.797.tgz","fileCount":2786,"integrity":"sha512-/J5VD0IwzQQSrjDcxGMBcXqGWKt7pVGhHW3dlAVrODSrw8DKVoTGTxvPAf2K6oDQinu1bsxDo2Tilig/rrFPuA==","signatures":[{"sig":"MEYCIQCzaauqn3j/8lM8jjPuqbOV1ioPd4jTU6vgk1N1nSFYYgIhAK/iUh7SbCEJ9mbSfGF7mUP0etFdBJwFcjwvg6Pphk85","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12832869},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d0a15cbbfcd8b7160793a2f1fbd4f5153201b846","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.797_1783364305238_0.7571058285086929","host":"s3://npm-registry-packages-npm-production"}},"0.1.798":{"name":"ugly-app","version":"0.1.798","_id":"ugly-app@0.1.798","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0110a35a855b1b0c76aae56de0108fe908a07a29","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.798.tgz","fileCount":2786,"integrity":"sha512-FHeCfjh0/Vj64682rElPeNVWzQeI/yuTQNOdGTDxgVzrqaocIfn8k5tho55pHi6SEd6lRmMe2xrV9wbuqenXHw==","signatures":[{"sig":"MEQCIGua6kz0gn+i98pkrwYQVDQRH+X9b6AbDHShMo6E02+VAiBRzieoeSaKIIohK6YeddsMrX+Jp671qnHumDSq5IiJ5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12835247},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fe46d2d328386f882dd6ffb01c744e2ff9b33ef2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.798_1783364756993_0.22890372232575995","host":"s3://npm-registry-packages-npm-production"}},"0.1.799":{"name":"ugly-app","version":"0.1.799","_id":"ugly-app@0.1.799","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c431e86a745659fda7e995cf7ad41dd0e3510707","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.799.tgz","fileCount":2807,"integrity":"sha512-3lVuHSYLYpbV1UaR45rV9Tg4redoxpucjuZAdjBq20Wymxavp6w1K97vyQEAk+qbJGB2JIorbD4s9SU7/P8UZA==","signatures":[{"sig":"MEQCICB1Rf7c/QAg8VTHTOtMyoZZhCgQJ/QV1FXglY3pVB+ZAiAP8SsBQ7vEjBXI0oUbYYwKl6g97mPf/VWkRQNfQMN9/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12927753},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3831eefc9355b33d52fa0fd52a0d0cd1bf8a5b82","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.799_1783367661939_0.3989757852569924","host":"s3://npm-registry-packages-npm-production"}},"0.1.800":{"name":"ugly-app","version":"0.1.800","_id":"ugly-app@0.1.800","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"44cf2d46dc1f5267f44870a84d4dd9d5afe75942","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.800.tgz","fileCount":2813,"integrity":"sha512-Xy86VpS2UcBoyiT+Kj+gGnPLcfq6X4/HsosnIwf6HyDoRv/BPhAFfTM/0wQ3bvsonoKfQBqWVjLMgL1g5G4kzA==","signatures":[{"sig":"MEYCIQCv0dXHqasJ8BPqsvlVL7NGYOHJDiydzJKYu1v6okfWeQIhAKUCe/BLGNZcoZG2NlxwOnOh44b4X3dcsJiOhzKmrdkO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12935042},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1d3911292db8e14f143e9915c0edaf579bbca6c6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.800_1783381163107_0.49836440177783037","host":"s3://npm-registry-packages-npm-production"}},"0.1.801":{"name":"ugly-app","version":"0.1.801","_id":"ugly-app@0.1.801","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2968309890cdadadd4415b48f144034dac23fd0c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.801.tgz","fileCount":2813,"integrity":"sha512-DvZy9qFygdm6SGDMcCrnwnldcV1/c0ROD81+08vR4GrZJ0WOdC4YXkEXfWq+FAGjAQIC2ZYTYQ5rM1GFMBQe1A==","signatures":[{"sig":"MEQCIDIp/NqSZro4xvHPuqyF2fJrhfqQ6YUlDF6uayX4nix/AiBC8PO0lihfdydLaZg15D8M7A+rvuiXaxNPvrv0jNkJnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12939879},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8e6b5aa750ae6056097c7ef1ea9466a4409765df","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.801_1783382410691_0.9005087343474407","host":"s3://npm-registry-packages-npm-production"}},"0.1.802":{"name":"ugly-app","version":"0.1.802","_id":"ugly-app@0.1.802","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5361c8b125dd34ffb254467d61d901f8a52d4975","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.802.tgz","fileCount":2813,"integrity":"sha512-jW7tC4HfA+clkt1d4B/8Zo9sDtppJs/ZljX0zLAejBrI31abw19ioocjGj+JP/wFL1EVb6fYI4N+gh3uyHLsMw==","signatures":[{"sig":"MEUCIBGqoya8/VuKaye22mSEp/237QGWnvJ47B6K/EWatgLyAiEAqagw0f8JssHAgobWaJLQLlYsbdK6h1B30luHPy2EfPI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12940074},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7e784064eeb21775c3a5882776c0a0de304994f9","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.802_1783383407340_0.42080379451684746","host":"s3://npm-registry-packages-npm-production"}},"0.1.803":{"name":"ugly-app","version":"0.1.803","_id":"ugly-app@0.1.803","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"af4e0b93f53ccbbd1da64c1b525717d72cc2b0f3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.803.tgz","fileCount":2813,"integrity":"sha512-JhSkof6GE7B69w718UoKJDc6dh98tFxBqg6ZOhvCRib6BEtrvxThbsUf/7EdxiYl5PR03Hht9fIpwc7AyvHriQ==","signatures":[{"sig":"MEQCIF5IDH87FokaPMLgN1ZaLQMcDdlk4/TXV8PbLT+Z7bnaAiBsRhRgMUPoE0ukS9TI2whTz/trzvLj9v5uYdVqKnRLRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12944858},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a2088e38cbae09155cd7e99e96752c0d3ba7d7ad","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.803_1783402545419_0.4509942197358747","host":"s3://npm-registry-packages-npm-production"}},"0.1.804":{"name":"ugly-app","version":"0.1.804","_id":"ugly-app@0.1.804","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"65873e2afd4b498da78b3bdcd8ad72f27402316b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.804.tgz","fileCount":2823,"integrity":"sha512-9WOLsqi7ftaFNR8k2uE/b2rD2sJ8fL68bJRNDUGGYiUuBD1+RmC2Kj2W+VKEbFJkjSqNf4YqRxrlCubleZixFg==","signatures":[{"sig":"MEQCICaAZixj+FN6bpuEGQYvrV7ZLcN5Y95+3qaISOY6zy+1AiBCQx8XQJEknLMJjB91fQh7x6io7nb3qGfXI0lakwVWOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12969860},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4f2f6f7ae516ec28aea797d1a2cb5aa45cee5046","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.804_1783406531147_0.16971177413223137","host":"s3://npm-registry-packages-npm-production"}},"0.1.805":{"name":"ugly-app","version":"0.1.805","_id":"ugly-app@0.1.805","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"060c222606a93c827c2440ea4955ba7185595ecc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.805.tgz","fileCount":2824,"integrity":"sha512-UfnWgTgVZcrqwEkKni1hFt3WfloPzVfp1m8Gt5lkNCmTlTArLfWpJc6UcyyrNAWXlYcIorwZHJpD6nAz5AYw/A==","signatures":[{"sig":"MEYCIQDCgS5fgPjGAFFFBeuEf3445fsxmsbRPEV+C0HwLCPDagIhAPCzkQFwYMSri4pWCHgyzMmRi7WyTUVAbeiWzYtuO/Ca","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12974000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"88602379c8d82c78afc3006797c591a769cf53f1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.805_1783448778926_0.7566725528086407","host":"s3://npm-registry-packages-npm-production"}},"0.1.806":{"name":"ugly-app","version":"0.1.806","_id":"ugly-app@0.1.806","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2d9ca829bc4a71f533fa41273db1e2b901e3f0cd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.806.tgz","fileCount":2824,"integrity":"sha512-UbYcAbtnPVx6PGxDAJD90SEDzmDaadNJB15+GtKDZbTfx9B3bxAbM0exYN2rw+PeOHNxlyBCC6gsPGIO79xqIw==","signatures":[{"sig":"MEUCIQCCH/NZ5+R4bQfGSpotSWlMh7nFIzJIqLkvCuTmIjoiewIgfxKNnOsBEfQIVE4GtQHopXoGD2dZpscGuI7SDU6c+lk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12977612},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"deadaf6f3fcc94bdb516b0c57d9adc2f588a20bc","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.806_1783454251593_0.32249023277695965","host":"s3://npm-registry-packages-npm-production"}},"0.1.807":{"name":"ugly-app","version":"0.1.807","_id":"ugly-app@0.1.807","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d5a19af23719f870b506ecc58c0a937aab53799a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.807.tgz","fileCount":2824,"integrity":"sha512-pID9euqEpePabscXwxYETKuG5MP8G9I6OheZ31kLs8d39YL38PNet3T3DT7t2aSfqyezIUfDhOqr2bOd0702wg==","signatures":[{"sig":"MEUCIQDyWhsWhT1j9ojOOcK/xMAzZzLupi9SL1IF4C8nhVSHZAIgX7CJRVeCt2CCN1LHF78gbwhjtHohwGOcFU31wjzDwZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12981286},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"89a81c584599f39d1ceec39cd58f47c5b2f344ee","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.807_1783463411284_0.41222021525494656","host":"s3://npm-registry-packages-npm-production"}},"0.1.808":{"name":"ugly-app","version":"0.1.808","_id":"ugly-app@0.1.808","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c835fb4c0b8ff9ae2118dbbcf23e79b423b5bfc1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.808.tgz","fileCount":2824,"integrity":"sha512-F7VrDYZkno0/v87Im8wjarqS1hHyi1FuzPSkCPmovdQBtpYyLtY8sfaZSruio1N90HHx7/u4QqfvsaOxuhOMEA==","signatures":[{"sig":"MEYCIQD6JojdkbIpC9+umy+JYZMtTAe5mvAOfkMUM0rE9oOz+gIhAP9mY7BvvKO769SCKCjOeJruGd+V6V/3PCD/x4dkBc5B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12983096},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8dd805e0ab60b1fcfcbe74f8c8110172736ecda5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.808_1783468024991_0.7526791287227299","host":"s3://npm-registry-packages-npm-production"}},"0.1.809":{"name":"ugly-app","version":"0.1.809","_id":"ugly-app@0.1.809","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"48eebb1e2c3e4c654bdc682bcf05f83e84432104","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.809.tgz","fileCount":2824,"integrity":"sha512-I+yXd43lk6SW5VrtwTL8Nbn5xQVxlxzbasjTlnLkza0c+VoaDeYoMbJt+RrGTpOCKnSBkJ/iKYe0QmfttxINiQ==","signatures":[{"sig":"MEYCIQCtY7ji1GlTs9EPksHK+6n/wOuJgY27qoCTZDaD6VJRiwIhAP2sIwSqaRt9hwPNnHPSFzu931CIO1NcmZ1O1iV55OX5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12987114},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3e0d03129bece304c29053c3158c2f0b428bd997","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.809_1783468967501_0.213004969069434","host":"s3://npm-registry-packages-npm-production"}},"0.1.810":{"name":"ugly-app","version":"0.1.810","_id":"ugly-app@0.1.810","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"36ebf86b04a971ca2d01de67cd771525cd57b1f8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.810.tgz","fileCount":2824,"integrity":"sha512-mvKXuU5U6hWyE09jPXoNHN0LmVuxKMNVW093u6BR/qx3JEhFFTgoWQqTKhJGTqyrABlPthx+0pNu8BEbRTN6/Q==","signatures":[{"sig":"MEYCIQDWfpcNH3/0tFu9BB4ehKaCLbOsgNaI5jkbUQpVyIBNpwIhAM0WzU3aMt5swDU8MabaOXBkoYMXrF5EVEYyqHxbwWuM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13000248},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0ed09aad84100bb0e9010b84ad80a77e8c35a41b","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.810_1783562045972_0.5608621472007633","host":"s3://npm-registry-packages-npm-production"}},"0.1.811":{"name":"ugly-app","version":"0.1.811","_id":"ugly-app@0.1.811","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1befc0bfbd718fd075847cb4cbf23d7c3f44d9a5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.811.tgz","fileCount":2824,"integrity":"sha512-BG8dZ+wGcwEnh6bfDMnTiIUrmkahUAMZ4NGeF0ROJKh4P4tN4TVWwc43tlPm82X3HtS+PdlJyoZzQHvqjeJneA==","signatures":[{"sig":"MEUCIQC2kO5uCc71e0rlhi5+LTB/aKs7vKYq9x9zwDRab/ZfWwIgRdn6ROLjYMrqNd02EwZ8eCBPVdIjh6r5z0nT1dF5rHA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13009404},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"70adb6c23d5c9469329953ed64496eee3497c9b7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.811_1783568486290_0.29692462294968003","host":"s3://npm-registry-packages-npm-production"}},"0.1.812":{"name":"ugly-app","version":"0.1.812","_id":"ugly-app@0.1.812","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"af4f4e42df8be6423415737492645122e7aedf1d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.812.tgz","fileCount":2829,"integrity":"sha512-W9DvVOU7GTDXdWi/sQzaTm86CXfwhCUVl6s9IWPz+RsBQ35NdZy7iAFI4ovaVUF18a8I+OmY3mRsrEJj9eHpow==","signatures":[{"sig":"MEUCIGzm2VjO/V8TyW83E0irJwnZR0nqziy40IWVGHLr0/jrAiEA+RersfvsTiEKCNUZ6n5rI4EKkn/rT/1Icqb2lWWfI0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13100154},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e4ea0204e2603c0e17c10392c8b68bd8e870b0a3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.2","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.16.0","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.812_1783634808423_0.805808931951399","host":"s3://npm-registry-packages-npm-production"}},"0.1.813":{"name":"ugly-app","version":"0.1.813","_id":"ugly-app@0.1.813","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c9c180036dcb819d5c0dad70bf171ec71ebac181","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.813.tgz","fileCount":2829,"integrity":"sha512-Z1JUANn5kFHAe5swAr80tJHEpXmjsEzAk6uMnM616W7VTGvqvE4A0wq3Q8igxoLf2m+moKjpwdZeWoaWXQidHQ==","signatures":[{"sig":"MEQCID+9f6/7IgFDta6PsUhDRw6xW+jTODxJWWwybeSJI5pRAiAz8rZJ0Oh0F40uXgQmOr+PDrDZu0IoVBTHlYz/vLBxuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13102047},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"87e5e972a130c111c0e6d407c7e565304fc8d19f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.813_1783650367074_0.48606670060956647","host":"s3://npm-registry-packages-npm-production"}},"0.1.814":{"name":"ugly-app","version":"0.1.814","_id":"ugly-app@0.1.814","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"46662086b9d013c4f14d2f73cb03fdae3ccf7448","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.814.tgz","fileCount":2829,"integrity":"sha512-S2I5IKnaZp4QgMlrF0/RoYBbSOn2OPpYveXJ8tacD0iekOYIXNlSyh2N9YL652bGFUaSWxfEpm8zt6aaBkIw3g==","signatures":[{"sig":"MEUCIQDXMYcgSXUq82DGxalOwphXeGiU78n7d4MylZfJ5C/8YwIgUPiszp5e5MEHPHzQdsy76IZpC/0STOruJBApmNEj1yw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13102047},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"75b830212a8080c4204e957a5338d2ed99799c2f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.814_1783651170930_0.6583739279631291","host":"s3://npm-registry-packages-npm-production"}},"0.1.815":{"name":"ugly-app","version":"0.1.815","_id":"ugly-app@0.1.815","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c8368507d949ad7a6f414d0dc7ff5131fbd15392","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.815.tgz","fileCount":2829,"integrity":"sha512-kRN6GyTLn0qWaqLVqdJYVxEU2PLWO0ZwnDj7pQ6biFsBMUkNT6topaZ2oSU93XM5is91oTtnmjkZB80qVPXlkA==","signatures":[{"sig":"MEUCIDU9TuTDF+8Nn4a6/+dwNssnIh1xGalpt+GPnxDLE1y4AiEAg0vs8pgTYJQfSYDoS9fFvQPaW/vapFgHMxe/wdmQ6tM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13102751},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1fdc30d23aee27d0df0f73f3b8b77fe21d88c214","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.815_1783651410543_0.14859204039920448","host":"s3://npm-registry-packages-npm-production"}},"0.1.816":{"name":"ugly-app","version":"0.1.816","_id":"ugly-app@0.1.816","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"502f5b8381b7d5de40daf063391122d47e6272cc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.816.tgz","fileCount":2851,"integrity":"sha512-SwJP5iZiNG1xpiFDhip91ALD8I412+DWB/pjtCdMtEFo1HmrIrmgfrOg/sPwhtrPZKza3+UNFHJxURyksnCJJw==","signatures":[{"sig":"MEYCIQCP+355vp6HHvmzpnrAE74zMfqbzfba2WgdwTAw+ayOygIhAMzgSKl6O+dpFJ8eYN3+amCdh/j4Xj5giQ5Xuxy1lomg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13243117},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fb01d1c75a612fd6789f6d5f265bf0025bc7beca","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.816_1783655833295_0.502792943858049","host":"s3://npm-registry-packages-npm-production"}},"0.1.817":{"name":"ugly-app","version":"0.1.817","_id":"ugly-app@0.1.817","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ee18f89aa3635ca605471e260b0d444ef40771c1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.817.tgz","fileCount":2851,"integrity":"sha512-wcIttiy9T7OEIbk4Bb8lNJIE+tS7nuwfHo9DqFARCcA77csgWzi7yivTBi8BH1bGGLFlDJNg9pIW2ZsVdHLyng==","signatures":[{"sig":"MEUCIFEweOLy0yT8L/QvI/d1BYLapjYn0dGd+KMeaugezSoKAiEAmHZOhZt3hhIQc7eRIzfQTFgbXoXC/UVyIRPoeZcm6OU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13245616},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d124790e816a01bacdd5aebdc04c101f04dd7b8e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.817_1783656333112_0.4370536280696802","host":"s3://npm-registry-packages-npm-production"}},"0.1.818":{"name":"ugly-app","version":"0.1.818","_id":"ugly-app@0.1.818","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"70580ad2f3d60b71409924efcd143e2295913d6e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.818.tgz","fileCount":2851,"integrity":"sha512-R2oJrA+Sl1neBnOIGvRyOA7hm2BQ+bORpTS1zVN1YL3fvM9hStuYTwWHXgzcp1PseEdoTTtNBLfK/39aaUPP6A==","signatures":[{"sig":"MEUCIAM/hq987AyoUuCvUJmBkfwBNgI2yPyYD7BF7JjCBPh8AiEApZCeYfoZzOQStcMnqTQxzpq57yK2Ah9MkSbHkFJHByk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13249694},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4e18918aea841a5f3d7502d9f66af7a7b58acaf2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.818_1783657163396_0.19007998563436068","host":"s3://npm-registry-packages-npm-production"}},"0.1.819":{"name":"ugly-app","version":"0.1.819","_id":"ugly-app@0.1.819","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2700105a394e0519fe9fa1ef9859688b3a31dfcd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.819.tgz","fileCount":2852,"integrity":"sha512-TKXrYpwZSiog2/H/WNYUxyNFsNMaoeeS2llHxUTy5Kw5PcLXPsLfJd6mSIzYewxNoLsqGdzFpPfi61SxXHYv7w==","signatures":[{"sig":"MEUCIQD5XIwk59iUAi+J13gulfIR1vCmp4QEy/OWhHJMlkzXeQIgENQa18uORUR0wiIPQ9CwG3kmFH717abZ3sMp6HzBqi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13267695},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8adbfbbe4cb2ec743de60c6a0cc3dcb4c0e8d1e7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.819_1783657930157_0.30729464607251256","host":"s3://npm-registry-packages-npm-production"}},"0.1.820":{"name":"ugly-app","version":"0.1.820","_id":"ugly-app@0.1.820","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"94bafe97f777cd38e575f4ef321e0f6d74454f8f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.820.tgz","fileCount":2852,"integrity":"sha512-Bq0/CVKkymkxvF5uLLP7Ui0qGJoT7DtZPjglnKR9H/sQjm938QDITuO4huIfYXRmRgLK2O8z7wcS7vfEmYt8jg==","signatures":[{"sig":"MEQCIBodlgL+ObxRQjZUBSX2lBxQbgXh1KooUyLNZJM7Dol1AiBbHISVRt6r5iTrlSLQBTFraYskHhcJH1RAFsMVYNwz7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13270013},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f9ea0ca32dd2584ac993200d315607a206a1f361","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.820_1783661309797_0.9197999837110893","host":"s3://npm-registry-packages-npm-production"}},"0.1.821":{"name":"ugly-app","version":"0.1.821","_id":"ugly-app@0.1.821","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"10e5b62f3bb32c4e435b320d2adc790e38ab2213","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.821.tgz","fileCount":2853,"integrity":"sha512-S70YpH2oHn3CVygG2+UHlDC/SHlE7WKiZTe4ivzwR15vhSqUReOsFsVy1gmObMmKTGvXYTnX5FZoK7Y1E2kRSQ==","signatures":[{"sig":"MEUCIQCKP+qcP5BA6Ine9M6r0kgmi1YV6LaZbxA478f3eyd3pQIgRLCtk8EgrIYb69pAdxIPOukhGIK6uYaCUQaeTuNhPtI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13291134},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"62c172ba6e7d6731292e8b958c8bf310e824b67a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.821_1783664099520_0.8606399591562093","host":"s3://npm-registry-packages-npm-production"}},"0.1.822":{"name":"ugly-app","version":"0.1.822","_id":"ugly-app@0.1.822","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7814487f2978bad2f8edc2abb610dcb869d0d2ef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.822.tgz","fileCount":2853,"integrity":"sha512-avUNWAhie2XvbARXHPXVIz7W43cjzYOtW8yeSixLpfD7x0e7xN9BNykSOfPfKXFwkHyUYSsU6xSDpa6S4OCg0g==","signatures":[{"sig":"MEUCIFOO7C1vrdgloQPlRgWmhuzbzZDQZOZqX8O8oSLnN9VBAiEAk+GO5iS1Xo6dbSvDfHT7cvWj911WswYxmqSHXxLGgGM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13301724},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.822_1783709641979_0.7290484921900746","host":"s3://npm-registry-packages-npm-production"}},"0.1.823":{"name":"ugly-app","version":"0.1.823","_id":"ugly-app@0.1.823","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"92f6530b51221bad35562c8de6753dd3fe0b08d7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.823.tgz","fileCount":2894,"integrity":"sha512-oNN+u0moo+aL8Gfe0eC1kvP9T9lRLCw9E8gR0Xg7P385J7Ak5NJOwg/LjLDnckdt1H/f9AlO/dUPZ0d5FB0mWA==","signatures":[{"sig":"MEUCIEHAw388vVospjXggG3thX2s5O8HOWjb55YqUtLUTH0tAiEAmeFYxcikUXY9Rdxy7gyZy0ClItmnldeRx2OVWCJpsNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13423386},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","better-sqlite3":"^12.11.1","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.823_1783721876295_0.501837108897822","host":"s3://npm-registry-packages-npm-production"}},"0.1.824":{"name":"ugly-app","version":"0.1.824","_id":"ugly-app@0.1.824","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"46ac2f84f573f25708dd58e5581e51e3bd5069ae","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.824.tgz","fileCount":2901,"integrity":"sha512-L8HFWPts0ibh61V8Y9aOm/eOji7lVFigJg+tHWIG/GRH3gq5IVsJPfUckJHAdzc0oAZpBCm/JjdYvV9W0239DQ==","signatures":[{"sig":"MEUCIQDdKQSWsUFRJMO6h1u9pUm4xLCbZYLYWNIS+rhM9KEHSwIgIVOge7kR4SX97PEfiW+0c+4+JXHdqQqSz7C+/eL0f94=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13482327},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5858622d85c0ee95d3b41daaee05b16ea26a28de","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","better-sqlite3":"^12.11.1","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.824_1783723078282_0.9638955872899846","host":"s3://npm-registry-packages-npm-production"}},"0.1.825":{"name":"ugly-app","version":"0.1.825","_id":"ugly-app@0.1.825","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"56554070b1d835cc4b8a479568ca5d5006a025b1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.825.tgz","fileCount":2913,"integrity":"sha512-ZhBTHeNqkKSmuBwZci5rcXHR5ECDdFNOdap23q52TrccopeEoKVY8jq9MJmi5309P1++s4ag7oY6guz9qFRVmA==","signatures":[{"sig":"MEQCIF4Y8AiUhDqnEQbx44CxNnkMwNbxanodM7xqxdgIN+KhAiAQiiGz5JADCIai+S+hKomur4UiB+fHSzEPdvdj6P8bXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13515869},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","better-sqlite3":"^12.11.1","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.825_1783724727900_0.9823769212458104","host":"s3://npm-registry-packages-npm-production"}},"0.1.826":{"name":"ugly-app","version":"0.1.826","_id":"ugly-app@0.1.826","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"08ed1f8c3a8a40e86286e1d469d348ae11bffede","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.826.tgz","fileCount":2913,"integrity":"sha512-Vgzb7gEPVogUX9wi/wyt9ZgwyAU2p81IKeXeFLsMF2yiE0PdAZqTxj66ckLzA+TK9QsZ9Zi1TSaVoXN+7WQSCA==","signatures":[{"sig":"MEQCIBTWIyGom57ANHtcr6VSd1k7XAZ+griKaci7NIDzXdiEAiBaHVZqe8MScJVAolYbytP2Uu2n4tIW6OvsUFtydaWkKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13523404},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"aaed32f1d4ad1e3fe442079a05c19b3406fa8397","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.826_1783740852416_0.5908895861067716","host":"s3://npm-registry-packages-npm-production"}},"0.1.827":{"name":"ugly-app","version":"0.1.827","_id":"ugly-app@0.1.827","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c8a8b8fce078d9570a7316b4d11d665e98a630b1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.827.tgz","fileCount":2913,"integrity":"sha512-ewnVDhutWwjx/z87RmzbzIIONqO9JCYqCuW+ZKC9XcMw2Zledc9zyTjymSNH82U+EfQAiolwzf083jyJaiPYtQ==","signatures":[{"sig":"MEQCIFAV9MhMqzfF7hZeEZ16CpQqDlqtQzZK4ZQv7ema2UY1AiBnamYF85oYkJXcsYzaaOpJMIArUDK4aw74npsXMq0HQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13526766},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"545eafc7a96bb2128e70c2cbb9c629b201ef74f5","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.827_1783778617975_0.30872568069835027","host":"s3://npm-registry-packages-npm-production"}},"0.1.828":{"name":"ugly-app","version":"0.1.828","_id":"ugly-app@0.1.828","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6a7cb6cc7e6bd08f2eaeada965bb40b561fe1645","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.828.tgz","fileCount":2913,"integrity":"sha512-09Xe8PgHt0Klfbd1SP6/axwALBQFizbYbWag/ha0P89AYxSZRq+40TL6UngE6rUZUrsDxH789DRlu/l9Sg8xFQ==","signatures":[{"sig":"MEUCIA1io4Pf2RNftMnepxMlOUPsHvzo5TkD/7QfKneiO2LpAiEAmPJVOzyVOL8u1Wbf/tzIQqwRyddUdqpBvo3TaPN59o4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13527781},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e068fb1fc38f7410f0c432ad4ffcbb339eac0063","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.828_1783778860246_0.2002370234701749","host":"s3://npm-registry-packages-npm-production"}},"0.1.829":{"name":"ugly-app","version":"0.1.829","_id":"ugly-app@0.1.829","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"16c8b397338a7aa5797f67ea1dbc57f679ee411d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.829.tgz","fileCount":2913,"integrity":"sha512-tsnk2FYkvZKKMPMta1+zqRpLM8yM8HuUGGYrI0ioTyhEzop43PryyhKDDP2Oe2e8llSTXREaYOu02dujI9kYRg==","signatures":[{"sig":"MEYCIQD8OhG2SsPlvHWFnPXcPOMhPhMf+mqZKQWYC1Z2ShWBBgIhAKPS0wJyDA2l4t6gJ4UzHAQFzf9Rn/0Ntmoq8gHzXDS+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13529939},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2e34e4cb56a4450aae8df771219c04dfdab98799","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.829_1783779124767_0.25980318651692746","host":"s3://npm-registry-packages-npm-production"}},"0.1.830":{"name":"ugly-app","version":"0.1.830","_id":"ugly-app@0.1.830","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6ce39abb75c6ee15001f94c2d846e5288359747c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.830.tgz","fileCount":2913,"integrity":"sha512-yk2AoR9sUb7CqFubkVOQJuguPIhKv3feDoAgwYBodfZtt6mjPIwYSCD1nnNyDbAESAEkuBcTEiyCSzC+2C+5/g==","signatures":[{"sig":"MEYCIQDiy/R8sP5ID2njhg7ToY4SNFA82a118gucGSDSL/XfdAIhAKFxfQGbDEf3/vWfj9zUFxb4LxRbIlwECjxQ27J7APk1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13534627},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"126bbe7da25a8c1afaa74835e55e860e22d8e30a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.830_1783782323732_0.677604771025524","host":"s3://npm-registry-packages-npm-production"}},"0.1.831":{"name":"ugly-app","version":"0.1.831","_id":"ugly-app@0.1.831","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7e1f4e4a46ecd3016a19bf2e350789a11d88cdfd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.831.tgz","fileCount":2913,"integrity":"sha512-bbekdmYks8QIgUqmt14u5Os7gymhNCguSlEXSf52HJY0sXbSD0CM9bv9gKegMuxE5bIcufTe5IBqMZd5AjVgZg==","signatures":[{"sig":"MEQCIEXXwr0U8PKqHNo/ldIgpUmAWBaKVCvxeEd+11IYAg1aAiBubYcv2khcVwGj8b/0dcLr1v0MZQ3uIk7HibYlmLWd4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13543117},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c7dc1eaaff879b1ccb4d2ab8277dcaa33bfe2a57","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.831_1783789226968_0.1291204520050968","host":"s3://npm-registry-packages-npm-production"}},"0.1.832":{"name":"ugly-app","version":"0.1.832","_id":"ugly-app@0.1.832","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b76ce244945317ba8aab36522e37b36638f660f6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.832.tgz","fileCount":2913,"integrity":"sha512-F7RQeisCRtZtX0I+BejJKBktDUtW7IfsIe1p6dvc8BWg7Kg/BsFBRbGeIxNL203/Fx6b19gV/LmjHzsTb3KQag==","signatures":[{"sig":"MEUCIQDR4h/sj8MlLHxTAUmSH3nF9HbvvBr/EcqIZK0L6luIUgIgXC2KwCX2N6/XA2ouRDEb0lmNxwLteu9BLQUm06QzXHg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13543909},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4696f78fb74fa9555628717383a387f88106fc97","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.832_1783789575867_0.4880730414947534","host":"s3://npm-registry-packages-npm-production"}},"0.1.833":{"name":"ugly-app","version":"0.1.833","_id":"ugly-app@0.1.833","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"336314cd222bbdf184c31cc848654b9ac843ae63","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.833.tgz","fileCount":2984,"integrity":"sha512-KrBskPuzGk7xsxR5VfCRvDBoFbZqtFYMwa6QjlQjfcn0bXhpF5RCT/dvd+ZL5826wKbahZxiso5IBB6QKamBgA==","signatures":[{"sig":"MEYCIQDN4PUTyKJTywaQMZAaLL6logrmdw66GciSQIuMa1KKugIhAOIt9RdZ3qTpoL4oaiwoZBjuh2sbmIRBQovT5CrvOEx5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13900958},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"60745e96b6b9d93dc32cff5086208c2872d1e4d4","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.833_1783816067313_0.012769576471116428","host":"s3://npm-registry-packages-npm-production"}},"0.1.834":{"name":"ugly-app","version":"0.1.834","_id":"ugly-app@0.1.834","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"128986c3595a29017b939c3bea7783531f62c4a5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.834.tgz","fileCount":2984,"integrity":"sha512-h3G2eLOwiCZ+Q6XHC/nopkrNdtCkKStgwVkDIwEkIpdF3YmU77RvERG1Em20S1Ve7ISd7lNQm/1DDmcxzrNMQQ==","signatures":[{"sig":"MEUCIDqYbQ3/ui10tBuBKMVW5/QeEmQppolBf537zN8G4/SuAiEAhRbO5AbSwDb226GDNhyZm9rOydV8ehv+WN0phsb3T+w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13904417},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"081b2b291609dbc4b16a7f7d7fe2b9ca360c25d6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.834_1783826734854_0.2501332857802603","host":"s3://npm-registry-packages-npm-production"}},"0.1.835":{"name":"ugly-app","version":"0.1.835","_id":"ugly-app@0.1.835","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"37f3c496173b417f770ba1796aee20ded1308fe3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.835.tgz","fileCount":2984,"integrity":"sha512-ivl56rKMiLYe60rNVYqBnDWDXf0IxOQwPCx+LiyYKF7LO8QzxQtWvux37apW6ixN54Ss7yEatUWrFPe/pfSTlQ==","signatures":[{"sig":"MEYCIQCowKR1fCPbCDHGq5qWfM4yyijspZuCIincgZtOKYFmLAIhAJBMDI96fqob4S84YOiVYZHXar66qsBK0xY7nv+Wvq88","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13905607},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2cafd595cf405873c3e26283c93b172d9411e0d3","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.835_1783827263024_0.11443801468156356","host":"s3://npm-registry-packages-npm-production"}},"0.1.836":{"name":"ugly-app","version":"0.1.836","_id":"ugly-app@0.1.836","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f87418b04254e0d9df3ac5b4bffb2375a08004dc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.836.tgz","fileCount":2984,"integrity":"sha512-nvjA2mZOHpIjkRzw5R7uKjRocq0TvlrLEWBVC+nElDqpz05YKnn8Vovo9a2pWaYcfr4PH5JiFSdy94fk7YuhUg==","signatures":[{"sig":"MEUCIHpE+5NHyrX8xPnGGLRb7hkdji24vcKlMLB8jm8x56IaAiEA1iD35Bmg+sozYdgrewJssG2HojyvuhzzjgS6dGTsYlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13907699},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e053041af0e36565d08e7873cc3278ef54365de2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.836_1783827880146_0.380284708105993","host":"s3://npm-registry-packages-npm-production"}},"0.1.837":{"name":"ugly-app","version":"0.1.837","_id":"ugly-app@0.1.837","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"83cedf258fb9aa1afc4cd9bd7d3b1f8bdf50c9cd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.837.tgz","fileCount":2984,"integrity":"sha512-PpDoXWAUzi6VR2KVMZjaiHkGzEDtMcpp3DNWV7kxEVfPRKd9dOgExPpLnq3Q3S6zuZTQKa9K+cj52yobvW7tfA==","signatures":[{"sig":"MEUCIQCCuElufMSzGO9XXeREG/2QvzsjFOQVIjvV4YMxZQLu0AIgcfCaGWdCML+qRUpo0YqRW6/cVn8hw7uJ09BtH5FfmYY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13904764},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3f66d90fd8ca5874ed9d8b8c87c90942515fcd54","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.837_1783833794715_0.9774560455440338","host":"s3://npm-registry-packages-npm-production"}},"0.1.838":{"name":"ugly-app","version":"0.1.838","_id":"ugly-app@0.1.838","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ee07e4a0adafd34c43091b99a60efb4b034b82f1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.838.tgz","fileCount":2984,"integrity":"sha512-8Ulhaxk7KDcOSo9+cyi6vRMV6p1Ct7oyF3+f1+Iy8VcOHIeYJwNq4b+pHbw0mR8ZdVQNW3VUPSvK57rgE3yLwg==","signatures":[{"sig":"MEUCIHulSOC6nGj8eOb8VMeoFAyU0qQr2dCcWJc30YsOQ3laAiEAupBKJ47+P5iC/py9uwakahVgjSuqRVdJLD0DVAw1aPc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13905524},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2cc3ea1eae184a0b83b4c341d3c97096766d617c","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.838_1783837498868_0.2208372023553251","host":"s3://npm-registry-packages-npm-production"}},"0.1.839":{"name":"ugly-app","version":"0.1.839","_id":"ugly-app@0.1.839","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9f28ca14fc86aade593017e619725ec3deebe13b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.839.tgz","fileCount":2984,"integrity":"sha512-B49Lo0+j0AKtQ4lDPizd9vlALcbhKcrvME6eM8YHCfPiJAGtUp51mMVM/2Z6esUxJlPz+FDpmiz9nmv+snRIDQ==","signatures":[{"sig":"MEYCIQDyeNvZlzx6XxbZ4pCcr3idO0X+v7nKPNpWBTkrlttQTQIhAN9OkLGcS0x+3Y5aiWU6ocD90uFS1UmdRQVOblVPZQKC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13908996},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bb3fd80c1d570d6f79b46b8aa0c355f8e1b11773","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.839_1783837983943_0.23497301284241923","host":"s3://npm-registry-packages-npm-production"}},"0.1.840":{"name":"ugly-app","version":"0.1.840","_id":"ugly-app@0.1.840","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3c6e88ac5a092e0573d21c66ab8f9aea7689d695","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.840.tgz","fileCount":2984,"integrity":"sha512-bGFKOUb/FPuRZiPIpTLBLKVk+/bRGPiqbstaLBBYWaS6bvZIo8b5uiE4DaiTW8hI8j+eMi7fPu9hJQins8esSA==","signatures":[{"sig":"MEUCIEnGDxihfDPXBBMwf66qX0FLb1JNAiCzR83xpeqPABx2AiEAvsgPDodqZ+1t08kUtbP75nhEUOthoCS6gOG/8P7hnVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13918616},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0ba4e82e6c4bf15f4db047903c98640fcc73f478","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.840_1783838513148_0.8895850138120731","host":"s3://npm-registry-packages-npm-production"}},"0.1.841":{"name":"ugly-app","version":"0.1.841","_id":"ugly-app@0.1.841","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"50a8340a3518555200a4bc9fa443abf5ae8c7d79","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.841.tgz","fileCount":2984,"integrity":"sha512-aC4JKrkClgNeCugL4FdBMlw75XC7Fz5TMm8Y1g0pdIosDOWEqsSn3D3JIlmqA4z4CP4CxEcFaBHNPRey117JgQ==","signatures":[{"sig":"MEUCIQDT7jfF5lc3TDt0X/dZY9NTlQ/gl7zmy8etnISau7c1wgIgKLBlE9GyJRcZJVnjZJdqlti/v2xtV2Po6lJ0CiEEvFU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13920035},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5f9ea06d5c7bbb966d0004db5384a2ea5b6209c6","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.841_1783839716641_0.6342065177398855","host":"s3://npm-registry-packages-npm-production"}},"0.1.842":{"name":"ugly-app","version":"0.1.842","_id":"ugly-app@0.1.842","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a5034027de09ef5fb446ee2a3fd09ad2e805f975","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.842.tgz","fileCount":2984,"integrity":"sha512-CTmcgefNAHZNxADHU5MZrLGCePtfOizyr4sd0HMKSvrEqlJTIy11G/i4dxBFpaeg4hK9vc/MG0qTh5BIIz71tg==","signatures":[{"sig":"MEQCIDLabneKLFvt9h+2Uxkx7uT9NnQ7lmdKOPX0sWaaIXtPAiAyZ1rEubskjodMwCUZLW38PD2hR+TMgqz/r6PLcArvcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13924195},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c3b153306771f7208502ef614c48df4f8ff2cbee","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.842_1783840443467_0.3887279804180517","host":"s3://npm-registry-packages-npm-production"}},"0.1.843":{"name":"ugly-app","version":"0.1.843","_id":"ugly-app@0.1.843","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b5e8eb4237732a5fb1d78612b61037bc9662331e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.843.tgz","fileCount":2994,"integrity":"sha512-vSbgYlNYgSQ0CepbvU34/tNUEo1Ir/v4uWgdWN+noNwn4ZMkjOPJ/mwD0HvxZrHyctYHCmkPgftzVD7WfTiZGQ==","signatures":[{"sig":"MEUCIA7mqHaaWh7lKFlRYRe5e7t6f5CkTBgXtuviu5vmNnATAiEAnFQIz4b3ZqE7+crfnvkpPYsYNFDK3pmQGUbr4G3iMMg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13953184},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"9df10fbc827e42fb0724b679e7891708237f6d29","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.843_1783885239626_0.6931505570943861","host":"s3://npm-registry-packages-npm-production"}},"0.1.844":{"name":"ugly-app","version":"0.1.844","_id":"ugly-app@0.1.844","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"143c3ca31fd5640adfba1bceb12d6bde2b961f33","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.844.tgz","fileCount":3001,"integrity":"sha512-INdsFBGdYWwS8jxQcwkM1LCcdyTWqwWLW2XDubmG97zGZNiQWo/s8R7WzOJc34EsUGpyWDhJl56paBZdhtS5Rg==","signatures":[{"sig":"MEUCIByiR4A+PLrdGRrlItVasdmpqXN81WnoT3A+BSIeNWpvAiEApT50miHJ10zonJmi1YKGmTlYchu+B0SHAsiX9KlxZ9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14010764},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ef54b8909568419429904040675023001d7df416","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.844_1783894049076_0.8014830268021855","host":"s3://npm-registry-packages-npm-production"}},"0.1.845":{"name":"ugly-app","version":"0.1.845","_id":"ugly-app@0.1.845","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"452f4ac11e51a7b736d01db5ef30d6d257846d56","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.845.tgz","fileCount":3001,"integrity":"sha512-EbU5P//9qD7v73DdR2abvM9iJ+5CRDOB1kZUppdDEkxnwOMOxU1DaujkMFnKn0cZ6Fc/T+blLp7jkHdHpghIYA==","signatures":[{"sig":"MEQCIFVh+gyz2nMshYuIWGjPZgXcHu1ks5/WmR1X6lvCkR1vAiBb1TEq8I9VPhm1EM9WhL2f3cZe11Nkoq7RxLEnz7OmBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14012878},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b1e23aafd1495b40f4d0381f9bef7b4d5642cc4e","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.845_1783894367161_0.61585935371258","host":"s3://npm-registry-packages-npm-production"}},"0.1.846":{"name":"ugly-app","version":"0.1.846","_id":"ugly-app@0.1.846","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"395a9d37a82cf4e4ec36462bb8c0375951289963","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.846.tgz","fileCount":3001,"integrity":"sha512-9uctmnnALPFWBUxK3smGV3YQmIPn9Hsn+fA/Dxu90054yACElDU5o0xUdd1MtcKzJLJIS3J/W8mkONcVVb2cIg==","signatures":[{"sig":"MEUCIQD/U3rdPBNoZR500eQnZDYibSrq7ih7YzMGGwlXkS94YwIgGT1PV4Weuy/yK8fKA13ef4NysrYBgGp/WE1jJqU8HhI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14012000},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2ced29df19d7b7d5f6d7da3c4bdab1857e3d8cf2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.846_1783900700409_0.2198130505656788","host":"s3://npm-registry-packages-npm-production"}},"0.1.847":{"name":"ugly-app","version":"0.1.847","_id":"ugly-app@0.1.847","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1357cda590a80d0c4891dbd770c66ccdca31d1cb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.847.tgz","fileCount":3001,"integrity":"sha512-LVgOkFkpB0CHGcL47OhDaBmY1lSuHiOdW9cVT9pej8030/1m4V6EmXYl8X/kVP9set5g8NSdGv4Wh1MEfosfVg==","signatures":[{"sig":"MEYCIQCCASM/26Rcf91OtF4O1w8HZCL6C6jmmDmBeHqVPHiOPwIhAO6vO6CSPYtrdXAdVdfWLVeGf7FrEBQpo4xrewbM/Uec","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14018033},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"35c816dd0182b0b24df8563643b84e7c491947b8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.847_1784005039398_0.8384178264084485","host":"s3://npm-registry-packages-npm-production"}},"0.1.848":{"name":"ugly-app","version":"0.1.848","_id":"ugly-app@0.1.848","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5674669443e131fbd76f62a15404246d385607d7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.848.tgz","fileCount":3031,"integrity":"sha512-dCpzU+SmQA26kWibcapq4p5Z0u81i23IhySfRXYvUjn7CsGKXSa2n2slaA77r/tLKzV4p9EYo/cXSsCjqgrgeQ==","signatures":[{"sig":"MEQCIEC2k+bTxx7ioOB0jn3wc1DmeFUVnedA+ceMDfd1/UA0AiByFNyl9EWLMeJg5DhNAZeHIPQ0x/BS+HZT3GDghFyV6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14054403},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"171f1632c1d10aece6ccdd07fd496f423d6e52e8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.848_1784011685181_0.26118865464562835","host":"s3://npm-registry-packages-npm-production"}},"0.1.849":{"name":"ugly-app","version":"0.1.849","_id":"ugly-app@0.1.849","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"22487ef75d1b8f4c654eeeae963f4976dc519474","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.849.tgz","fileCount":3031,"integrity":"sha512-ixrcH6vA1QNpCVf8xOLbbhduHfLfVcXQgK7YWk2/Rs1ebLudg/rj7641Al/9QpaMxpeAu5txhAtPAng1E7TG3Q==","signatures":[{"sig":"MEYCIQDhXrYbel9inIAkweVgg6I/lgzkHPRyKLEbDmyQn6GRfQIhAI2X7CYw14qmS72YyjU5JeJbiIzQYGZcfhHH1mv7XOBu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14059451},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4c6941191c963d877531153555681390ca3b91d1","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.849_1784042639889_0.2800443421338785","host":"s3://npm-registry-packages-npm-production"}},"0.1.850":{"name":"ugly-app","version":"0.1.850","_id":"ugly-app@0.1.850","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a08fa56224b473f175d7fd6c0e9b2249ded45999","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.850.tgz","fileCount":3031,"integrity":"sha512-HwRqBTSUP5kyj2G0OIwLpNGEcREECQhI7tEkJvuOklFdInUsuwltIYSZwrL7mXmYzSUng4oQAbwtnfqf1f3BjQ==","signatures":[{"sig":"MEUCIEZ8zIGgECyMof/3dbvErOr2PUnKHMl4dYzgD5YbtiiWAiEA3pT9C0NwyFk4NgKcO02HAdEilNoYM4MlJQtkM7KeOpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14062053},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c2eb93d6b3a409ee13f3452f77cb60cfa3700afa","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.850_1784045096102_0.16726242050881912","host":"s3://npm-registry-packages-npm-production"}},"0.1.851":{"name":"ugly-app","version":"0.1.851","_id":"ugly-app@0.1.851","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b78f27a107c636d5ec022c10727ce5b6c1ed00f3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.851.tgz","fileCount":3031,"integrity":"sha512-gQ7DikYhsaaXPG3TzwLWKa+UwsEqUNs+EX2mh90eXfhuseHjGIXgB48ap/j0k8FxxL7KsxxvrtBWwubjLfMbgg==","signatures":[{"sig":"MEYCIQDakYq0fHADQbQXhgf9G328rEqV908377QSJAgFDmKyHAIhALJK7Zd6TAVMDtnmI+MsOXoZATjK397p6cUMRzTfZ/Iz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14063475},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eb7b0b4fa47f8e9ccbc4fbeac227c6dd747268b8","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.851_1784047725971_0.5603304040911499","host":"s3://npm-registry-packages-npm-production"}},"0.1.852":{"name":"ugly-app","version":"0.1.852","_id":"ugly-app@0.1.852","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1a6a0f6eb5fb17148ddf2cff1a71a4f1e207335","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.852.tgz","fileCount":3036,"integrity":"sha512-QBbTCUR2bKcaLhDcMS5glQV7lD2LYdQgjX9I0vIr15hAVQ5AfbO4Gq63NO71cF1nyJ22k8RWo81bMH4M4yLkyg==","signatures":[{"sig":"MEYCIQDXjh2MbERSZdEqqVjzo3ECKz1s6Xu5s9WWZ9AN9CbhTgIhAL9Ou2PrvVQ8Sb0Jdv8xaaai9JAxIxMOgAM+/6+ij3mq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14076440},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"966351ee93700d965177cf4f2bb47ddb452ab931","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.852_1784058500405_0.48704989036169066","host":"s3://npm-registry-packages-npm-production"}},"0.1.853":{"name":"ugly-app","version":"0.1.853","_id":"ugly-app@0.1.853","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"09d055b5a7701cb7d9cd90464b03747dd85357e9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.853.tgz","fileCount":3036,"integrity":"sha512-8b4O2+IzhGengHskkInH7YM7HMG0278hxmtkyIUmv6//oJZcw9vlGmqGRsPD5LphIxh2VQ/dvqCWI0GXzB01tg==","signatures":[{"sig":"MEUCIQCzOg5uidmHa2Qcz+UFwQVcgXlZ7ObdfgFp7iRwB7H3kAIgOgViPsg7B5GXBaBNKj9CXuQruHSAJaw3QTdGMtSHwLg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14079647},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eb1f86d441156c700b11469d62dba16c0b525a16","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.853_1784062736008_0.2620881787800555","host":"s3://npm-registry-packages-npm-production"}},"0.1.854":{"name":"ugly-app","version":"0.1.854","_id":"ugly-app@0.1.854","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"409ff49619faedde538615c304c9972e8151a906","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.854.tgz","fileCount":3036,"integrity":"sha512-v0UdQAB+1yDeMeM5uh+A5yD8G7i32YR0k16mpG/9//+MTXEpsn0ZsRt03EU1QFgEsh0dtfXDqkGsHok2BgIhAA==","signatures":[{"sig":"MEUCIHEqL1lvO3LBmHVbVYWYjxmAlkzI0SD+w9hI5IdppSd/AiEAkQq2bFYeuVghM8sT03u4z3e9csQ6BJmfYeRX+/5YqR4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14083155},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1f1726aafcf8fc303b6dbb85b6cff90bcb3d9393","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.854_1784062988251_0.33679505666045495","host":"s3://npm-registry-packages-npm-production"}},"0.1.855":{"name":"ugly-app","version":"0.1.855","_id":"ugly-app@0.1.855","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cede27de68d5088defd94b97fa77cbcd45065344","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.855.tgz","fileCount":3036,"integrity":"sha512-zwl7QbftqQO4kDdQuKb9zWplp/hnMMH7/BXJ/kF0uVYtV9B1hmxvIsF+T0J7+//JK3MhLJAvgppHnjtgPUb2pQ==","signatures":[{"sig":"MEUCIQCuu0qetCD9yK7BIDDhoR1TW2ZbumdhfYM3WQ+mZiCITQIgKoHAHBIz37vMS2CDmyU+Z5NgfiUCVRuxpAoigS0nGdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14083413},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5d8740b5ffabcc832a162fd4e734e54ad9f36dfe","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.855_1784063069829_0.10017719441129769","host":"s3://npm-registry-packages-npm-production"}},"0.1.856":{"name":"ugly-app","version":"0.1.856","_id":"ugly-app@0.1.856","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"23f012be85e617b7053b6474701bfb6e0802a407","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.856.tgz","fileCount":3038,"integrity":"sha512-gxLi9CfZSqOp6n51au6RiRTEyvTORHAd0LiBY06ijeAT9cbmZbnYbiMJsEyPcp3xWf6qbY/dLxykxvG86qQclA==","signatures":[{"sig":"MEYCIQD634Eug2BppMSyy/v7+1QIXus04MB7vgcXwlfpaZCTiAIhAJh/kJMlnGXhaFDS7X8LITwMpEhu2j5VHeTLuua5Y7jk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14156923},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a84d27d4c73c18df9a0abe6cb40d9d8f164eb263","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.856_1784164994009_0.8158710338300355","host":"s3://npm-registry-packages-npm-production"}},"0.1.857":{"name":"ugly-app","version":"0.1.857","_id":"ugly-app@0.1.857","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"375d496e31b22b2e4f12bd7bffb8d3badea5f5dc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.857.tgz","fileCount":3039,"integrity":"sha512-h7ZE05tsJZgpXfBD1JaA77oL7ay3JwVl86xLRFvhuqZoKZsWO5W9VJhSN3WOGGOoCJBDHdtEPMZ+jJkPxfVMQw==","signatures":[{"sig":"MEQCIB/A55q7pTfhnCXBxPzREAH+r7KiVNyyvUFUW3kG0P34AiAN0xOvcOqOmCkEu2yKz1BhkgJH4Q547x51jasDEgCQEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14173764},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ff051889663ba0450ff15c593b3be523517644df","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.857_1784170013874_0.25230113010223976","host":"s3://npm-registry-packages-npm-production"}},"0.1.858":{"name":"ugly-app","version":"0.1.858","_id":"ugly-app@0.1.858","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"670bbdf5ac388201ff57514884602aacd4dca9a0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.858.tgz","fileCount":3045,"integrity":"sha512-7mGemxKTzFnqS0ARyxdRpxPpV2UQG07y2k3h2ZKHlNHQ5+RX0Bkx/RBs59ZlQp/jWp5lW7aN4b39/Z+8X6v+IA==","signatures":[{"sig":"MEQCIGcj7qLev+IbUsTImi/MGldBhL0wJmKCL9BKEIR98h7fAiBoSrKFNKecPZhgqe/6YlFpmJOshetIEnqUKVU5vhJTsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14191655},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"135fa6ee42c7d7bf0cfe6ecd9eaecb83ee378bdf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.858_1784178560383_0.756361502852992","host":"s3://npm-registry-packages-npm-production"}},"0.1.859":{"name":"ugly-app","version":"0.1.859","_id":"ugly-app@0.1.859","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8fb04b5be721a5c6ecf3f609ee4ae761e3db3ac7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.859.tgz","fileCount":3045,"integrity":"sha512-qMBT+i1YUmbDGFbRyydn1uDhWz/+yHxv9RHX/PXzq4DTB+qbqmyTn0W6JAzxjOIsZZUDeWVJ5Dmg4lWR//ffqg==","signatures":[{"sig":"MEUCIQDCWrx4tbAQzT9j8QGxFLS9NHIxoeYw4/KdJ5W7Ms+zdQIgVnFQWlc8pZkOdCwMHpXrcMJTon4QlxK0kUHS/kZ/tLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14191655},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b2e7ac782cfc82810fb777267a8a3ee5b86356db","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.859_1784179740774_0.8212259816496095","host":"s3://npm-registry-packages-npm-production"}},"0.1.860":{"name":"ugly-app","version":"0.1.860","_id":"ugly-app@0.1.860","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"74c5ff664c0240f9b70e230642f1e9b4b4aa4b37","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.860.tgz","fileCount":3045,"integrity":"sha512-SvYsZ2rZ1mpTeduL3GVmYSkaZiK6PVEGZYfs3u/HVLzAGpoUhFgKpufRTboGqmrwSdIRI36a3XfUWoMar6N3lA==","signatures":[{"sig":"MEYCIQDzIVlj6taHWIuJKKr658WoJBXJ/MPpdlhv07/xVQkS7AIhALXQvxsIjYVE/AbejPLpkalUvVyEQGwt7tIVibu6Gieq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14200255},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a6f50c9247143ad83bc9547d870d0de89b291db2","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.860_1784186378792_0.5551548802528696","host":"s3://npm-registry-packages-npm-production"}},"0.1.861":{"name":"ugly-app","version":"0.1.861","_id":"ugly-app@0.1.861","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a3c32d988509740df8299296856cbb7d65dd9f00","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.861.tgz","fileCount":3060,"integrity":"sha512-MxDSe5F3ofmsEE5VkHVgwWvsYKXb4KfxkmmAvo6SV3CW7AbaGpEooWk+SRevDU4LTWS8/g/BOvSZj3eUql3I9A==","signatures":[{"sig":"MEQCICFmR6MwKkKXj0vsHbC92glvTuPkQBoR39qjox1Gg4IyAiB93v0KIBdK3iMAzhdIEnMhgS3beeJTRCnbd+I3iRt06Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14258057},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"abd9915d4f65360027717fb9d2b6f25d617e4f45","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.861_1784220823046_0.8832465725421634","host":"s3://npm-registry-packages-npm-production"}},"0.1.862":{"name":"ugly-app","version":"0.1.862","_id":"ugly-app@0.1.862","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9ec3293f465675637a5107cab4683b9b4c5214f3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.862.tgz","fileCount":3060,"integrity":"sha512-Je6J+EIGOwPP1JOzTc1G6BV4iuURqH5F4RWFb6Dxul3y+A2Vkkpwi7sTL3GEPar6Svqo7CzSn3hdxSW7gf3XKw==","signatures":[{"sig":"MEUCIDYsvFPq4ZWOfinHlk7AjLcnmsR9OeSQTxaytK1wyL8xAiEAuVblW0llu7H61t4OgjBWI1DfmLWSMn8yvtR2xs3eq5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14261222},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e5add0535ae881e2b4a82df6e86c8b13181d5e42","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.862_1784222016350_0.35487387055592046","host":"s3://npm-registry-packages-npm-production"}},"0.1.863":{"name":"ugly-app","version":"0.1.863","_id":"ugly-app@0.1.863","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b0a6190269f46b480549db48449cd17d02b603d5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.863.tgz","fileCount":3060,"integrity":"sha512-7C0vejI281NJIY1TzOP0WO6c0Qwx0JhiwsXm5i0GN0NSeThuFiMjfZ/MlkOWZ4IEY6mBUyXugbgPhHg4KmwTug==","signatures":[{"sig":"MEYCIQC2BC28u6WzKDK5X+KEiUwHxHBr8xQBldIGR+E9z2uQXAIhALPoStCUCpOek8j3jFwLkQu2ynzrJiZoPNQA8A8ycagN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14271192},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ecf35907397e8cc3ee9682f9725cf53ebeae3cdf","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.863_1784243806305_0.9501570627587268","host":"s3://npm-registry-packages-npm-production"}},"0.1.864":{"name":"ugly-app","version":"0.1.864","_id":"ugly-app@0.1.864","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"403ab9ab23477baa8a2ffdbffd9f8e0b3f7a0e46","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.864.tgz","fileCount":3060,"integrity":"sha512-JEBURlBT0fXjUtgi6gVerqr/h8Xe9+aBGnkvViWWfKIGivJpsIejLQGd3RUY4vU6VWkPR/jkeBFe4aH0KnR8oA==","signatures":[{"sig":"MEYCIQDihdQHAo0aKwAXxieyqScgg8eFEbKFCr3YdkulVZqB0wIhAM6U3jWSGQjJFf3d0ycYZesAWbcwp6lnAyPA7pK2qohk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14272059},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d53feb2a13bd0531acbd8c6154c19dd2a5d6f5e7","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.864_1784252570009_0.7762981159733571","host":"s3://npm-registry-packages-npm-production"}},"0.1.865":{"name":"ugly-app","version":"0.1.865","_id":"ugly-app@0.1.865","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4737ed361a79a40d09ac72b9ab2a5dfc01da6fd2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.865.tgz","fileCount":3060,"integrity":"sha512-+fJ9TtdmJDy12tLxkxGwLASG6U42dWcpkvbAajM2MNXSD1hOtWEU7wQb4BIhZw4ZmdakEk7fjvUdPcrhjp1YzQ==","signatures":[{"sig":"MEYCIQDHc4ZxcrZLqVLYggyx1FEpWFtAv2sIza5mPYdJKu16LQIhAP0ABVDqDJubnGpyS8oT4HpZsKrnhdNNhbQDVD2zx4s7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14272596},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f6d8c42786bd83afe1510cf873436f2b329b06af","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.865_1784254873020_0.3306560849431024","host":"s3://npm-registry-packages-npm-production"}},"0.1.866":{"name":"ugly-app","version":"0.1.866","_id":"ugly-app@0.1.866","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d794906090fbc77868e0ed5c78382806c5a8528a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.866.tgz","fileCount":3060,"integrity":"sha512-3VGny/ne7x7wWRNfS9QZX5Sq1KuD1mQTwgdfspLIHdqxh4SiodnRZguKh0/YENnUth1OD6Zx6bYAE0cYAfbNMA==","signatures":[{"sig":"MEQCIHxX4YRHtZZHb/cfl8hGfKTLJsbv8Kg5VnTdV8mjGuQxAiArQ0B1216jf174uFUDbRn5a8HuW8+2GTj+eIHlwmaJJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14273113},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f6d8c42786bd83afe1510cf873436f2b329b06af","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.866_1784255475836_0.6283836553646476","host":"s3://npm-registry-packages-npm-production"}},"0.1.867":{"name":"ugly-app","version":"0.1.867","_id":"ugly-app@0.1.867","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6427cf9b2c9e0fcadf0139f5bfb13af24273ed8c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.867.tgz","fileCount":3060,"integrity":"sha512-1AdDgf9ExoOrA716Vi+NiihhBmwDg0HxXo2lk1WB1ax0IjFcfPR5NEbs8+8OXsGoGWoeD709pNxNDMXo1U23ww==","signatures":[{"sig":"MEUCIQCwqCzwirFqYFhZsY9L8wcC6jNKWGfxox0sXRjQPUMBQwIgOQuH05FKFGdvmt7ZvEshbJJ/o7PaPBy9FlRdWFPc70M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14273864},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bf97b9a89155a5c7a82c75592f66b55dbf7e900f","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.867_1784256967667_0.5530519978208108","host":"s3://npm-registry-packages-npm-production"}},"0.1.868":{"name":"ugly-app","version":"0.1.868","_id":"ugly-app@0.1.868","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b50c54bb1e4cfb178b2e05c674a2107df830f2e9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.868.tgz","fileCount":3060,"integrity":"sha512-QZFif8LIAcrU+6LZ/PIkBMfXfQ0qF6gGQgvrofVQeXcqqJwJ6LfkZIBHbxdt//ROvh4Lrff7FAqXhBbgQVGoDg==","signatures":[{"sig":"MEUCIQDOfFY4HeBYfFVfmNYopUhv+YX6ZTYW38NUU9QwP4oYeQIgDfZUIQOKe38n3T/8/x3PyHiRRehcdFDnIvsY7E1wGJ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14274816},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2467e36b35d7ef9a67085a2b33d7bba582642193","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.868_1784259811012_0.47080635657345415","host":"s3://npm-registry-packages-npm-production"}},"0.1.869":{"name":"ugly-app","version":"0.1.869","_id":"ugly-app@0.1.869","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4fa455584eb3c28b3793b520f8d01a53ff85ce8a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.869.tgz","fileCount":3060,"integrity":"sha512-SzW+alxTgwwte9anKMcCJx5krBa56c1zwBGe/qLYKpzx7u7iBM9HvLvOZBTJob3ZailiON98cHuyEUTghiocdQ==","signatures":[{"sig":"MEYCIQCizhW3wsFz0Z3mXDjJyurDVX65VvDzIdafH4wVwUGv9QIhAL5O+q1lX4OVMK7+M41Mv477X6Jd4OeIggJtsWNPfmOS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14269477},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"87026dfe287dbb56b39d380c161686d235af05ca","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.869_1784260473542_0.27331941556131345","host":"s3://npm-registry-packages-npm-production"}},"0.1.870":{"name":"ugly-app","version":"0.1.870","_id":"ugly-app@0.1.870","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4f53da9d17d0432a6f8b050fe278169e856a2862","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.870.tgz","fileCount":3067,"integrity":"sha512-ww/g4HmLWH8UmGX7WtGgeeTaOuzpjypahHZtXBsT9T7Ngc8aCbkKwgEioOgyZN3Hj4TZWN/U7p6vkrvGFUA33w==","signatures":[{"sig":"MEUCIQCl8etAl33Q6EeeDP/zkvQ6Hr8f5Ygb/85az+fUiBtVMwIgYYIoruPNmz+dlD84NhRbgcdoYEd317Q21KPHkO30iAw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14382548},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f42eb83be7847014848af244b116d995ad0cfffb","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.870_1784308972825_0.1879157383214758","host":"s3://npm-registry-packages-npm-production"}},"0.1.871":{"name":"ugly-app","version":"0.1.871","_id":"ugly-app@0.1.871","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e249801b215aba9033ed8045add88861e7ab843c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.871.tgz","fileCount":3067,"integrity":"sha512-wihnnw54jL5nFyJM7YWfdP21qYEUMLtpqhe1THyEGf4pPnvbcpmviwZA5S/ROyn8tM8YXj/cnjnTQOQuO9/9qQ==","signatures":[{"sig":"MEUCIC1PThX7airH1IuuGsly76KN66vbnLnxfeGAnJCcf4c0AiEAnHjoifJDQH4ZP+y5UnLU8guczt2IinlJD7pQ8SXkdj8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14384203},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"70435c235b53a0f99df453fcb9e2b51a92ed5487","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.871_1784309464115_0.1237599700845875","host":"s3://npm-registry-packages-npm-production"}},"0.1.872":{"name":"ugly-app","version":"0.1.872","_id":"ugly-app@0.1.872","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"08e0b5b6a3f6f51d8fcbf4bbea2c5d1a39657f5a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.872.tgz","fileCount":3067,"integrity":"sha512-QDZwZwPorZm8pDZFvIizZ21OmTRiokHwLH7QLHNcFpZ8oKM7OKNte+FQsJzBbVCwNeY5mRjmQBjQbOFbolsWwg==","signatures":[{"sig":"MEYCIQDiW+BXHPEaO+w42ipueFbXczu2E0QwOYH+MEIevQr4DwIhAN6wer1IHA0dWX13zrUQiBIhbCIonCwTkI6ZETIV++bb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14386767},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7fc5e345fe97fa987beaecb4ffc9bbc895724d50","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.872_1784310615850_0.35370276426829705","host":"s3://npm-registry-packages-npm-production"}},"0.1.873":{"name":"ugly-app","version":"0.1.873","_id":"ugly-app@0.1.873","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9eccbc2831d9ac127c5413d5cf119133a0ba917c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.873.tgz","fileCount":3096,"integrity":"sha512-0zLV1heND7mA33QGrZ1VRO64i5pWPI8YPsxhVdrwUnmWS7AuqKu5+AnopOup/2DhdAarhphpovyZBuBo6g8ULw==","signatures":[{"sig":"MEUCIDQuXSND7/cKEPAcvnr2WGJCtwwyoCshfJ4GujIXzdphAiEApwgYroSykUTq2IfLihsUDKgJ5TkvdjbY7YXnLQB/MKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14536295},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7259de9d92b5d137246bf6d98ac7e43c13b7d265","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.873_1784319342553_0.18213913404325655","host":"s3://npm-registry-packages-npm-production"}},"0.1.874":{"name":"ugly-app","version":"0.1.874","_id":"ugly-app@0.1.874","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"aa71254c6c80bb35c3ac9bf4eb4c79cb90a33717","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.874.tgz","fileCount":3096,"integrity":"sha512-RK/dxaJxsnzdDkMnAjFYUPI7EPRxYDJWYKauen6JNp10wZlVC8TPN3fURcNYlBQ53pa+JcEjYjQsDZSDb5xpxw==","signatures":[{"sig":"MEQCIBn4p7UmSdg4q8wRrx38SV7/fasxzXZpFi+ad4NlCVz0AiAZllyo+/Jtg8ec6fztS9PsI3rhQWuU1Vgk6y5IfW2Z8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14545596},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7448a3f596f92bddddcfdb56e73cd6fcdf8c1d24","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.874_1784343332568_0.9019327650949591","host":"s3://npm-registry-packages-npm-production"}},"0.1.875":{"name":"ugly-app","version":"0.1.875","_id":"ugly-app@0.1.875","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6fafff827d9d21f1c64c5808d31e50f77834014b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.875.tgz","fileCount":3106,"integrity":"sha512-XIxPsL3L2ysbA2+iu13N/OTG/pFzPle20zAReavMpv7MVnBV5NJCiSneN/UPBkLz5yhGN/RVrXODrp8yMT46nQ==","signatures":[{"sig":"MEQCIAyjkIRiDUQmXVan2HvBx8vO8JEL5WzgxvZdODqnvXQHAiAx8RObbFQ6r9UsUKgWmx+JlNSfkoG/8evsdSQ8EC+P2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14581111},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"030859a2ca8588160ab3e7dca3554f1018c05856","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.875_1784351420583_0.8298477584193029","host":"s3://npm-registry-packages-npm-production"}},"0.1.876":{"name":"ugly-app","version":"0.1.876","_id":"ugly-app@0.1.876","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c1a25e04c441f1097f56b5a903fc50712ea5d6f8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.876.tgz","fileCount":3111,"integrity":"sha512-oMdYj403R/5bj0URBXFWu96BiXEiFSUc8o9OHEUBmXW3teaVc4aOJvK2CIA7ChYYbaIsggPKpPqy4OXK6xLekQ==","signatures":[{"sig":"MEUCID5BxcHHkx86Efd186e+kg3+JAeCklVYDKLyTkucgu5WAiEAl8orBOj7y6rp35yzgSbTEy9xWtLopFIZi9MEI1JUXpk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14622909},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"030859a2ca8588160ab3e7dca3554f1018c05856","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.876_1784353503977_0.21981317023760694","host":"s3://npm-registry-packages-npm-production"}},"0.1.877":{"name":"ugly-app","version":"0.1.877","_id":"ugly-app@0.1.877","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f9ae6f92ecb7e866278894658f364bcbd3f3315e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.877.tgz","fileCount":3111,"integrity":"sha512-avRj49Gx+aEBGxS6p3VSRNuVHfTr9zVmY5XDEaybIZq3xyqT7agm2wP5CtTlpnhIEV83e0qiIJDiSU4OZDkmEA==","signatures":[{"sig":"MEQCIGj7cRT1eBAobspBx4ljZa3FtH/LDThLgX/dlmiMydh5AiBGNWOaRc+eskHUCBojECsOc+uxVCsojK/YxQPipcvCYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14626201},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2e880ab0b84c65c4e23157eb74b05305e7d4022a","scripts":{"logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.877_1784355369521_0.4886036790727575","host":"s3://npm-registry-packages-npm-production"}},"0.1.878":{"name":"ugly-app","version":"0.1.878","_id":"ugly-app@0.1.878","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e9e6046508f0fa16195eb6421030893da92800ea","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.878.tgz","fileCount":3116,"integrity":"sha512-M8mgNpixW1ofAww71IjddUuF8S27W1MAgky1Jsp6OL5wMLHES6ejEVaiHa8h6y8qszkZKSdVU2NgGCFrjiKMjQ==","signatures":[{"sig":"MEQCIEucy6Mu7mHcGCoLZLXBNIC8lvXCF1HVAc1ZhauqAiBBAiAVXPZX4vqbGlMWJ87RpQq850nd7GRzoGxAZJw96K3GLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14658920},"main":"./dist/server/index.js","type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"91c6836ba06770560846c3845493733f2a67c70d","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.878_1784396285058_0.8394668825737621","host":"s3://npm-registry-packages-npm-production"}},"0.1.879":{"name":"ugly-app","version":"0.1.879","_id":"ugly-app@0.1.879","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f17743584b768c05002caaed14c88648a13312ef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.879.tgz","fileCount":3127,"integrity":"sha512-SA58+z6vLf99wOhL5vC7vTQu6e8t0t/4Sg04urwZQXC7EOCWUC2mEIXvgmN8Fg23hFiOnRuIO8piH95bEpFerg==","signatures":[{"sig":"MEUCIHFHWwYJvT6JSaru78Z4gcABrw8osfX2g209PqgMuVSZAiEAvlYt2+zlF8yj5VSOR/wlPTalSm+rFjYq1sjW5URFcGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14686686},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7e1256f0a16831e729ac1801d7596763d9360292","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.879_1784406588793_0.820488586608886","host":"s3://npm-registry-packages-npm-production"}},"0.1.880":{"name":"ugly-app","version":"0.1.880","_id":"ugly-app@0.1.880","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c03abc64a615647d46782e5ab23e4301837b07d2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.880.tgz","fileCount":3138,"integrity":"sha512-3Ol/QN/wwOhMbU3fcgskudQNgiQRVS/MEAyzl+aRA+8RUNcIGz50kCBoW73U0vLpMr+39bW+k9YExOB2myrwIA==","signatures":[{"sig":"MEQCIBTLutV2Gh+dGo05mTWgjDuqScwlpzIT046Zb7/enAl6AiB+c2h8NPu/yeTXo605uDb8qcRHycryI0Sb0WMtrvx8Kg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14733631},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"55d180f08686b47a835c60077a2805c6a9e0ff84","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.880_1784410492572_0.6425383810773555","host":"s3://npm-registry-packages-npm-production"}},"0.1.881":{"name":"ugly-app","version":"0.1.881","_id":"ugly-app@0.1.881","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6beb6e5c70363cc3fc93a2837be9121bf6a7cb1f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.881.tgz","fileCount":3138,"integrity":"sha512-+Jh+L6tJYmYf9+UeZwdYODWtcywY3ejPRXPKUStNexJRRBkzdK3E+JxPCwtAZIPvoswBv5DKjDE/6FPNADN5YA==","signatures":[{"sig":"MEUCIQDTSHuHbt+QlO+vlRnB+pKjpQxqnHtNbO8TNakKjJ+E5gIgHQImWYKugZKnwSMMJ0gnSJhVykC7ReStOu6cXYj4jY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14735133},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"df3d4e9b1093b0fee044aff627f1ec57f755a6aa","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.881_1784410821661_0.03893408050524627","host":"s3://npm-registry-packages-npm-production"}},"0.1.882":{"name":"ugly-app","version":"0.1.882","_id":"ugly-app@0.1.882","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"37f6ecd4b1dd542e863493b45b67d5aa895c6c76","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.882.tgz","fileCount":3138,"integrity":"sha512-icJYbvPjaGJ/P7yNKn4sanBk0cM1uyXaY9jH2Q0oHWOZF3jNFYHBSOoSFedkkyiOukA6BSlVGB29z2ZQYsp+qw==","signatures":[{"sig":"MEUCIE6XeLFKEB3arkk0PURKqtT01dul7HFiulzTe0tPr3lQAiEAhq8yG57wdSlTzlYMGO9/ah6zPpffrTs2hro1lkeRSfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14741706},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cbb615258563fa5c50bf534e395f5a9889a49901","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.882_1784411889208_0.9891378404459679","host":"s3://npm-registry-packages-npm-production"}},"0.1.883":{"name":"ugly-app","version":"0.1.883","_id":"ugly-app@0.1.883","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"202d9feaa2f2e3b9f302198091cf43f36e7c7f4d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.883.tgz","fileCount":3138,"integrity":"sha512-OmrZaj0zg2e8j8NZVhKG/q3twvdRC2DKCDaVbgu43y+NrCbzTgQKp9ueFCT9OBpwff0lIdNe1yFxJFgpvZ8PvQ==","signatures":[{"sig":"MEYCIQCtl7w8wnA8JeD7mrBLBrfAST765jlFJJ1rCbImAHnuDgIhAL4x66ZeGZvy78L8/NlemOHdxyFtXStMesrWt/6PVxQh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14745490},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7b8713e20810b34e3bf71889d18a616af0da5b55","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.883_1784412054682_0.07842637305831679","host":"s3://npm-registry-packages-npm-production"}},"0.1.884":{"name":"ugly-app","version":"0.1.884","_id":"ugly-app@0.1.884","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8703895ac124fe07909717eaaef5326b11170935","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.884.tgz","fileCount":3143,"integrity":"sha512-luAHwH4J1Tdp8mliJU/nW/X2E0Gorcv4P1q/rB9LwKrF8NjS9MuK9FFh87JER86FQm/gaGcb8kw1QyktCCU9Iw==","signatures":[{"sig":"MEUCIFDMaFlfPBdHVejiFBQU9TCEuGwLFH98rw9YA+EfcnLSAiEArhWmaP1q3aSisRLfY9TgZPN2Pfgs1GmLcnKFZKLLaLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14774274},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7526c623b27414e2d603629ab3da7d2368eedbf9","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.884_1784418244988_0.9960354278420882","host":"s3://npm-registry-packages-npm-production"}},"0.1.885":{"name":"ugly-app","version":"0.1.885","_id":"ugly-app@0.1.885","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"caf0bdf269d3125fab8d0ab7e615d31baacd67b8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.885.tgz","fileCount":3143,"integrity":"sha512-uX59AGHTiV1sR9tkJc/vPGrlcGTMizsihDGyngRql8qNldQq86Rjm2J9AmanSHQPHX3KfJMu8Qk0mQqhFs28GA==","signatures":[{"sig":"MEYCIQCkQins9uPDqO3zwh9A1kVIcDSAYhxSGMCMFXcLX1vy9AIhAIucVuESoxXFvzJqqJI5l2F47u5mX7e48PU+NpgP39q8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14776430},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d2173da1b5e5e690ae11b11e4ffd244de4984056","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.885_1784450159968_0.48717109956283133","host":"s3://npm-registry-packages-npm-production"}},"0.1.886":{"name":"ugly-app","version":"0.1.886","_id":"ugly-app@0.1.886","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0c2cf4664d3f0b8aaf8e5e4f9b1b92450ab54134","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.886.tgz","fileCount":3143,"integrity":"sha512-ltNnbFV+4yrw2J9/5ygrvwYHYx8OBuloqkFfAMF/IqlD5kA0UDJNIRex61xhoKwlNh+Io/FHEGpmHoyQefUqSg==","signatures":[{"sig":"MEYCIQDNjhMTgjVjjCSFmBxg17xl8ZcsffvEdQj77NTkitrnRQIhAJge9aAkkxug/VLKyAqoZt0WGwkce2XyEyXnHvngVeRL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14778086},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5adf340bd8aa93a5999b59600d4c6555e37d06fb","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.886_1784487113514_0.2620378855901735","host":"s3://npm-registry-packages-npm-production"}},"0.1.887":{"name":"ugly-app","version":"0.1.887","_id":"ugly-app@0.1.887","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e6f0ae1dc302bce5cfb0dbb96069f6533a49ae73","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.887.tgz","fileCount":3143,"integrity":"sha512-CorFn9lKp9ujVyCTjQgepCmrz5APfbTyCiaUUCieYKk81QjbKH/YW2y+uzky7I7I7sBLKGNNEG0vRLbTDoG7sQ==","signatures":[{"sig":"MEQCIB47xTUnZUYoqsHY0HpgV+SvDD/3TxRI6revG7puQtYjAiBnWxXJImDLogfa7Kopt8gtfzTDCLfKxCBgAqLF/z3ecQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14778319},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e1094cd4236fb7dd49720c2b99037c32b261b9dd","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.887_1784488127862_0.8362334908220459","host":"s3://npm-registry-packages-npm-production"}},"0.1.888":{"name":"ugly-app","version":"0.1.888","_id":"ugly-app@0.1.888","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fb9bd8658ed3fa51ffa87c577978cdad9cacf0f9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.888.tgz","fileCount":3143,"integrity":"sha512-kz/AP/TCcF9cR6ayWxt10vxDsTGlGBiUmVLolTHbTChG2xwCTVisioHQ1KYvV3i+sNXH1uuZc0wz7+EM8ZUA5w==","signatures":[{"sig":"MEUCIFFNU+cYsT7Twxy7Ddm7CXl/lbCtwC8/pjHyXHwiYmmdAiEAg1VT9iNfoyna45imglfIKws/n6QpAWu8S1iv9Ig3tkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14791321},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"966188e0cebe26dfa2277892bc8a214bb7439405","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.888_1784491844844_0.13395736217777876","host":"s3://npm-registry-packages-npm-production"}},"0.1.889":{"name":"ugly-app","version":"0.1.889","_id":"ugly-app@0.1.889","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"276e8bf01777854893a58028d2e32c6ee57e6b1d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.889.tgz","fileCount":3143,"integrity":"sha512-vS/KT23tSfjl0VV2x8ilOuDzLLh1y8ouywJNidLYzGBYz3xw34xBBD5N1VFT9cEL+Gd5oaXYVdG7rYLUWoNoEw==","signatures":[{"sig":"MEUCIQDrNU23MGXapu1eC01J8BkU5QOnmZChamOm8bpl+98ZZwIgNDFiiLg4oYhSvm7HoGingkRdPP6rd08cALf3oYkB27E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14794642},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0f63449a0dfc21e5e6471d99c88b8592f672896e","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.889_1784493920524_0.24245793255924286","host":"s3://npm-registry-packages-npm-production"}},"0.1.890":{"name":"ugly-app","version":"0.1.890","_id":"ugly-app@0.1.890","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"caf3fe18cb641a50fb6ae224500356493775846c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.890.tgz","fileCount":3143,"integrity":"sha512-abkN+g6jwcYIjeM94T2g/xPCWgwyyTOoDXA1pWmkN1WnW0VvG2hJRckLPUhmZee5Ju5tD3QnnZIJXTDTKzyrmA==","signatures":[{"sig":"MEUCIQC0gTiiYbvnAS1LvdbVTJkCWTHMAxIpmJTh5XKVvafO7AIgTIMtWW2jgj9EJcxes7Qdb1bKDDe7Cb1V11aMpMcTx7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14812902},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1d84b56cca5274fdce38680bee281e8391f33305","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.890_1784526922848_0.09423130330906537","host":"s3://npm-registry-packages-npm-production"}},"0.1.891":{"name":"ugly-app","version":"0.1.891","_id":"ugly-app@0.1.891","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"62009ecbec343f0747e3fdbcc86fb8f8ee060e79","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.891.tgz","fileCount":3143,"integrity":"sha512-vFKTgFbWmVBrUWX4qwQIwEA/XobjO6ZoIjLRcKOf8H9dUL1qJ/ZLqYu3Ovml/z8+CuPB8xe5ridDtBSjhWL3/Q==","signatures":[{"sig":"MEUCIQDMP4y05ru4J1fViMiLufy0nK//k3ogqxooeniUPm817gIgCvB+bIBnf/xtqDSSO63wNL1uyJ99syo+R1PB7RBrjhw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14813127},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"dd1da12624af075c93d2bf2da0a7efb30b03d34a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.891_1784527689663_0.6960849941210883","host":"s3://npm-registry-packages-npm-production"}},"0.1.892":{"name":"ugly-app","version":"0.1.892","_id":"ugly-app@0.1.892","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5cb435e547183b4044f758bc48a737d8f2254f25","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.892.tgz","fileCount":3149,"integrity":"sha512-XxIBbVmuEY39RDmpepnP4c8qJXtfvMjuy9soyFL+pRB1BEjhXnOc+fv0lb02R4sSt7P7kmV2aTOKyYtdw3lQvg==","signatures":[{"sig":"MEUCIDd9iDQ/Qwzh+jlaVVWmWFa2L8T319vLwNKu0aflQCKcAiEA9UhHK6yiiy+AeRf7dfbgzu9m1JQnIUGeHOGUvV0wrCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14840350},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"00fe50c7ee9e1f2fed2a0c9df6f796234459ec0a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.892_1784529725030_0.6250660412837037","host":"s3://npm-registry-packages-npm-production"}},"0.1.893":{"name":"ugly-app","version":"0.1.893","_id":"ugly-app@0.1.893","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f78858e89b13b4df7c88b8e3d406fbbf46d66977","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.893.tgz","fileCount":3154,"integrity":"sha512-11DpixpOSF7mVntiLw93J+KqTchxir9eHMJfOLqzLb262Rc1xN1L2TmiPaKA2REB0UHjkegOSBEoHKkbqwo8ug==","signatures":[{"sig":"MEUCIQCSLEQGlwlAG4ey7TpgednvYrhgHIfuDKaAk8u853aN2QIgdIyYFtld+H6TzFB8rb+KyEr2p5SAAcvDaOk8nP6qDXI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14885973},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a59979481ac0f493652bf9f90f9852d47ae79e80","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.893_1784570989441_0.5916695255649498","host":"s3://npm-registry-packages-npm-production"}},"0.1.894":{"name":"ugly-app","version":"0.1.894","_id":"ugly-app@0.1.894","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"06653b9770980c2ec346602547d5257e77d41da0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.894.tgz","fileCount":3154,"integrity":"sha512-K98CwLFjQjhxgvCorN/evJnVdUcXgHMUMQDnr0OM0CfSG0VYQOYg8QdODRJbV7IiM3n4Pd6XlDiqx2ZUn0/kUw==","signatures":[{"sig":"MEUCIQDKK8wg8oq/a2E+f0jJyA8BLVNfZgNRFYbxyFUVnHXVjAIgDPzraBekhi00fU7u+/M0e+4aQy6lwqH05BUxvhiZMfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14887356},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a29122554438338cff88aaf2a61ae233d5df91af","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.894_1784572846911_0.5193627849019624","host":"s3://npm-registry-packages-npm-production"}},"0.1.895":{"name":"ugly-app","version":"0.1.895","_id":"ugly-app@0.1.895","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f34b4d4163d48a25f4d93e33586fe42feba9b520","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.895.tgz","fileCount":3154,"integrity":"sha512-9lKfOHBums1JjDCGCoy9YPyPEHk/iUJvPbE5GyII9FwlZqdyQAvd2fSQxjhYOPlvzD/7ltLVbhgrFOM9bZQyfA==","signatures":[{"sig":"MEYCIQD4ITl2dajrOBXRhkW2sQghnBh7C3/YuHeuIYIJ7Rn/0wIhAPzacVoaIZ7omH5ET9rVQu3Tlq2KZl5kuyLUowbpzKS5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14882278},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f523c1b1803d1fab7668fa7d2303a03b7185b847","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.895_1784613354100_0.2259724043410074","host":"s3://npm-registry-packages-npm-production"}},"0.1.896":{"name":"ugly-app","version":"0.1.896","_id":"ugly-app@0.1.896","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a8aa800c29fff593d456b82b3b40c18aa672c829","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.896.tgz","fileCount":3154,"integrity":"sha512-ZvJHQ2TADsPm+XPCktXA2vkl2jayfzvi0FDJ3lHTM8yHMe3dPJ3t9JTnlc4j9lUOhbJvY/XWSuAdN2ngT7umiQ==","signatures":[{"sig":"MEUCIFQApTnTn01SUaSfflvNmW2RMjFQ5A2WugkrFFjeROSBAiEAxxIO68MQhT+N/MQJQm1MUAYsFNB1KtQj/1gsikjoW1w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14890877},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6675f03279c6500a80dc9a43e80fc1d23c4b0136","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.896_1784658829665_0.25751287552132784","host":"s3://npm-registry-packages-npm-production"}},"0.1.897":{"name":"ugly-app","version":"0.1.897","_id":"ugly-app@0.1.897","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"103fc9410530ceb70199e2a2da0c7ad2225df1b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.897.tgz","fileCount":3154,"integrity":"sha512-QJ+/Vj/xXnhcpkzkTaxtT5yix/zZVP7GxYLTcGxK3ij+5sKXKecvSgH3epPnvomSBR5sOLwBbxV+Mz3KCVUoDQ==","signatures":[{"sig":"MEUCIE0H9CgQt/T16arbDrmsQ0kLonfRukfi0AYK4Mca2Ao4AiEAmNkSS0CsyfmnF4fMPKehWOjEinGa2HzNCN1ihMZo32k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14898051},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"43391023c4ecd17592806bdd20e94fc135439a92","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.897_1784662104572_0.8121625611462924","host":"s3://npm-registry-packages-npm-production"}},"0.1.898":{"name":"ugly-app","version":"0.1.898","_id":"ugly-app@0.1.898","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1ed14152eb0d92905967272c6741104f60896649","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.898.tgz","fileCount":3154,"integrity":"sha512-tG8hP138CJ89bCD2Qb+OOp5hv93ig9ZnUNS1qEIoOr2naXxO1GoASIfNkzfqM1U2SWWpXM9JR+SKHhPZSzEm+g==","signatures":[{"sig":"MEUCIBRiuzO6FJsoR0gJ7R9KVd/cvhntL1pyotpnATHCxwqcAiEA0sXuDEcHbjcGwcwDkNwUbEsm+DK+8o6odgf+RHKPTtM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14902363},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"37ededfad8e41d2e0ad0f85761860ff5f72371fe","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.898_1784774549469_0.46517683348387506","host":"s3://npm-registry-packages-npm-production"}},"0.1.899":{"name":"ugly-app","version":"0.1.899","_id":"ugly-app@0.1.899","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c4705627a524e50e4dd7e3689aa74ea75fab759e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.899.tgz","fileCount":3163,"integrity":"sha512-JKYnKgiQ9nkQ9+jQAR6ZvhGhNWJdtXSkDmQx5s3IvQs7GXrHb1dfhVwVkthbfl2swEJbHj1XwJe+4yV2+6kBPg==","signatures":[{"sig":"MEUCICEBh1TKTMlv2hUVGFUBeuMwcf4kGauNS7T0oGmrT3dnAiEAiEx8BYlGcmncuLWRd5evo0MhwoMY8Bdfzx4uvtp6GTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14974890},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"37ededfad8e41d2e0ad0f85761860ff5f72371fe","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.899_1785000308568_0.6728014552545529","host":"s3://npm-registry-packages-npm-production"}},"0.1.900":{"name":"ugly-app","version":"0.1.900","_id":"ugly-app@0.1.900","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3ffbe446f8b186a0e99503a6fc96ec44f5ce667e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.900.tgz","fileCount":3163,"integrity":"sha512-e7LXgow+1IqHf8sVKVpwwadk1ytawsgF9JT5E9DrYmL8nX/cnYIppMMAr1VuMrg6eY4sJdetKN1PVjL9rkUNHw==","signatures":[{"sig":"MEYCIQCShWW9ESiC6q4vbmMX8GKU8Id8FkEWs9DoL2cHEAHWmQIhAKobzr4R3n5XpM+OBjKOz77D14YJvPkE936HFV9DOjGV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14975029},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"aef223988e2fdf1e01e6005380219489b09d3a84","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps with one CLI. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with built-in auth, type-safe RPC over WebSocket and HTTP, real-time docume","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.900_1785001164359_0.71033038750089","host":"s3://npm-registry-packages-npm-production"}},"0.1.901":{"name":"ugly-app","version":"0.1.901","_id":"ugly-app@0.1.901","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0e6cbdfa8d7e6fc2363ed025134d9db751e63419","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.901.tgz","fileCount":3163,"integrity":"sha512-LwKcRZxNFHTVK1NgBUAjPSuvGntkallbNpVSZtz7FGzbP70G5sM8OV1/f9pyommLY1EF0Zo95VdZGfcRct6LYA==","signatures":[{"sig":"MEUCIAk46NGi0Ohrq99OITxmXocnlMNQVNjrPdvZBhK23DWhAiEAgBu7RBuNy4yDAcpjOVLwQu3cHaaewwepocLEAsPHo8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14976468},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8743df81ac274f4de49ab66470bd3ca01b0d0e6a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.901_1785001744765_0.6400679974124113","host":"s3://npm-registry-packages-npm-production"}},"0.1.902":{"name":"ugly-app","version":"0.1.902","_id":"ugly-app@0.1.902","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a1396f7cfcb136d46cd8e49c9aa239d0a3ad89a2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.902.tgz","fileCount":3169,"integrity":"sha512-il2iWRNLkh0GaC2ni4rih+VU8SKP3bqkYUmuTv84TilzDi4Opf82r3U4zOXdloITIR07pN8Bv6JcGIktxvwKqg==","signatures":[{"sig":"MEUCIQDpwD87WQpz3Yaj3bnG43nMJbzxCNUKfF2yW9cS1Qc75gIgTKNAa5yQp6xyZrpPt08HWxOkk4pUmUG15nUPQEm+sC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14984459},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cce871df9cceb00b33087cf6394a3c4f3e3c2b05","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.902_1785007133231_0.37921995718469037","host":"s3://npm-registry-packages-npm-production"}},"0.1.903":{"name":"ugly-app","version":"0.1.903","_id":"ugly-app@0.1.903","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"42d10d4b07793420d86ebf526eca935f1afd54cf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.903.tgz","fileCount":3169,"integrity":"sha512-ceof13fqcukdeTVItCvetGSeGidf3rtxTrdJT3vYwRNX6bG6PHrf1VcLL/IuCuA8KxPrXk2izS2u3hRaF16s+w==","signatures":[{"sig":"MEYCIQCbZ9ud+FyuABQvyfCASn+yMW6/KiagyFlx87gE1NyqfAIhAJKU/REzyHhGzmnf6/l1YEO4ESEvfgyogcCenpkz/YXM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14985181},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eeab843fd64f0a5211a34bf8501546d0e443afd3","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.903_1785007943735_0.15555209289862004","host":"s3://npm-registry-packages-npm-production"}},"0.1.904":{"name":"ugly-app","version":"0.1.904","_id":"ugly-app@0.1.904","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6c4f1ee2be694e281f9050776ea497bbe383ab25","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.904.tgz","fileCount":3169,"integrity":"sha512-HF5A8IVJEQEPEE2rAJZ+jXa3dwiURIR7FiLQaP7IYJX1v2keOcEqNfVxgf+pIYL16/qxSck3Iji5aJ3PXtwt6w==","signatures":[{"sig":"MEUCIBgwusNZsFRTpQJhHAkXgyMZO1FtpM7MU90Ow4lsSaV2AiEA0b58CgNM9MKr/5eFLqxoxBknjsvvv9/vFuhHlOZSb9E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14985967},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eeab843fd64f0a5211a34bf8501546d0e443afd3","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.904_1785008044377_0.49318039173788386","host":"s3://npm-registry-packages-npm-production"}},"0.1.905":{"name":"ugly-app","version":"0.1.905","_id":"ugly-app@0.1.905","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7873bd28ce06c12cbd3139ab8cd5659d192ee2e1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.905.tgz","fileCount":3169,"integrity":"sha512-4B6pQlAxzK2f45JmrP6A7WOIG3oHKTWyuVvgnoeWKJMer272cxiObEVGkmbtQQqfPhO2IzDkGuM1QjZ6WhCH4Q==","signatures":[{"sig":"MEQCIGIIcxl8WSmBQ66lU/NPPVr8PUDN5arQBq9x9aOMbidDAiBxbOT1HfVfVcns9Iu1Mi+IIOlxD+fW0Sc0tq+epDa8qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14995622},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ddc7e20fece777db4829640b43f229a4e63bdd8a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.905_1785014486164_0.1108311050128481","host":"s3://npm-registry-packages-npm-production"}},"0.1.906":{"name":"ugly-app","version":"0.1.906","_id":"ugly-app@0.1.906","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c41e7905817863aad4b3c3c65a53d1b88bd2350d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.906.tgz","fileCount":3169,"integrity":"sha512-Wc+A5GNJjQieftDjL0Ws2gP/d+4hQgcySt60VtXAEkE0Y1GsIkdfqqDtR4l1nSOx44LOQGnt7M+dA1tw9yV5gg==","signatures":[{"sig":"MEUCIQCdFeMTenutOroiRL0MBKVo+McFRJr0fuNxcDKFsaRxyAIgJZvXoOrdn3bWXkvHrZ09cr5OLZIDwtxbwCq4w4s72wQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15001933},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"00195ce8dc1969b370e5344750d98bb2986629f1","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.906_1785018695733_0.016060599056243463","host":"s3://npm-registry-packages-npm-production"}},"0.1.907":{"name":"ugly-app","version":"0.1.907","_id":"ugly-app@0.1.907","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fc0ef934f90a5be4a3922d70196d38beb619681f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.907.tgz","fileCount":3175,"integrity":"sha512-Lz9aGX2dVL2gGoiOVhGLM39lSaJjyT5qkzxaBrbG3F8yi2FO7j/PKX9Y1OwIr5cZIhbnovJ+ThSA9XCp1g0epQ==","signatures":[{"sig":"MEYCIQCkWw98fu5OfRjeJDBun8XNIwlsO/+zJhDphnqdURlP8wIhAKk4J0Bwj5h6XprPFPOza/q207pPVuuTO5zzVpYEdzNb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15019787},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f2020824138ddeab4794a161a7d446f873e1d4e2","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.907_1785023011656_0.38221724424574877","host":"s3://npm-registry-packages-npm-production"}},"0.1.908":{"name":"ugly-app","version":"0.1.908","_id":"ugly-app@0.1.908","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"29eae9a7d79c20174f8132a1b55b0be4688eff51","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.908.tgz","fileCount":3175,"integrity":"sha512-1RqMsK5EFlO3tQxYxPipx79XNqYlZc8EB8QzbATBYdh4JLUbDBVjyi4/sGuouNA13zKPjBuhaIRWliVGMT2mng==","signatures":[{"sig":"MEQCIFLoVW6HwEKPldBfQUd7cpHjSNnjg5xku19JqjmuUW6YAiBInG5LkjFfLvBeRiTbYXPmYYg6WIdeRzhR0rs7GtbJuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15039883},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"06596f87798b027290ef4d18d7080d50de83ba10","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.908_1785025436956_0.2173454305334308","host":"s3://npm-registry-packages-npm-production"}},"0.1.909":{"name":"ugly-app","version":"0.1.909","_id":"ugly-app@0.1.909","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"13f411dac7528892075f4906afb3a6aafc62cdbd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.909.tgz","fileCount":3175,"integrity":"sha512-wNm9NpLFmKIk7n6y7arElkF+ie/oX2gWuB20sxUebMAc9RZBjMK99Ekn+LVYrkFPDe5jDX1n8bwGZl2z1IP2NQ==","signatures":[{"sig":"MEUCIDGD3Xtubk3EKf6byB0GmwjiW+O6Nn0DAC2wjy3ufyu4AiEAzPdJACEVDWB12fxD7eQrocuoPjK74gwoOkg/WmGQqzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15053285},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6435e2c1ddf179e4964ab8ff895ba49bf336b7a6","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.909_1785032597122_0.5267520715454768","host":"s3://npm-registry-packages-npm-production"}},"0.1.910":{"name":"ugly-app","version":"0.1.910","_id":"ugly-app@0.1.910","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e0753a2c453fc4da851acec7df47982c70528d86","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.910.tgz","fileCount":3175,"integrity":"sha512-TXDoFyWlpFvFMmK6PcbTiEhN9GaqjjZ1AG5eGOTIHEFoNEkjm30V9mu23x8hLgNj+y6wODxeSBViI7WpJ5Ty8w==","signatures":[{"sig":"MEUCIHZpJYpyEiblhm6GJT1xFWzn1keEESPNsUQCE/v6YDNqAiEAqWBNBo1LDxZ6LnQHP1i1Wr9oS3609UXwX1wHpZc9xro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15054756},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8169d90ea735efcf4d3057b879f68ab3f2df33b2","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.910_1785033669985_0.8538947306212923","host":"s3://npm-registry-packages-npm-production"}},"0.1.911":{"name":"ugly-app","version":"0.1.911","_id":"ugly-app@0.1.911","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de508ae464712d7c89d1e015b79b0a47d203704b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.911.tgz","fileCount":3180,"integrity":"sha512-1pyjf7dLwc7kkiYAFhSORUbCnVzDwJPCeevAzxn5DNLIGdjv2DDJSVjwiYHHHhGUaCMO4ZtUAovSWiUi16M1EQ==","signatures":[{"sig":"MEQCIG49/wu+cFoL/QoCk6o+Uktx0oocRnenw8b0bpXPCOnpAiBsSIdOZeSrzljZA2RHtN2PTzmMPZD6BQMtBLk7yhNjAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15096489},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"864f97b4fe0c79470fd6549883e52605a6885ea9","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.911_1785035182760_0.4480195698606313","host":"s3://npm-registry-packages-npm-production"}},"0.1.912":{"name":"ugly-app","version":"0.1.912","_id":"ugly-app@0.1.912","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"af8f58f35f0ec31b949a6ef8724ed7f010c65b05","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.912.tgz","fileCount":3180,"integrity":"sha512-YoSeSUCUdRvNLeOPrA0S1NKYBvqlAiscXDe7ul+wbgguVc9zbyIdg8SdI2gC1YTKsRgSwSKhTFyebPqZB0+oCQ==","signatures":[{"sig":"MEYCIQCjXh0QQpVz0lojntgLEuEhVOnHGgYXJ/BwwvftnvnI4AIhANNg0Z9MKwT0egiegzV5lzwO/5RZG7xHGUCoLcNyDzUt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15111912},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"36253a910b576f8eb81adfd99a51176b6a0a4c02","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.912_1785036862555_0.5096628009251523","host":"s3://npm-registry-packages-npm-production"}},"0.1.915":{"name":"ugly-app","version":"0.1.915","_id":"ugly-app@0.1.915","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"57bf41bad597315e7a7321a126dff8a0ea7be888","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.915.tgz","fileCount":3201,"integrity":"sha512-cKJeXCUmfXnHoqg62/MAvI+wAiWAG8ACN7Wib2zAKxdK82sd+sIMkrQpdxNotK0RlYFPTjkZSAPvlHNBTW9aqw==","signatures":[{"sig":"MEUCIFb+cAhZWndToDckwTx/Jk5yklVhfLdiVB1GkYAgzLgMAiEA5ZXAH4cuRaEg7P8U3fhPkg5j+mWWb6uOGCHYc+WFFIA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15205810},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3f06b3e0547aeba56460eeca3f3c2554c2242325","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.915_1785040951973_0.1652964167306994","host":"s3://npm-registry-packages-npm-production"}},"0.1.916":{"name":"ugly-app","version":"0.1.916","_id":"ugly-app@0.1.916","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d4e5d1b8b725f0b9a8b88b030953a228d1324b5e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.916.tgz","fileCount":3202,"integrity":"sha512-+ON/xUcsQN7kPMXmboPLcGZg07MGvltPUTq3slbp6Z9AhnfZTwcwG25idURnSFAhvkR3NzilUqklwkV83P7ujQ==","signatures":[{"sig":"MEUCIQC85SAFh7Q9t0LCg8BQKhBa72zniRKTlT+94B0nXoqGhwIgcUvX8penzYko+ydsaNoCGorW8Z+suBm82i5ltR9wZfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15219780},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"388d8e88a42801f0101486d72147ebd3e6fbe225","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.916_1785044787639_0.8618376240264471","host":"s3://npm-registry-packages-npm-production"}},"0.1.917":{"name":"ugly-app","version":"0.1.917","_id":"ugly-app@0.1.917","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"aca0fc204d55cf93973feaee1507cf090a279ff5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.917.tgz","fileCount":3202,"integrity":"sha512-Hb4plOavNNStbS2kqy1UBEWJbsYW8BliTWXPWc/12mILtWYvkQUUAXG4hm616LEuGiI5M1+K9HTQb1w/AhYOrQ==","signatures":[{"sig":"MEUCIHTQmov2fXw4bKIZZYB4d7Cdd7v5tmTjpuqeEDOUgsB0AiEA6ULpyHj6KWhBpHKiCMl+DdvBEE9o077h3SfjdBAKrWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15220935},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"90cff8d537a7ceba7b5b850e3a3b5d510ecd5742","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Express + React + PostgreSQL stack with type-safe RPC over WebSocket and HTTP, real-time document tracking, built-in auth, ","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.917_1785047766244_0.828951538631628","host":"s3://npm-registry-packages-npm-production"}},"0.1.919":{"name":"ugly-app","version":"0.1.919","_id":"ugly-app@0.1.919","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ef641cf9be7578a151457d0730604c984fac5f16","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.919.tgz","fileCount":3202,"integrity":"sha512-5TMYDLGpt3MH7RWPgXs4FXzHwBv3qztt5aiXwsVTXpEPoP3ebm6rYGzoapm1VbfvNabQJGNwOFBObcAJkfSHpQ==","signatures":[{"sig":"MEUCIDp5AVen6zSubIZsBQ/sZc+D6McW2N8SSsIM9LRzNmL1AiEAiFOpbymuDPC/puubvrZh/LjUFzCscEBpQi7F1B1lOnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15223223},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3e86eba309d7206c4e2e42185dd0af4127355033","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.919_1785049405766_0.05715193705673083","host":"s3://npm-registry-packages-npm-production"}},"0.1.920":{"name":"ugly-app","version":"0.1.920","_id":"ugly-app@0.1.920","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7f83982d2af11cdb209e12ffe386e86343d844af","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.920.tgz","fileCount":3204,"integrity":"sha512-utzgGcI0fBHTld3/MKnPwWnYImW2K9JLMGoaxLLZQ3I8HaIVII7m86PXZMjTGiPEDMVot2bA285Hb96CT+Qc0w==","signatures":[{"sig":"MEUCIDip1JsCRT3lgBPto/xlD5qpPAdtuofZVp+NkKgWptZuAiEArj9d7bNiADAnsq2zWnw1ZSbXdXx3MqUi/+QvjgkXOu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15257409},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"028ec178c65fce9274ff6f30adf196ab70195276","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.920_1785168757684_0.23577239001701833","host":"s3://npm-registry-packages-npm-production"}},"0.1.921":{"name":"ugly-app","version":"0.1.921","_id":"ugly-app@0.1.921","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3eaa80f8cca0310bdf3dafaf73fbe72f25b0def1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.921.tgz","fileCount":3204,"integrity":"sha512-ZLfCTFbIJ/UTr5l02phSMjxRqsTSjjHuYG9YCe+FzSqvkAwzGAH9dKgWSWMU5PJGKcp8Ey4ApBDp9W9knoLNdQ==","signatures":[{"sig":"MEUCIQDRClT0CCpCdC6PORIGF8qYllV46dFAx/qVSGirAkjfXAIgQ1R4EdwWh1i97L70bWbLnVVlYYBa3pc2gj8U3s2c/8U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15257409},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"028ec178c65fce9274ff6f30adf196ab70195276","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.921_1785169743343_0.41027459248464937","host":"s3://npm-registry-packages-npm-production"}},"0.1.922":{"name":"ugly-app","version":"0.1.922","_id":"ugly-app@0.1.922","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ceaf7f34c72cfd090defa5740a7a9c04b406ad02","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.922.tgz","fileCount":3205,"integrity":"sha512-hax50SgtMNYiDvNJ2qt9V7qQw890gSx93oKVp/he4sz1KuUz3ZLGS5h/eYmxmQ9cqnwgbHkQwjF8wPZ3L0AbEQ==","signatures":[{"sig":"MEUCIQCCYBoLo6sBtMQLHdty8X3SbxfYk0rUr2zDzGt25AiRUQIgdzWhJW96zFIUoSGmf5oQTqbhMi3Ujhvbjrufsu0Td5I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15266865},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"028ec178c65fce9274ff6f30adf196ab70195276","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.922_1785170327324_0.3223430484298513","host":"s3://npm-registry-packages-npm-production"}},"0.1.923":{"name":"ugly-app","version":"0.1.923","_id":"ugly-app@0.1.923","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c1b5f30730e732115ef4c8065d98097867c01514","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.923.tgz","fileCount":3211,"integrity":"sha512-sRlneI+Cg2asPTXIds+sMCw/TzPlr7VRwwB/X5zFHgMW6PK3l+W/qtfddUKj7PBg6OwwKI6nnu43sLVIADGqTg==","signatures":[{"sig":"MEQCIDDeMLE804P4GM56sT4VQ0nQYAgcx9H1eUchI3zxzErBAiBoyoP5+wwYhnDTYOVouNEpB43tUTRmXGEb3PqHHtilyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15294681},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"8e70be5dc55d4faf7013992de84f266a66fd67d7","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.923_1785210269417_0.9607050448570369","host":"s3://npm-registry-packages-npm-production"}},"0.1.924":{"name":"ugly-app","version":"0.1.924","_id":"ugly-app@0.1.924","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"646b51d1d1f2901a2df0c69175ee7979581fcbd1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.924.tgz","fileCount":3212,"integrity":"sha512-nJfdKv3GVw7D33Up1tb5MgFp98l8DEjSBiG88380bYgMvk1e7p4fZ+/KXtXo+bG7w3yt257SreT0JsrXVdAxLA==","signatures":[{"sig":"MEUCIQDQAEQdFr6SxNY3LinyqFbCRoQCLjBI+NCHDx04Tyrt4wIgMg/jrhWaZHJwRF0R6HQBYyuprtyiuC3m93C0XkJ2k98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15308954},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"59f3cecf5f9420630d377c5f46aede3a7e2bcdac","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.924_1785223396278_0.4220557787008654","host":"s3://npm-registry-packages-npm-production"}},"0.1.925":{"name":"ugly-app","version":"0.1.925","_id":"ugly-app@0.1.925","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f6deacf878ab532ff3e587302fb29d888b59b206","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.925.tgz","fileCount":3218,"integrity":"sha512-vqL2iB4MU43xlARY4Q6SkR3RwG7Si7zYHaG2+JC+lW16nu767ONxOFdxW5EvNxIQobMNZnOaTqdSjPFFi2nq+Q==","signatures":[{"sig":"MEUCIQCz0fXlCnkLlrZmFyecAZVJVxxtd1SLupFlRcAmevILSwIgHbAmjKcsC6VNDxauLTooTDyLPtZb8sZpqOCqwP1PGho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15357582},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"857e5939ac2feca4d62c14fe5817f03cca69c246","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.925_1785282712429_0.38432606086965415","host":"s3://npm-registry-packages-npm-production"}},"0.1.926":{"name":"ugly-app","version":"0.1.926","_id":"ugly-app@0.1.926","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d92af6b8a5bd05f199d11578af8cbcb5ba08c986","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.926.tgz","fileCount":3218,"integrity":"sha512-YEaZAzR6lJFj5Pa7kodV0RtqmetixI5b1fv/7Ed36Mt0RJUJdo5sZ+dB8U5HsgeShnfpO8/qrOlXxx1O3DA7Kg==","signatures":[{"sig":"MEQCIFabS+e5HxsaZcJocN405lWDS0Y0C2YQT1kMFl7J1OcWAiBS0B2LaS+ttmGl5J9014pySkie3vfe2WaF0zGF+FSkyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15360523},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"dfbb7e4050ae48d6665ff6ec1d2bb0bfa350c2f6","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.926_1785285559609_0.4411723510021486","host":"s3://npm-registry-packages-npm-production"}},"0.1.927":{"name":"ugly-app","version":"0.1.927","_id":"ugly-app@0.1.927","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1b4b6b0d355fdffdb46e602a30ecd3887c69e573","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.927.tgz","fileCount":3250,"integrity":"sha512-oX+9+aRATrCp6BU14FcY2BVmT8mQVuz0qoDgXqkvhRORTIYzRVlgdkBHOaPqg9BzuKhXcB60VEeSBYpCu6gzlA==","signatures":[{"sig":"MEUCIQCc/27fv07WeH9J52hJBulBh7YKK0V7kVyO80Gk1TFWtAIgDQGNRBPRu4gmBo9rLGzvpvbEoQ1eKdCTn7sjX24lkGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15571839},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ff31b648d6542be861dca40d1355e144477c2072","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.927_1785292840036_0.8025379440856981","host":"s3://npm-registry-packages-npm-production"}},"0.1.928":{"name":"ugly-app","version":"0.1.928","_id":"ugly-app@0.1.928","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b3af012e932c49755f187b9b5e467ec2b2a6ab13","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.928.tgz","fileCount":3251,"integrity":"sha512-7BGtlojLQN6TIFNvosXHmo523SC8LyDiULwbUJi2Nd2TzQxpd0eVHOpq4QT3yIK9Huz2D4Wvrj3Tpb4RoGWOYg==","signatures":[{"sig":"MEUCIALbkLKq08BFnaRE9IRxZEX2smumzzGuuW7nK3rlnrSZAiEAt1YRnDHlLI2XY4PCMWkMZebkybaFKgWnMfBV19snWBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15595116},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ddd732207d5ca1ade08a2d61767ed951596d36ea","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.928_1785294342723_0.9266891910813284","host":"s3://npm-registry-packages-npm-production"}},"0.1.929":{"name":"ugly-app","version":"0.1.929","_id":"ugly-app@0.1.929","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d7e956acd53e48654eb590f492c8e89427842cc6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.929.tgz","fileCount":3251,"integrity":"sha512-N53dJ7xv3akyIHQJc4mdGyr4ahGNyenVIo0y1If0L+04e93yaZk1JzXjwAUVfRJCj5b+nyixljJe1Nl6+oNCGA==","signatures":[{"sig":"MEUCIGHFAWteVcISB7sltVqnuhWRvxcAd/wTHECc0h7aeuLuAiEAs3TfmWqm3Vz4aSKPvHNwiLbDiCscl8DmbkcZCdQfr0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15607399},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f87c6c1d6ffeebd4ff83573fe517ebadbbc80c52","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.929_1785294957314_0.01057340050366573","host":"s3://npm-registry-packages-npm-production"}},"0.1.930":{"name":"ugly-app","version":"0.1.930","_id":"ugly-app@0.1.930","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"826f4fc3b561494f21bb8100ded5b66c58e6fe40","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.930.tgz","fileCount":3251,"integrity":"sha512-LQcgZbmBrtVC3yfLWv0peESl48aWnr9BiCsGnMU2q5dgQ180qiMAuODK7JYyfiY9SoLf2lN8kpRiqsngvs9gTA==","signatures":[{"sig":"MEQCIBj3M0NF4FIU3uy0atzIYjQPa4qAQyv/IWbZoR1SMTVLAiAWWPBt5pskX7g37sml80JOWue4U9z08GiiqHsFlqUKzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15613083},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e5dc6c940f3c7c702c717888ee3af20b6c8e2abf","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.930_1785295499831_0.34665549618786295","host":"s3://npm-registry-packages-npm-production"}},"0.1.931":{"name":"ugly-app","version":"0.1.931","_id":"ugly-app@0.1.931","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fc1472a5b875bfcd52c55ab8f865d4b210b9a3d3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.931.tgz","fileCount":3251,"integrity":"sha512-YRKhbNwUXPXdl/1fME01sfApPapRJtyPvub95FWXPO7pkk47DN6Yy4PE66R2/2QkYrGP01GxS/pPoalYASCxLA==","signatures":[{"sig":"MEYCIQDQ4dmAFsKNWtoBNGkxgZevI/ZvzFdWzpBOILU1o/CxSwIhANn90AKItracFLoxeMP3X8eR0VwVX3iOgNzWQEdIa6GS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15618799},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5aefdc1dbdf3c399f99f34620bbf2e186e2e8fd4","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.931_1785296022260_0.5792241704839678","host":"s3://npm-registry-packages-npm-production"}},"0.1.932":{"name":"ugly-app","version":"0.1.932","_id":"ugly-app@0.1.932","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"98d48d4bffb3522133130988a2cb032e49215eb0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.932.tgz","fileCount":3251,"integrity":"sha512-NaOArVzcM7hFg7uU/fEAZyLdMwGKr+bE5pZtOQtC3+LvEH/QeJYrb16mquGPMlb6//MlIk7hvjZ2GO7YkLr5Mg==","signatures":[{"sig":"MEQCIGFpWihH0kHMGEzbMWCUUDvo7+1Gv/aZ6OruIie2KHnMAiB9TqWzJAIx7dKnMBjA0zE5sYk2+/kyTmbaFl6xnidU6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15623259},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"89b859de1da6b797f6e46b29eb1f80e758f26f28","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.932_1785296837067_0.023351081657469575","host":"s3://npm-registry-packages-npm-production"}},"0.1.933":{"name":"ugly-app","version":"0.1.933","_id":"ugly-app@0.1.933","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8435499c10a79946a3c9c1e9272543ab6e45ca66","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.933.tgz","fileCount":3251,"integrity":"sha512-sBM6tv0TJ+49gYx/pdu2NRZxaYZO51axysyBbb46ImtsJbEIu3OUkALL/UXPZpd6nFadnlm+wavY847ThuJp0Q==","signatures":[{"sig":"MEUCIG4XNfOHlPeqFYtXE5SxdQKwCxB8U1ekJAAf7tDFP5p6AiEAq1maBTfGf9pCZdTmhlgbhE+G4E3mOM1BF5Y8ejOeeOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15624593},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1d137f4c961f8187e481bf887942ee4abf0ace3a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.933_1785297762188_0.16152916594703726","host":"s3://npm-registry-packages-npm-production"}},"0.1.934":{"name":"ugly-app","version":"0.1.934","_id":"ugly-app@0.1.934","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cb2f4288e845a67f26d22db9b72ee422386e91c6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.934.tgz","fileCount":3251,"integrity":"sha512-PAU054S1yRrCgji+HgRRzbdl+KOxLGgmsYiSyLcJyC/Y7EuTbgtNn27jVQYQHXjfvDYuqSQSUuRgxhf/D0xzGA==","signatures":[{"sig":"MEUCIQCP7WhlFK57P0aQzUe9sgHHw6cD97aOCcDECsBHwjH2jAIgDvImA7ArGSEMqgreXu4QE/O7U/nLMmxig5xWvUUThTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15630682},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"be35fb7cf3bcd7bcacc8190c2b79f72e7e5e4717","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.934_1785299082086_0.8679569699417795","host":"s3://npm-registry-packages-npm-production"}},"0.1.935":{"name":"ugly-app","version":"0.1.935","_id":"ugly-app@0.1.935","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb546a70850297e728864d452c7e0910714a4b7a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.935.tgz","fileCount":3251,"integrity":"sha512-gWPW0FRtRKEyq3Qvb8jZ7JnP837MpPeu5gecoU0Andx9HZ/E4EzBgsqbfjKHLzdLRQz20CSzr5y3VCRZmreCzQ==","signatures":[{"sig":"MEUCIQC2Tv/+H8ibDKhlUrCW9wsQQQJ8CYgooPbQaEjCzpkxSQIgLSzcWJ1luCDPyrjpnYXZdMlazlFbqbCbiB+89W/j7No=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15633846},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d3af44d46f27d24a807ab7465dde11f86e305703","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.935_1785299723629_0.710350928707649","host":"s3://npm-registry-packages-npm-production"}},"0.1.936":{"name":"ugly-app","version":"0.1.936","_id":"ugly-app@0.1.936","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e8a48396cf18fd5ad9412b96259ba2b23f77332f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.936.tgz","fileCount":3251,"integrity":"sha512-y1N1WGL/gQnQLkqBGadTG14nmyq2h3HK4B74FJA8u+O+G/MQKUpj7ufofFooLZr5iMLlJs1UQwkSMbNLrLgmLw==","signatures":[{"sig":"MEYCIQDZa32RUcvfukeADnnj3evcOwErT+LmrcGFCXLhjA2NPQIhALU+uLuNldQKCf56MtJI7y5tQGTTHljnF83Irjvu1FLd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15643422},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c5f60a8bb0c444f3ae16afbac56b055a11ba8782","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.936_1785300383739_0.38668618268513844","host":"s3://npm-registry-packages-npm-production"}},"0.1.937":{"name":"ugly-app","version":"0.1.937","_id":"ugly-app@0.1.937","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8058538edacb22dbe71d60cac7d509b2c7e4a880","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.937.tgz","fileCount":3251,"integrity":"sha512-yXg0LUFJC8xEllcUw+zgGdI7U4YRsASu0pcT4HQWPglzUeV9px+dDKzo525nD45NfeD/L5DLfY7IGF2wBdd6qg==","signatures":[{"sig":"MEYCIQCdoRbSiv/h2j/q58W4noaexzMuZbRLclxRxknFC0MC9gIhALiS+lRJhExUU7vC40YkFQauz4iRm4ke7EOmFllpwldR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15644411},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"63341cc59d788c904953a87a1feff51550260e5c","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.937_1785301122599_0.293445438708962","host":"s3://npm-registry-packages-npm-production"}},"0.1.938":{"name":"ugly-app","version":"0.1.938","_id":"ugly-app@0.1.938","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1d72e46001ed5ed485fb53d5c8aaf39af0320ced","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.938.tgz","fileCount":3251,"integrity":"sha512-lQK1/vwojGi1dGZA8n9YvK1P7K2FzriNcB5pfIvbUxJyvTMSWmovfio8G5Sj7xK2lsQarbbq+H+jNiwXIkoXAw==","signatures":[{"sig":"MEUCICq53BeakeUw4Xz0piATHn8n8odC/J52IR8rF5iW62WMAiEA8MtQA2H9eYDWKJ8fzPMnnmr0awXFhhIZ3P9yICJ6zIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15649682},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"cba3971d36bc4ce0ab74287d24bd233a8dc4821f","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.938_1785302180762_0.9154093768114502","host":"s3://npm-registry-packages-npm-production"}},"0.1.940":{"name":"ugly-app","version":"0.1.940","_id":"ugly-app@0.1.940","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7445d6572b898f2598e153df072d32727db3a1b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.940.tgz","fileCount":3257,"integrity":"sha512-53kT9goWT4m38bnDkgiMjtjwMI8NzXk9dX/g3YYBbKo48b6eI6ix4AE9NHIICM5f46ZJ5z9ZaF4wYtyyv6eTZw==","signatures":[{"sig":"MEQCIHT3mWQIoaVV0TIrrsyCYnHzh1tteCB7qFB/UTZCDbHDAiAtzWSY73kERk3jvPUYPzjX9lbgZVKBol3JEyBJbfxVBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15664443},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2f0da9c8697552bac81529f93599688dbba5dad8","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.940_1785302660032_0.8167216156717707","host":"s3://npm-registry-packages-npm-production"}},"0.1.941":{"name":"ugly-app","version":"0.1.941","_id":"ugly-app@0.1.941","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"19cc0a939d11af3cf159ea37fdbd59c6a183d452","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.941.tgz","fileCount":3258,"integrity":"sha512-aVpa8HC93sW+mKnCVBQU7FpPIjmZSUB65gTQYKWp6XEVVtk741rs1PgvqujovoSaWfUwAhHnN0b0H5dJWWIvEQ==","signatures":[{"sig":"MEQCIFhFB6hErJ43Uv+cYQ+mzOHSmL/fW4bn5Iu8qN/KclMgAiBTYGMOvr7KzM5aj6td3XW6JgAvmLfmdM/lotpH9uavjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15670955},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fb3a9a36edd60b694616721f73b6281e6e6ee657","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.941_1785306813727_0.07203854150525313","host":"s3://npm-registry-packages-npm-production"}},"0.1.942":{"name":"ugly-app","version":"0.1.942","_id":"ugly-app@0.1.942","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"240b85431e3c26ca8326ff49cad8ccaec92b3f91","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.942.tgz","fileCount":3259,"integrity":"sha512-x7/zUT6ALbWmTwyXEW5nIGOFekWnpVWo5/L2EEHoJnYuDTCB1HdgteCH2vT8VxpDMjeuMNjQU/o6hv8Uj861fA==","signatures":[{"sig":"MEUCIA7Wo7QmGGQSBNkGpeRPeMrCY+50HB5Xc1wjhaJh0U8iAiEAxZLzRkeDtaZVBbb+A8L37JZ1rPbR6LdZaPd4rlKA+wI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15682800},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"bb26ce7924b9d10006e48e43ca5daf9d19048055","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.942_1785311663131_0.2280014745810972","host":"s3://npm-registry-packages-npm-production"}},"0.1.943":{"name":"ugly-app","version":"0.1.943","_id":"ugly-app@0.1.943","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"95548620b203c0c8d3c1a174d2830aa10a9b3ade","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.943.tgz","fileCount":3259,"integrity":"sha512-ltNyFSwfCSyta8E0/WTuosTC1Yxh/mUmsxotQ/8jOy1wcXflECFc9qRmT4VGOpx4rnbOWgGLMjMEFBAI0kpQ8g==","signatures":[{"sig":"MEQCIC8HOlp5YikK6wToYbCuy6OJ3DePntmU3dh8EkJyORzsAiAdF8AdW6NXsvvROJNgy/crnONQZ0fagqv4cTdvWVJCLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15685226},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1503d62195aed211e6178702d2d504da1c7c9e9e","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.943_1785314000389_0.3448697246785335","host":"s3://npm-registry-packages-npm-production"}},"0.1.944":{"name":"ugly-app","version":"0.1.944","_id":"ugly-app@0.1.944","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"451a8deed30cc836e395655f129bd41e7069732d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.944.tgz","fileCount":3259,"integrity":"sha512-lNByPeKJfh76bCajrKC0gKu2JwLBzhIepdBhZMbiWfvToxkDUVdCdPadNqx9QDjWRgCH2qfrHN3I6ZhIiQa1mA==","signatures":[{"sig":"MEQCIEcWJpUHxxoCIPfuJ202w86WZxpxYlML9q/4+5XXQJi0AiB6csdCH+V4XwvR84kQt0D7Xp4npIoFFR5jXPc00gdkMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15686393},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"66a2d1a124a49ddb8891218ff2bd93e2c4968641","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.944_1785319733425_0.3585414159741398","host":"s3://npm-registry-packages-npm-production"}},"0.1.945":{"name":"ugly-app","version":"0.1.945","_id":"ugly-app@0.1.945","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"97ae82a9a13fa7bde6a272978aea0fe07c6ab26a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.945.tgz","fileCount":3259,"integrity":"sha512-saK9Q8A5/3cXTNJKipGzvHh71LLodUtK1Bztfi9HnEsMAHbpXD36w60JbxsnRVDL12PgRMhULyo1P3Mat/TFLA==","signatures":[{"sig":"MEUCIQCSfYPsisglnjiqt65EPIPcRk0Fz22euBauTcH1pmAs8QIgPvN38nSwoDP2/Zw1ln8OOL2T4fqdJd8HWGI4bio2KhU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15687351},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"fbc33d3dc3bbb9de147cee5c3898ef4fba10c58a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.945_1785339678305_0.6891652664271408","host":"s3://npm-registry-packages-npm-production"}},"0.1.946":{"name":"ugly-app","version":"0.1.946","_id":"ugly-app@0.1.946","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"220f0488b4f89e33cfff6315eb4bce0bfb7e6c8a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.946.tgz","fileCount":3259,"integrity":"sha512-DrGApJFcZnAiIcQlJKe+iFJoczs+E3ls81Nw7JWpD7bIicI06zcdARDnnIcGjy6LHMXIVXXpeRgI+YnCTQcf5A==","signatures":[{"sig":"MEQCIBK+QQhkrMxYhSQFDwR3nU7YYL5Ev4ZmfMGyFbcOMZigAiBKcmcYADB4yH4sM/cd2p0riNZfZ1Y5vudUc1nvG3gi2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15690793},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"82792b1b826dc6b9ccf6f311b8f813543c023fa8","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.946_1785340237630_0.257606613987585","host":"s3://npm-registry-packages-npm-production"}},"0.1.947":{"name":"ugly-app","version":"0.1.947","_id":"ugly-app@0.1.947","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"35a945347c8157cb963ef02e0c0f06f41c8ffa6f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.947.tgz","fileCount":3265,"integrity":"sha512-7s4lvf3DNyOCFZj4NKQ90iOrJBJTkF6bWgETYI3wOaQbQvlkP2FRHDRBnUXiieC/6buHP+ioeGDIB5+PbqmhNg==","signatures":[{"sig":"MEUCIQDCxQ1gpBC5q43KLfLPc6CguM8gEwinQ/Du180NyioWKgIgbD+4/QBRghE2GRIhagRyCRmouL4iCZyVeBRAIt+8hxY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15705096},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"82792b1b826dc6b9ccf6f311b8f813543c023fa8","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.947_1785451249280_0.8473073483279077","host":"s3://npm-registry-packages-npm-production"}},"0.1.948":{"name":"ugly-app","version":"0.1.948","_id":"ugly-app@0.1.948","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8a5555173acc327fd68a35c4e7f22528ba3a7691","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.948.tgz","fileCount":3470,"integrity":"sha512-XenWE3n6YkL3ZBhvuv3ofNuJXtDprNHprf99Q8clMFty7pBQc7kfL9lM/MOZKMZmeA7kWGRnxLDOlRyS/p6EHA==","signatures":[{"sig":"MEQCIHGyjhUpfzUTXX6LLzYu1OTvkasdzar7pjM+4f7RzkCgAiBTbeKyPA15e7Y6iWfzzz18gm2vTg2V5DKnRhOMYbMEsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17295183},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"09abafd7d13a619b54951bcbec166cb3f71c6973","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.948_1785478182543_0.1797416058365151","host":"s3://npm-registry-packages-npm-production"}},"0.1.949":{"name":"ugly-app","version":"0.1.949","_id":"ugly-app@0.1.949","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ac10e24f5eb0a9010152703a342ba733c74fe44c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.949.tgz","fileCount":3470,"integrity":"sha512-JP7E2PS3OrMLMyT7Xgoyenllzl9TF+4+UDu1iyW0WkflHrO7jQfx4IxeP3OG6I/jL9rA4WquWOfvRbhWdYwoUg==","signatures":[{"sig":"MEQCIAhi3ekwGR8al9tWeakVnUTqoHh5Oft/ZaJVAFDeMKQgAiBMs5XMtatFu4oUjZ1JZmPMdQTibubn9Hyi0I7D5aA0Bg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17302498},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.949_1785483662648_0.41193561781291343","host":"s3://npm-registry-packages-npm-production"}},"0.1.950":{"name":"ugly-app","version":"0.1.950","_id":"ugly-app@0.1.950","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0364fff031cb4b4d01e0c4ad5dda11ca83e7ce51","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.950.tgz","fileCount":3483,"integrity":"sha512-MxNpE7suvKpL9pAqhRgIeGY1hqX22PKZUBaG7spPtqc5PeapE/c4aPi7bEUDJhikpMWINy5slVvcD75mSOWJ7g==","signatures":[{"sig":"MEYCIQDdD9W6mS7gLPazyv7vSn+p76dc1uan9goY95Mm+3TzigIhAIVOJhwD47wIIG6B8UUpsokUBcZkb35Our7tIWTpjjE3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17343084},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ec1d0e70dcd567dce7997420d97d6bd940467918","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.950_1785484640364_0.7247389767637165","host":"s3://npm-registry-packages-npm-production"}},"0.1.951":{"name":"ugly-app","version":"0.1.951","_id":"ugly-app@0.1.951","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"80eec9f27b40bc8d6d304ab56d012c59e8f45103","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.951.tgz","fileCount":3483,"integrity":"sha512-IfUYFWpHSi8SMBsSIklt8/UkPtaQNhSGRs/uF09xZ4aHmZkfL1rH0AFPC1I93laSVGZ8WmbAzHfKpxSwt3NDxw==","signatures":[{"sig":"MEUCICim0eDUpYP62NhRjqp54Jq0pF98UYcjXaxVZeEd/V6jAiEAhdBduqKf+ehefwIWg7PR25NZLKHO59KmywW+cRtijxA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17344660},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ae3b2eeb36e7be0e23f24edcb5dd0b35d6d52ef8","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.951_1785485076178_0.6762955156575441","host":"s3://npm-registry-packages-npm-production"}},"0.1.952":{"name":"ugly-app","version":"0.1.952","_id":"ugly-app@0.1.952","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"aed305529bdd5ab9599d84352ce7b53daff39b4b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.952.tgz","fileCount":3483,"integrity":"sha512-4MA6TSIjd4JNvNkOgqfhrQQQpnEbbsjIgi8fxEWBvQIH4w3QuC/irze/eU6ib+hlZ2aCJBpXYGDOnRtcAs8/Gw==","signatures":[{"sig":"MEYCIQDDVHVvQ3n8mI9QPDO0ETd6wOi5cMcyMWGD08Q/keBMxwIhAMYECKL9mj3l+BS0JF6fzE3SbpBPnLY99L/vvMa+bDno","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17344668},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f9225f201c668f0587b9bc547af40ed4177a5f0f","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.952_1785513600317_0.8765913207722555","host":"s3://npm-registry-packages-npm-production"}},"0.1.953":{"name":"ugly-app","version":"0.1.953","_id":"ugly-app@0.1.953","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6588cc03e29ff5fe0f41c67cd040cdad60c3d8ad","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.953.tgz","fileCount":3480,"integrity":"sha512-ms6isxBHHKQItK9ieOLk31H6twJYi3sgxzPq76mdOJRJrJEcqDWaYYVTn/qgX2h4w0RwCGDtyV9rIevAf5CcpA==","signatures":[{"sig":"MEQCIAdrhms5GLcGm2K0b7zKPM99VabSPw4eeh1qOr6fw0g5AiBrEcilcE3czaWGaEElBadB2trUOUOsqV9noRnQzRTf4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17371294},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.953_1785521049362_0.33333533108153546","host":"s3://npm-registry-packages-npm-production"}},"0.1.954":{"name":"ugly-app","version":"0.1.954","_id":"ugly-app@0.1.954","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4943d0099e5303150ef93238cc5c56b3e9de6836","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.954.tgz","fileCount":3480,"integrity":"sha512-q/i7EIML5Bi6IFwOe/MQDSgyj3YChAuPXpGrxs7RfBpwT5dUGnIvfciGACLLwRZKUDAkOfaspkGrflIZXNo3Tg==","signatures":[{"sig":"MEYCIQDWf5zzBj98pkH6yNcjFVbJA2Gw1dIRVVg1Xief2fhWBgIhAMeXkkROiVeVm8ATZ1uwJWHa3fXXDqoag6SWweLnUxwq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17369811},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.954_1785523157097_0.31946966795162357","host":"s3://npm-registry-packages-npm-production"}},"0.1.955":{"name":"ugly-app","version":"0.1.955","_id":"ugly-app@0.1.955","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb3183d1e61a7ebdf8fce26db7b0e4d367996eff","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.955.tgz","fileCount":3485,"integrity":"sha512-JU63VJWUj43QNPTwbwppP2uGy9nkSi9P3WQ2cn/EQ2GjFyVqLfcrONnDDpb1SrHj+0FQx6AQBctTqjg0TZUxeA==","signatures":[{"sig":"MEUCIHwl7vPi3bolm6atfZtZL41YMKEd8GUCme/8an83kxLAAiEAr/V4zEVcWOzXnFFQQrFZR/KXqo5vEaA3X1gDC3wCE/g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17434036},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.955_1785534150484_0.7066786313661417","host":"s3://npm-registry-packages-npm-production"}},"0.1.956":{"name":"ugly-app","version":"0.1.956","_id":"ugly-app@0.1.956","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f5afb9a1e3a82702ada406a3b7831cb2e9356c32","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.956.tgz","fileCount":3485,"integrity":"sha512-LWKU5IGuO7LvXIT3sSgQxiWZvMTh11ANR+Vst2z1EusRI953AaeYQ2EDRhnT/jkFmApyxFaL3e6gk0iPgdoB6g==","signatures":[{"sig":"MEYCIQC5tQeHCLqVZrNY5wbhMcMFJ/CIfxg0EcQ2tp8RdQG/eAIhALvfwaxdxXkrwshdkPeUCiQ2SCi/bZM4F28DwjJeYznn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17451829},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.2","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.956_1785547980392_0.12525177495500284","host":"s3://npm-registry-packages-npm-production"}},"0.1.957":{"name":"ugly-app","version":"0.1.957","_id":"ugly-app@0.1.957","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"40652079129d95b4fbe18f02222f9ff62463be2a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.957.tgz","fileCount":3493,"integrity":"sha512-iMfqLTlTagXF9nsNNUX738QEpiUZOMN5aBPVLV94Yjom13QJ20urIv3uhpdhjVnAynmQpIMeALlzjfcL8iYVHA==","signatures":[{"sig":"MEYCIQDxocBtTJe8KU8eYq+WsJk4sQkaEtoZkQUaH+0DEfF7RwIhAKFqofK5XNmaJFpNzABBRR15WPYIB3hL5AvJgtyDnUmn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17486199},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e8b439e91c949bcb0477e75097addc668b747fde","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.957_1785554569418_0.6764556843424121","host":"s3://npm-registry-packages-npm-production"}},"0.1.958":{"name":"ugly-app","version":"0.1.958","_id":"ugly-app@0.1.958","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f741608970f25a3209795ac7cc758794b2c239d6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.958.tgz","fileCount":3493,"integrity":"sha512-K4ubVII10vqU7OHoWL1FaNLn5ZiILV+BP+MEl1BGsiq4Tdh4C1zDKLtUO1XYc+O5doGzTR/KTFZGAe6aQTxDng==","signatures":[{"sig":"MEQCIG9Yc4Z2UuK6I9u1znheV3L2VvWiQX3myCrFcLqvhPqsAiBfxpfOW72T+wMA4jmHENKrZZHrvwXJaClsy7dCKu7K9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17487698},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2111db6c1efff1826d11fd5d106130da689e7413","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.958_1785556932288_0.30363049550288457","host":"s3://npm-registry-packages-npm-production"}},"0.1.959":{"name":"ugly-app","version":"0.1.959","_id":"ugly-app@0.1.959","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"62e932f74dbd3276673b04c97ffd0cf86453d2c3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.959.tgz","fileCount":3498,"integrity":"sha512-SfV/jbfUUBf3V3JFVj6OkJ+rBf7nhvj9jtnTLlxuUmDAELM5WHRGGg355cB9kOSoSWMWrCQ9+N8iFguStg2DqQ==","signatures":[{"sig":"MEYCIQCZVNbaJ1UGMTlvOp7APGlW80ZBD/NLKILw6ewY5tGMygIhAN5zw7Yxas+pXrMfMBPQnlo4DwoqsZ6GmaURZwxtFkRq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17502697},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"7d39f632d11a10b41d81d3f2bb5286141d346dad","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.959_1785560763804_0.46977163423076695","host":"s3://npm-registry-packages-npm-production"}},"0.1.960":{"name":"ugly-app","version":"0.1.960","_id":"ugly-app@0.1.960","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0fc22807ff840fff76a201dcf212eaf2030a9ebb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.960.tgz","fileCount":3498,"integrity":"sha512-cXJVtk7Hqt4k9BRyuS+41FXvPM6ngDOPDALUGOq0S/42x0tJWURxS9jx6doQVMEFo9TAllj6LBje48hk5DMnEA==","signatures":[{"sig":"MEQCID8v2xsHOuu6C+IES/4bzlmp/gSnPjKQWDX1sscGTFcvAiAiX1ogyg/wzRpayWj2/oMxmhAnMpMqI9iO1r/Z9sJGLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17507407},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"6033c1da7477c09709eb9e33ddb999685188e00d","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.960_1785564743935_0.469842471481551","host":"s3://npm-registry-packages-npm-production"}},"0.1.961":{"name":"ugly-app","version":"0.1.961","_id":"ugly-app@0.1.961","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5e14e6ae40bc6404eb22d961173f1baee8b03a4c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.961.tgz","fileCount":3503,"integrity":"sha512-buqTMyjOOcEQiCakmnKALKEJadsy3bHhf80nuUVIUQvPU9EMxzocJkZ67HMDPxALSp8GKiUDJJoz4RH1tjtXhQ==","signatures":[{"sig":"MEUCIQDigkO4TNHISpTweZJoZd0Qapooyw5IPjeG1Swz0Oa9dwIgEgtJTQnzhf7zToWj9YqhPrG02Teo1NPfBzM085vdQBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17569462},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5f528f1cd509c258bfcb149720913e1120995cb4","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.961_1785600839208_0.474971837359349","host":"s3://npm-registry-packages-npm-production"}},"0.1.962":{"name":"ugly-app","version":"0.1.962","_id":"ugly-app@0.1.962","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2eeb83bb9db48d135afcc154efa933230017a770","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.962.tgz","fileCount":3503,"integrity":"sha512-PzbjVFOCbgTJK2kEsl74GyXXpN9O7CvhgREvhi2bEmrz0gyuNgDGeJ86a+LwfEIb1BGwUjZRhKMW5YC9Abe2/w==","signatures":[{"sig":"MEUCIAH2ZhzzBq3GVCoR/uAW1h001TfoCzYcmvGFWl0UeIcbAiEA4a6VP/RBt67A0YX40rp5lRa7Eh3TpnClVh06zGDpyQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17574458},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"163686096459f40a245d43cfb2ec1c6d5e620ff1","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.962_1785604782847_0.015696289634312688","host":"s3://npm-registry-packages-npm-production"}},"0.1.963":{"name":"ugly-app","version":"0.1.963","_id":"ugly-app@0.1.963","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d9c74888cfa0f246f001e9cf76c2a1ecf7d2ca26","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.963.tgz","fileCount":3503,"integrity":"sha512-yW77+XfTRFu5YSQSZUy35p5YU0vQlO7tPO8OlUriK2C0DcwDfWw9gAhXSfcE4nRmcm6cbNehPvuy1niaJxnCyQ==","signatures":[{"sig":"MEUCICZVzYUidGOKJX6UH2Mw2Ar52X/L5ZRgkQJ9d4YPGIGVAiEAmJ/cl9jr7PQpLor1gU4ZNploMQsw4zMP9MiM68truHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17580693},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3edebf59b34c033280b1aaa9db1f46f5639f1eb1","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.963_1785611430861_0.8977794659092646","host":"s3://npm-registry-packages-npm-production"}},"0.1.964":{"name":"ugly-app","version":"0.1.964","_id":"ugly-app@0.1.964","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bc37a5a98dc705790302c4bfb43a3a2c684d3e65","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.964.tgz","fileCount":3503,"integrity":"sha512-C8ajhVTr0H+SgwH7Z5Lpc6bjd0g3YHrmu5Mm0JI7sCsHTSNiAWfLZphrdffwZ6dEMXKGHz0ppIMCZ9AU3Xa5TA==","signatures":[{"sig":"MEUCIQCLEEd/bbNZtJoKQOxs4ZhXfTGGrMEEl0R9ubYdTqxUSAIgVCPevjeqI7/YbGir14glIi+jh9k+PfuuJf0XXoTwnIQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17581131},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"302e7f3da5e4065f22a87881c593df117ba08a75","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.964_1785611788568_0.9871964447776187","host":"s3://npm-registry-packages-npm-production"}},"0.1.965":{"name":"ugly-app","version":"0.1.965","_id":"ugly-app@0.1.965","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f657370e29bf886df537b92599dd34589200e21f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.965.tgz","fileCount":3514,"integrity":"sha512-TiZAD7iz7HnlCAsPtCOYjm94uCLOnZbY0CJsfvLr3vSHviTqgbEBQ+qsZOKVXxv3ts0oKax7z5B4AirU5YQMVA==","signatures":[{"sig":"MEUCIQDEgRYTS7wvKqzHSFU+wk+OX0KJQ9v3faueh5FhA/ra1gIgJVA++OIqGdEeZIWYRu/QYrL+qabbHJ42L3AXfULfTaY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17630954},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0db46dc066d1ff9c81ad2d31709f50638de2312f","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.965_1785623829192_0.9004801441289312","host":"s3://npm-registry-packages-npm-production"}},"0.1.966":{"name":"ugly-app","version":"0.1.966","_id":"ugly-app@0.1.966","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"838a93e4a2d012bc6c7426ec3d246a2aa4389295","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.966.tgz","fileCount":3514,"integrity":"sha512-vxfr+KGkO622aUSjViLVomZfT8byOb7pbv0Kg6qgqirUdtmSYkzvjtrM82hoz8RXAsRTMI56iSsKX5GZQCMSBQ==","signatures":[{"sig":"MEUCIEzkvgfmLSYkbcSw7dUcjEkEW55yAMf/grFL202YcMgmAiEAsFXbxVnl/+zLRp3QAjpNdOsgUsoI5KO9CQ8uKeJ1q3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17638932},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ee7f616ef8f3f039e728f2faa47bdd7faed95226","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.966_1785625886517_0.8553734775842707","host":"s3://npm-registry-packages-npm-production"}},"0.1.967":{"name":"ugly-app","version":"0.1.967","_id":"ugly-app@0.1.967","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1edd57c038d61e1aed2b2e6cfd367ba4900673b2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.967.tgz","fileCount":3514,"integrity":"sha512-S8WJdoNwIuK+8VpJHGN97Y7cvkgZXCD3ZQ7sisGY5jXxLOaeJ880jXOY+LlGrwqtdAH8iRMz35RoVPYW82/aLw==","signatures":[{"sig":"MEQCIHEC6wK2Ad8pDpeXZ2+WmcpDb4iU+JdBU/4KmJOlIMGRAiAMw76JwZPnu/luNg/x9P9X8D5/dvjnBlMRKaU5cVbThQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17642635},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3c42674b2a321bebe8737d3d0a8b7be9718ea8cd","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.967_1785631727707_0.6977841461556762","host":"s3://npm-registry-packages-npm-production"}},"0.1.968":{"name":"ugly-app","version":"0.1.968","_id":"ugly-app@0.1.968","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9835d83334860bdbde74aae8fdb8d0a111941ff5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.968.tgz","fileCount":3514,"integrity":"sha512-dAfAV2dNkcwO00ZoQqbalQDERhtmiuvQ/C/vNhxq5Vps1eLO2KbNA9h71ekX2+AzsKofHNXe9/YFBgWgoq/HJw==","signatures":[{"sig":"MEUCIQDfJY3tzEhF9JyNro0Kym509QkNT6RXldh3XeG9BGI18QIgW3w5Sl/Dj1qmTNlVdeWayt5sPU396ZoI85A1O2gkFiM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17645807},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"23fc257a82ac8010a90acf00189459c92debaeb3","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.968_1785638897156_0.9626233932251453","host":"s3://npm-registry-packages-npm-production"}},"0.1.969":{"name":"ugly-app","version":"0.1.969","_id":"ugly-app@0.1.969","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"02d2e8336177a8e3de4496876c5bf28a2e5bb0be","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.969.tgz","fileCount":3514,"integrity":"sha512-d2ruH8Im94zjHl68LXg5zn0+D70ZpxScBhVYS9jPjbxSRQcXv135AQgbgagiDTEQMiqtYIPacW+qmjHf9QUgEQ==","signatures":[{"sig":"MEQCICvVd75OtCbmf6UZJBoyad3q6WPXwWiQ4QJPmon6sd3PAiB9orp81mtpU1ayXt3Gf5P3BFLzfS+hC9Vs9TBWA7Tnig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17653052},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ecca7f23c32600e380902e8cddfdfc1561e126a7","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.969_1785642123488_0.45693365640036276","host":"s3://npm-registry-packages-npm-production"}},"0.1.970":{"name":"ugly-app","version":"0.1.970","_id":"ugly-app@0.1.970","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"95bd4b2daf8b9f7e495c21bf22e69f7bd30ab747","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.970.tgz","fileCount":3514,"integrity":"sha512-3D4bBZZGRHMHyMcJiNkNzPc89luruBa68z8CA8IJ0DujJq46S/5rwo/hacyIq018gxHPL7ipgMk+b3zjMqyPow==","signatures":[{"sig":"MEQCIBtmd8lDkenOAT14JXAUw2mNu9U4ZbDsZM8AuCJ9jgwHAiBiWAzoVrhIyBU/K/YvNQgosvPNppycNC3bKlbgCR5r3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17658039},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4686896332fb0442762b89cdc4bac76d398e9399","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.970_1785646499894_0.09849698339562751","host":"s3://npm-registry-packages-npm-production"}},"0.1.971":{"name":"ugly-app","version":"0.1.971","_id":"ugly-app@0.1.971","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"575e80b14e34d7912756051e9c5ea8c8b4f45e63","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.971.tgz","fileCount":3524,"integrity":"sha512-YBVDUx0BK4CjjvfviX6XpC9Cn/468hamX5j/1CyplfF7BLpifD14/EKoyeHQlJDns+Guxghk1vlJedeGJMnzug==","signatures":[{"sig":"MEYCIQCPNa+zqxBDZHAJZbpOuyHBMILWgY2gSdHxji044dm9SQIhAK+i220W5L0wkYqXFWyzg3+nSsBN9XaBCq270gb88NkJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17724508},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a23a5a0684e8f340701334b59e6d4f7183e94240","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.971_1785695226108_0.522978727836354","host":"s3://npm-registry-packages-npm-production"}},"0.1.972":{"name":"ugly-app","version":"0.1.972","_id":"ugly-app@0.1.972","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"77c04240cd5b73bdb34dac6e8632e414bb01dd4e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.972.tgz","fileCount":3524,"integrity":"sha512-tw4yIZyu7X5+whbiw2EBRg0oGjnLK4Efv2MBxNWuYgpJd8BCD5FYsSza5Dk66AacIm0/08ozO7FuZUzZy2VW4A==","signatures":[{"sig":"MEYCIQD8ILMjOxRl6DPLa2V4X4/IXq8CFKnHa55pcGyFdSN2VwIhANZoK9/rwqWOLjvdd5sCUE3jtzaEYN9Xt6cQWk0AcGm/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17724982},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"135d0efe91de5f81e75e5b8d78316d4350cbdee6","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.972_1785696220969_0.7615488830279302","host":"s3://npm-registry-packages-npm-production"}},"0.1.973":{"name":"ugly-app","version":"0.1.973","_id":"ugly-app@0.1.973","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"73e40efd214e14f269a1dcad3421cad95d8d3dd4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.973.tgz","fileCount":3525,"integrity":"sha512-en+s8eK6UAL0CmmvvPXDb/zCiuN3KNUQv+PNP5I5vCMAnpqHjdoIydpOIBu2U7ySuf+kdlhrJDC4lzLq/2h/Tg==","signatures":[{"sig":"MEQCIBZ9Ltyj0irYhqkkrt2WQRh2j/wICEmmgxUN59Eo3KoAAiADiwguU4yyfRH3l+kiPGJStLJR8QxBGEpchvEPavkAbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17750738},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"70dd009e0c60a17ead207007527420f512af31b5","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.973_1785698728404_0.8963898673072361","host":"s3://npm-registry-packages-npm-production"}},"0.1.974":{"name":"ugly-app","version":"0.1.974","_id":"ugly-app@0.1.974","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8e1e22bc2fe624e064cfeb6d911ccbb6cfd8508e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.974.tgz","fileCount":3530,"integrity":"sha512-XlFsD0VbzgujouJuK2vs0IPWrzjOIVhJSSeEycpEqlStEIHfFuDYDcGhY/1kfognLlAT6Apkle9/sJCIPgSRRQ==","signatures":[{"sig":"MEQCIDZl19esj4PMH7U2+KrGEFYqWdldPCVpx+CkoFFhJHF0AiASljJOSm14HG6ev8AFsD2CQfiuJsIg/fSNMMHurY5sbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17768986},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"df1677ec749b91d434080d4418fd4f0859c38deb","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.974_1785706680018_0.588415235930315","host":"s3://npm-registry-packages-npm-production"}},"0.1.975":{"name":"ugly-app","version":"0.1.975","_id":"ugly-app@0.1.975","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c21203773ff2b9eb93099038c5717118a1732d84","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.975.tgz","fileCount":3530,"integrity":"sha512-OhwWtJ5FQAoAnF9y9UsXEyQr+H0dDk0zv8DRPJ6PZUCW8fdikfOOsdHfSb2WEs7bZKXG8ZXQvjJf4t7o0LGVng==","signatures":[{"sig":"MEUCIQD66teN/Ev9VCwFgDqGKetVZzvToxpTTn+N/lq6VQ7LQAIgS7N4+ZMH7qP+XRxPXRyz1RopAXmeSZKl4u26u4iGe64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17770104},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"b9303dcce8097bf044d3f2fc4705dcc5e7b11fdb","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.975_1785707277063_0.856787914368748","host":"s3://npm-registry-packages-npm-production"}},"0.1.976":{"name":"ugly-app","version":"0.1.976","_id":"ugly-app@0.1.976","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d42ba92d6f9f07ca198f9c894aa03734f79257ac","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.976.tgz","fileCount":3530,"integrity":"sha512-Zy8mu2OtEd0RSXzEK3EzsWvgr76Ql+3r33+f3hSyiCLky+yS//4UQKNJJH597RZlfIBoiz6N5tnYVCsBrJ3ToA==","signatures":[{"sig":"MEUCIQDAUEQbZ6k5sBWYGjpSO+UQGRc6x/lmRt9KCGcl4EC1LgIgO9OE52kp5fjmIM7UdQ7j8VEue7wtTBMVDWf4QPhwpkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17771279},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"15e3a299294384e85cee94be9236d3afb6e7b3ba","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.976_1785707535631_0.45756866976398114","host":"s3://npm-registry-packages-npm-production"}},"0.1.977":{"name":"ugly-app","version":"0.1.977","_id":"ugly-app@0.1.977","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3224edcc39c904cbf44a95ede4d8c3048812b944","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.977.tgz","fileCount":3530,"integrity":"sha512-HHV/oDEXmEd+RzNCRMmoubHyQtB9gLE96rqHsE49+5i5vMVeTGF4sjVqX0F1teMQxu7fhcjp6fA54lMy1wex8Q==","signatures":[{"sig":"MEQCIGPpRBX18rOra7M4v7dh0zaXs4cXdL2dxC2cc2LP+mV8AiB2ZLswVgY9cilyK1fSiNWCHgCJP2ja0Mq+4U0nqj3UNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17773044},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"49503a9e9e22671bc8367dd33019cff9db396f6b","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI ge","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.977_1785708001280_0.08488873046271861","host":"s3://npm-registry-packages-npm-production"}},"0.1.978":{"name":"ugly-app","version":"0.1.978","_id":"ugly-app@0.1.978","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"58e0bf1f408399eeeba46af2d456e60ddddfdba9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.978.tgz","fileCount":3532,"integrity":"sha512-il4fnsT7tIhqrVeboprQsE5HhfiB6utjzUujRBAZWaHiFkrae9ACvclp4oVz9A7dl2xGFFHnMCp7KhKjAMqE9Q==","signatures":[{"sig":"MEQCIBtPCgg/ORJEu90c2gO/3+mX04QXm0zeiS7mOEr+sa6iAiB2wpdA4nMlZUgsWFruwxFC7aB0K8lHzIU46F/NZyv6MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17785193},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"85e29cdaee380563bec0d1d92fcb5db086235f6e","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.978_1785713472109_0.1799939516045479","host":"s3://npm-registry-packages-npm-production"}},"0.1.979":{"name":"ugly-app","version":"0.1.979","_id":"ugly-app@0.1.979","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bcb270437b98841069d5554af944cea24826a84f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.979.tgz","fileCount":3537,"integrity":"sha512-xUNpgfIn3BnO5l6UuVRKwgPaihUMTi+HO516tfRcHHZPejTBEQymz1hEjJ8zJuv85uJ2tDUNHB1MAgEjIQcLBg==","signatures":[{"sig":"MEQCIDRvcmmgfb29TN2UEpUgwUpVtNdy1KiEoXGFyPVYchWfAiByywQ/QNVKsowK7NXth9Zqzyc984t5j5jIGCFr4RmKYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17806448},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"45d8beb6677ea857da98c26b65f510cf3f6d765a","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.979_1785721045219_0.5889013179935225","host":"s3://npm-registry-packages-npm-production"}},"0.1.980":{"name":"ugly-app","version":"0.1.980","_id":"ugly-app@0.1.980","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"607ca7526b5ec3a609058f6c41639a2f10502fec","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.980.tgz","fileCount":3537,"integrity":"sha512-yYFdMJcu1rKu4Kl7JNKUYK1kXVSiT9G9tDXCUiw9SiOGhOIpCIyNsbdXBVGkX3qSNRXIjY+bGVXHuICx7GDaaA==","signatures":[{"sig":"MEUCIQD/6hgTLa1mnWNcNl22VQiCbgQKOdW9Ub38z/hyx3F1SAIgSTQ5708Cy472IZFE6oNbETU+qpznpxGOZ4Z0que27lw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17810309},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1f9325971db9c32bc1083716f28dfa8cf6d24748","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.980_1785721675391_0.9159438157899751","host":"s3://npm-registry-packages-npm-production"}},"0.1.981":{"name":"ugly-app","version":"0.1.981","_id":"ugly-app@0.1.981","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e89be7abe018d721e2811fc5ec94358488a3898c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.981.tgz","fileCount":3537,"integrity":"sha512-2mH034TRe26wYQixCPpHPGvG+VNHiDmYPRIU+lErCo4Gqeuq0Cip4XDwLvM8jhSgqJ52lmdCS9wvPGF7S0PZUw==","signatures":[{"sig":"MEQCIFHSDwoeKz1VsW/6Pz2gitAh7wyukNt8ruMuBRva8ybDAiBX2ZAxwTPkyzHwteRXHMi3pRpXeKeDrT6pdSN6K37crw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17814672},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ff0f7ad6e1395cac385db79561af36fa9fef2cfe","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.981_1785722170027_0.886758333053612","host":"s3://npm-registry-packages-npm-production"}},"0.1.982":{"name":"ugly-app","version":"0.1.982","_id":"ugly-app@0.1.982","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d7c77003ee4967eda20bceff5da6f90945ab33fd","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.982.tgz","fileCount":3538,"integrity":"sha512-R+0cBKsupRkg9B8gGRsvGwh5xZUfeZOyesWqwSS0mad2YlSPsLORYih6Fuqp7rpjk6OALEu+bSHEpWqngsZaWQ==","signatures":[{"sig":"MEQCIFYqCe33ma28wz1CZeh6Z2+7HX7z3hmVLiR0v7Z76OylAiAGH9hR72FPomUgts0Nkh3KpMN1wr9NT+CbMdu9HN1anA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17822554},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1c9a3069f54de181d5da24cccdce24dd3805dace","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.982_1785808779095_0.7176640388466602","host":"s3://npm-registry-packages-npm-production"}},"0.1.983":{"name":"ugly-app","version":"0.1.983","_id":"ugly-app@0.1.983","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"c90adead32b12d40932a6417b22e4f2f783a7645","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.983.tgz","fileCount":3544,"integrity":"sha512-l/MsRewavN4Hyzo86ay3dHFfv1RB4Trg0/fz93xBpZXaTSj4+BiRdprAagxDCQ81gcYzLPpAQCZ5H+/RO7iHhA==","signatures":[{"sig":"MEUCIQCC5F5ncTv0yS1hcg/n/2hDtJ0tBKcfOtHt1Bw0KfZ7aAIgJXCiibeqDkZm/motD/QmfntfR6xiX5+JKjboEVc07/E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17859579},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"dbad44063a5cca11b081a262b2504342dd4880a1","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.983_1785953370973_0.39828588911223295","host":"s3://npm-registry-packages-npm-production"}},"0.1.984":{"name":"ugly-app","version":"0.1.984","_id":"ugly-app@0.1.984","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b7e37f8d2cc20210f83ba7750d7efc8eea904ec7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.984.tgz","fileCount":3543,"integrity":"sha512-PgfkBshFZTLoiGh+e+z4MSPLf0eEqyAR/VpZ3aqqtEurnNodNHKcdrmnTEzAESWGR8C+mHrRo+Xp473HCKifZQ==","signatures":[{"sig":"MEYCIQD59t0wIcPkE9uHfp0NMoubxifM68UlXMcizC2RWUGEMQIhAL5W9aZKfzCPuv3OPVouDuowih5plqYIoQBUW1sEtUSp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17841484},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.984_1785991292289_0.2407640308478538","host":"s3://npm-registry-packages-npm-production"}},"0.1.985":{"name":"ugly-app","version":"0.1.985","_id":"ugly-app@0.1.985","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ec0195f65dccc6f9144a09e707253a6c71378f88","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.985.tgz","fileCount":3549,"integrity":"sha512-n1VhhENxXTCc6GaR5s7KvvnYPCWvxVilexzIKk/qx4JWqYLh/mc17R8EMj7EV2Hpdy3QBbObIZ6/6K8wlHBi5g==","signatures":[{"sig":"MEUCIC5aUizltKB79b9LuJeJKlzRsJs+taXkPd1EEUvJulPUAiEA2+JLi4U8MRPrOYCgJL2g5HwLOKcqvdEPyRtCeF4qzWU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17887256},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"4f075019377319a9d0e75900b3f02d93bb77de9e","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.985_1786121649030_0.8581499964973567","host":"s3://npm-registry-packages-npm-production"}},"0.1.986":{"name":"ugly-app","version":"0.1.986","_id":"ugly-app@0.1.986","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"cfdc45a1f2d64c2d9b15c6967dcf91094435d220","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.986.tgz","fileCount":3549,"integrity":"sha512-Z9hyDJQvSoKfyrl1f6B3GHE9nsak1db3jeRTQwavPihtXZZ2ltRPkxh58vymU/GahIOU0jaCs47baGHG2cQLFg==","signatures":[{"sig":"MEQCIB0OmDUfrCM8dsP9Mme0jCI0p7on21A2fkdsjwxwV/lEAiA/M7S0cEXsL2wBsTazzy1e8ORnOnHsuro+n41Rid6Njg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17894657},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f8cb1ec8e0cb05bef4a382a8b2eb1cfbfda00ee5","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.986_1786126852153_0.9422936583731725","host":"s3://npm-registry-packages-npm-production"}},"0.1.987":{"name":"ugly-app","version":"0.1.987","_id":"ugly-app@0.1.987","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de516dd89c2959ee2a7cb9b5844f7dfc7b9029c5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.987.tgz","fileCount":3565,"integrity":"sha512-oLFFgJ1t7V+6o+PC21bBiBVPiJm6MWW74rwmHnEfDG/Xtk/7cTf+ZNw8busF2g2M9rn1MbyrGWeXK/L3xC22eQ==","signatures":[{"sig":"MEUCIGBSK6HLatTfxL7FfImxAFWCewDtq4ikw0boYbjQmK8XAiEAsmxd3tDK8ZXk86JI6pCKLvzQZXmYT5iwfP1GRQTzLDM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17940523},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"73f9143293bf9c15700120011f6cd25e50558b06","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.987_1786254134209_0.675436973152397","host":"s3://npm-registry-packages-npm-production"}},"0.1.988":{"name":"ugly-app","version":"0.1.988","_id":"ugly-app@0.1.988","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f3a956e08e10377e2798c3471a9db6f8051c87fc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.988.tgz","fileCount":3565,"integrity":"sha512-iTb+dczp384aYUk2dSI1j1g9kTYLLlCW2zYmt74S+nTje64rTFuLqGtRSZ/o3O29bey2No8HO0BXRMVaBnZeuw==","signatures":[{"sig":"MEUCIQDuPjOQaQkW4gUFJT8kGnvx9yWTvUHqup5RoIxHEQS4qQIgY6nTDPHCwGOlFyhaUlhVZlhE/Tt4JUMftZW3wuIXTfs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17948843},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"acee2cafe8092a1bd4b39a2b744c983901264c82","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps. Scaffold with `npx ugly-app init my-app` and you get an opinionated Node + React + Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, A","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.988_1786255627621_0.8039998026604649","host":"s3://npm-registry-packages-npm-production"}},"0.1.989":{"name":"ugly-app","version":"0.1.989","_id":"ugly-app@0.1.989","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fcc548cff16e461c6188c7a51e1906e240b8c01b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.989.tgz","fileCount":3575,"integrity":"sha512-G9mHLUpk96IUf1YhBRZucsHeP+MqfAUq6/b259bpaTCqR4BwVDA/8/xoQt9ozZ8vLn5AseY+reQEBprHZzL40Q==","signatures":[{"sig":"MEUCID+lqBVk3KRb1woc5rXahNjnN7q2cKEcQ9pq7LwQvYZSAiEAgFkrtlV4S68WRfCl+0+WnkPnQBmWQf18KqxhY+68VWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17989597},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"72c60c58a1ee73fdfd8165c25e02b7722e05c0fc","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.989_1786324180984_0.7167449936446726","host":"s3://npm-registry-packages-npm-production"}},"0.1.990":{"name":"ugly-app","version":"0.1.990","_id":"ugly-app@0.1.990","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"45968462d7b8e9396cdd019ab2287d061a0dd3a4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.990.tgz","fileCount":3615,"integrity":"sha512-ZrXMXxiwgWVq/Yq1LStbMNt2q5mc+eNN9h5gsq+eugM//uxczbTqLQDglziZCKM43AqRzdSegDs/D6BbRdB1nQ==","signatures":[{"sig":"MEUCIGySBlZQle6XjJaXj+pCrKup3uEhXGuEKS9zHu0MMFeoAiEA3tmXUxzhWOBAaAdp6Wp2pAxi51smByUY5p+0zY8ak4o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18192117},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"ede66e3bfe40fa08d973cac18d8dbfff4beae0f9","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.990_1786341060393_0.8821591465464413","host":"s3://npm-registry-packages-npm-production"}},"0.1.991":{"name":"ugly-app","version":"0.1.991","_id":"ugly-app@0.1.991","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"189554347087320866ca32477c557d57bad648db","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.991.tgz","fileCount":3615,"integrity":"sha512-WsOcNTRwr6DWOuUQwl+x47hEAHjMXBnc0zUseLUFiJlo56kSEl6wGjE/BnEdKimsB8gQBSSmINeVH+7AtUVwPg==","signatures":[{"sig":"MEQCIEwZDNK49w9+W13Gm6QLwoZfUOzm+EBDiiuHheuTghqBAiBH8Wy6aDhupzKpJUqkaly2hBC8v+5fhpCDP6qKQcyryw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18193942},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"831cecf66ab1bcf9c595d03a4f4374fefebf1e2e","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.991_1786342542414_0.883867694839239","host":"s3://npm-registry-packages-npm-production"}},"0.1.992":{"name":"ugly-app","version":"0.1.992","_id":"ugly-app@0.1.992","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"675af3b125dc5d6fe4585fb547a0e9bb26a3c53f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.992.tgz","fileCount":3615,"integrity":"sha512-z/XJuaLJpDOEQ1EkMa84MhGfcmMbgHTLJzYg+vZjHJlNCVu0p7aZA4JOSAVhh5Qyyv9sBbZRzyglyOFEVj2jZg==","signatures":[{"sig":"MEYCIQDOBb6eGTEDDgi24Svo6SIL2wYKLX7lDReDU8LkY2oILQIhAIdcaQA9vcYnb81HzckK3m6xauh11Is6TUc9p/KthVxb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18195416},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"aa2f09ca5f9a07d722ad93efb58289be3fdfaf55","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.992_1786345873977_0.06771080591175038","host":"s3://npm-registry-packages-npm-production"}},"0.1.993":{"name":"ugly-app","version":"0.1.993","_id":"ugly-app@0.1.993","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0f37055be22108bab58ce83cf71d7e7958d86945","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.993.tgz","fileCount":3615,"integrity":"sha512-yHfcijnkLzZYjJ2wQwWf+qFWphk3cT947H9Voxz8L1GUdV9sO4HmKSPrWFrsD2ZlZPYqvUb/JNqoOSS6wgiF+Q==","signatures":[{"sig":"MEUCIQD87yD9Snu1R4iLJRajSCLje5PsPuuQpXqymEw8sUROMAIgPs4oZtSj+/IQtglqArXesQYQw/Wk9ptFnbsX10mc2Vk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18203119},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"48caa0609a376e644f6613875540e5e611f4b60c","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.993_1786378945129_0.5413705669144457","host":"s3://npm-registry-packages-npm-production"}},"0.1.994":{"name":"ugly-app","version":"0.1.994","_id":"ugly-app@0.1.994","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e7dd270c461f9130de49824b2fc1aa9c145ecdb5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.994.tgz","fileCount":3616,"integrity":"sha512-bqCboR+ZSrP9ZfM1TGyiqdYHnJEN+BBeDQjerO9koXJFYESEZdvx4ZL2+WbTXCt/zeVWGWfTmZVCpYdpOJlhaA==","signatures":[{"sig":"MEUCIQD5n28ca8+gQ1MgjL1vWvpJC9ata5q6BbeYqiIVRVyEawIgQqhWXgVZpIv8+9dCaGdV/D95ADrg7F5fXKtBo+7UyI4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18235268},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5c07cb090925565ecfd16ed0ff6621b6c3f8b28b","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.994_1786463944141_0.7210889237599505","host":"s3://npm-registry-packages-npm-production"}},"0.1.995":{"name":"ugly-app","version":"0.1.995","_id":"ugly-app@0.1.995","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b4e32fd8604159db32baff263218df6e38163c84","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.995.tgz","fileCount":3616,"integrity":"sha512-NjzUAWJVtdEjs8oiA2zAZ5538Fn/IS5e+60qjpPY6OMGuHCQSCqN9Md16OjdWWW80KXKv4O2P+PBOdgOBfuOEg==","signatures":[{"sig":"MEQCIGk6BZsh3DotZXGwoT2oZCg3QiDun9Hup/JUE/5619W+AiAmNq+y4DwPrTcm8uCmY+/1FcRar8pq79Gms+yqAptsNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18241403},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.995_1786556495056_0.42989531074193366","host":"s3://npm-registry-packages-npm-production"}},"0.1.996":{"name":"ugly-app","version":"0.1.996","_id":"ugly-app@0.1.996","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ddca44e64a3a6aa32ebd6d1364eec6500d74d1ef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.996.tgz","fileCount":3616,"integrity":"sha512-48kid3qSXkjEAaUYPCAmaHVT2WwUlMsca+dDsIf/orWfoUeUCZrhFDz96itWwe7msNHlCFlcnjte8WYHDsyFIA==","signatures":[{"sig":"MEUCIQD+STDP0E4zoIrFVjw3c6mbc7JPNW8x6Tmpa4MAcdx1NQIgR2KouhMFrE1NYXOkuTu4m7b2K+NpkuqmaeE1iQ957xI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18244372},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.996_1786558039056_0.44096442067387787","host":"s3://npm-registry-packages-npm-production"}},"0.1.997":{"name":"ugly-app","version":"0.1.997","_id":"ugly-app@0.1.997","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ecd3a30ed8ffc4b9cc4ccd60d2d36a82bfc51a7a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.997.tgz","fileCount":3617,"integrity":"sha512-79XI5mJptUd///gi4ptI5Ow+DFKmtOIGbOgAKGnTmdxPVXNSMguHSsQJV8c+Nm5zpktf8ypVw8Vv8445ByRhTw==","signatures":[{"sig":"MEYCIQDFE3f7D0fM5YtOYEzohDriWBu11fU7WmpuEEV4L/6Z+wIhALJX5BRYuc1OS0NOUhxrp8QOq0TYctC8m3yk/RG5lVYY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18254920},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.997_1786560870210_0.8830723222673844","host":"s3://npm-registry-packages-npm-production"}},"0.1.998":{"name":"ugly-app","version":"0.1.998","_id":"ugly-app@0.1.998","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7ec48e3dbe728a25a9c77564342a1a91625bd24b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.998.tgz","fileCount":3622,"integrity":"sha512-rXI6Iay0zKUrOT/SZgikuXFXbq089jhKMthtctjt2EsTwtL9upZXMadjN2PUg301n7w4hBns8DegiIPo5zDHnw==","signatures":[{"sig":"MEUCIDQ4ZlW7j7064oFQtS1oCvsq6eNSaR35UysOCFB3eyPgAiEA16NaMDkRdiCeEJHhT+yEdn5Rd+HVaxsVgqMU4KE6/Kk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18268403},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.998_1786665269403_0.3063985012481134","host":"s3://npm-registry-packages-npm-production"}},"0.1.999":{"name":"ugly-app","version":"0.1.999","_id":"ugly-app@0.1.999","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"33c08662ab7c5a1155525f13529387ae7a23e782","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.999.tgz","fileCount":3622,"integrity":"sha512-sCKybO8GRuXhJ9FRX1YP7ylUloIpf1fXNkthPXhsIcANfhyyqsSbLFU+x1ue8VI+H0xUrObVlscA8yRCMJ2VWQ==","signatures":[{"sig":"MEUCIHOb16Frc2Q2ImiqWG2CU/349Oj8cPWSvtNQdCv+kn3oAiEAzc3qiWwsDFdEsJBP3DuG3FDsTd6NgIwPJBKni6AAR44=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18269214},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.999_1786725756822_0.42443519699396504","host":"s3://npm-registry-packages-npm-production"}},"0.1.1000":{"name":"ugly-app","version":"0.1.1000","_id":"ugly-app@0.1.1000","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1f80583fd9c12f17e0d01c4cbea187f67fe35c1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1000.tgz","fileCount":3622,"integrity":"sha512-xD+dyzVqEqd0lQff3W0KrxjJem07jdPVhnbNZmaHnwY+GFnbvWclG9wAxJoFmaFR0lxnDyjr1BrSxKVME98f2w==","signatures":[{"sig":"MEQCIBdevVAD/ghxkRVKdjE+17o7RNBQW1IyJFZk0OrVCvJzAiBrcw3wVx6bHf8tOcf7AewhVOd65kslRy10apZCmeqs7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18269729},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.4","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1000_1786732397370_0.3244458766107321","host":"s3://npm-registry-packages-npm-production"}},"0.1.1001":{"name":"ugly-app","version":"0.1.1001","_id":"ugly-app@0.1.1001","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1c512e1c58c791d7cf3c5ef115137da76845e561","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1001.tgz","fileCount":3632,"integrity":"sha512-PVpsw2PnjA58CK0YvhhL3I2izcQxTOmHMH77oxA2jmd0JYTpbPqxfaqq1nTzVS9qSPnh/EH/zC9uLoOU5kTcNw==","signatures":[{"sig":"MEQCIGoXA/zcseuhfdjT+hIMMwhOahD+e3mWJ0e6+/tizVk0AiAT2M91Bc9TAuGTB/fbs7lX0vhjOrvOQ31bPUcvbCpj+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18476095},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.39","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1001_1786739928789_0.46136608241603017","host":"s3://npm-registry-packages-npm-production"}},"0.1.1002":{"name":"ugly-app","version":"0.1.1002","_id":"ugly-app@0.1.1002","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"250dd72b3352b69bb15968456cb2c8b9c02b764f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1002.tgz","fileCount":3642,"integrity":"sha512-JLAAQvEJq5bam2qzb9bFS80aeYMh/WYbv3Hzq57F+uyAATm2jSYjeZXdapL06TWsvDXPB6+pCDntw3sOHez72Q==","signatures":[{"sig":"MEUCIBGGAz9j7V5jNtufxUP3O/8bFKDti5nBjaiqaO/5LIG0AiEA8gowtmaPY/mWAqp9IqGVLiCOuxqi6Y1N12Qug6UU+UM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18533081},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.40","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1002_1786742253622_0.775781264811888","host":"s3://npm-registry-packages-npm-production"}},"0.1.1003":{"name":"ugly-app","version":"0.1.1003","_id":"ugly-app@0.1.1003","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a39ed2c89bb06448b4390e84a988ad0ba5d3beaa","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1003.tgz","fileCount":3647,"integrity":"sha512-EZFmBZIp6XUhNVfMBZHzpO4/KP3lxmTxR0OsTlYy6GGVFNp8EiJ7bHu/I612FJ77KLeUtG0kVVfaceH5/9CePg==","signatures":[{"sig":"MEUCICNLGpYpgobQ9HWH7wIE/7HMetu85GFby8+88uTPisnmAiEA69pBI0Eq1JE2G+nU7s+n9xuHZLxDAcWw7+41I72bgoI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18559551},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.40","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1003_1786743107571_0.34163941459846936","host":"s3://npm-registry-packages-npm-production"}},"0.1.1004":{"name":"ugly-app","version":"0.1.1004","_id":"ugly-app@0.1.1004","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"2b13e5a1c9ed738fa2bfd4088952a376607a1afb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1004.tgz","fileCount":3652,"integrity":"sha512-SAeoU08GgAVtqOJgMCtb1QXvvHDI2OmfC5rbjZlIAtvnnGOysiyDA45XtTq2VMivXyC41mp6kbCGvLVhtjtPuw==","signatures":[{"sig":"MEYCIQD8PyiF5sN9n+8mvidc9n3XBiuj24eabZyGQXj57xSesgIhAKPr7tZH8g9w2HYWZrL9HGsAiDsKzl7Lror8OsGA1b1A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18622490},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.40","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1004_1786744237952_0.084777932268576","host":"s3://npm-registry-packages-npm-production"}},"0.1.1005":{"name":"ugly-app","version":"0.1.1005","_id":"ugly-app@0.1.1005","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5a0f05cd75f71fbbc5278a57212633ef50f3af87","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1005.tgz","fileCount":3652,"integrity":"sha512-9oon48Uv1VDPysSyJSxlDymUCidMDvXm6Fp9tq6kmxOyRvbhcfqh4ZtNgv5F1ENoZNG87yCIiXeLywzrS4My8w==","signatures":[{"sig":"MEQCICv3aE6jQifAC3OQs9/0jMNjyNltcl2en1vMDSkpL2LUAiB/YdJ/DgZE0/pii4NRjjv0dB0wqEwwDuSDHOf8dD4SxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18642097},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.40","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1005_1786745245783_0.5878387166579959","host":"s3://npm-registry-packages-npm-production"}},"0.1.1006":{"name":"ugly-app","version":"0.1.1006","_id":"ugly-app@0.1.1006","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"de64a6a91a18a6520468af98d61981e10ece35e7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1006.tgz","fileCount":3657,"integrity":"sha512-KOhr/iJ1sSUhIhdowsVe/SC8UClmUnH/wdp76w5D4hK8EbGOdyaBNnPAXj1vERhZo2e3yM6jr4jKa4BcHhUftA==","signatures":[{"sig":"MEMCIHq7mNYj/7uTU5KuQTskKGF42SEl6pJpZwECOZ48GxlQAh9bWO8lzyQOZLvXOQNzJwVyrU0WnO9fSUau7n/gTsHG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18668714},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.40","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1006_1786745908490_0.23659301028762814","host":"s3://npm-registry-packages-npm-production"}},"0.1.1007":{"name":"ugly-app","version":"0.1.1007","_id":"ugly-app@0.1.1007","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"765a53bd18de050803b4f19f6692649b2da11487","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1007.tgz","fileCount":3657,"integrity":"sha512-j6tfjI1UaXtpjhKHn5xqJkUeJQJD2Rl20f6niF7kSFuiYI1pNQ2P9eXcM9b5j53MKdv1TBwAS0RqCGAAdK7ieA==","signatures":[{"sig":"MEUCIQC75x1lqNqr9GzeVkAaj+VWSROjhOkE9CHIH5dkqVxa3gIgeXO/5lX4RiSDySBDTipu6/uVYSfKUe0RcbtCsD6WKkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18673479},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.42","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1007_1786746980322_0.189021793079583","host":"s3://npm-registry-packages-npm-production"}},"0.1.1008":{"name":"ugly-app","version":"0.1.1008","_id":"ugly-app@0.1.1008","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8e6360c04d0eae38d486eae1c6bbd8800c906329","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1008.tgz","fileCount":3657,"integrity":"sha512-dnheQ0vIbpq0EplTlMQBlNWSDwPBqukgLybaSisTFnxfV3Dvz8MHHdqhZ2cUrfuTbAuwWDSMiXTcq9Lict2+5Q==","signatures":[{"sig":"MEUCIQCUlBPKQItaAedjheaBP1sXDv7d4T4zv6Ot+RJp9FOq3AIgEpqf+apwoY0wt2mT6MCrr4Kzu/4obJZ1raIkSrjLgps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18686696},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.43","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1008_1786748195064_0.27950529488642206","host":"s3://npm-registry-packages-npm-production"}},"0.1.1009":{"name":"ugly-app","version":"0.1.1009","_id":"ugly-app@0.1.1009","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f6a84471f9bf34adda5e221a560589c4367e96c6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1009.tgz","fileCount":3657,"integrity":"sha512-mD9vYxh3ang4SL3yorgc7E6OBxufv7BpX2rR0rbgz2Rwb1hOEc5LW55PEStCT08ZWphwFcrThfserkGti18reg==","signatures":[{"sig":"MEUCIQDcYAnS9CS9S6KMjtNUYDB9tdUF3ujpNGjRRKcB7bJ2dwIgCLy/IMC08SdCYKjFZ2H0NPVJE2zS4qXxHrlx7dM1FPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18691696},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.44","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1009_1786749300083_0.5264332440969659","host":"s3://npm-registry-packages-npm-production"}},"0.1.1010":{"name":"ugly-app","version":"0.1.1010","_id":"ugly-app@0.1.1010","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"525ebe02af46273b145dd1d3d495099e605ad240","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1010.tgz","fileCount":3657,"integrity":"sha512-ryk7cSRhXVHsRd94I8FUbOR6/C/zrCSw/Y1aLkDeHGgh4WqalcgGNplpACQ9cnk86AlGOAjM+Y6227VxSBw+xg==","signatures":[{"sig":"MEQCIGXhHwpe7QRRoKqafxOA2ATIvNaISA4zmXA9Ef93ZpWsAiBc3P0imsNpogyJGd4em30uwrBJ+8MxVIhtBW5i1Q9cBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18708861},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.44","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1010_1786754958703_0.924241390132821","host":"s3://npm-registry-packages-npm-production"}},"0.1.1011":{"name":"ugly-app","version":"0.1.1011","_id":"ugly-app@0.1.1011","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a172c3f449376de6471222c8c7999dc9712ea5c8","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1011.tgz","fileCount":3657,"integrity":"sha512-wyWqMCXiucdJk0SrbjSYNwsWzeFQqu/oxvuq6JiFn6Z4ziFZTxcBGj1JGPx1zDcWn8CqUln9uSJcifdnVeHPyw==","signatures":[{"sig":"MEYCIQCxYw3spJujUY9y5i0/TIyc6rQnDc0jYTPu09p4qiNqQAIhAO/pIfdYXpp58i7rcyzBA0kUletknIIhIxJix/1mX1LX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18741877},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.44","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1011_1786764438770_0.9123482725642427","host":"s3://npm-registry-packages-npm-production"}},"0.1.1012":{"name":"ugly-app","version":"0.1.1012","_id":"ugly-app@0.1.1012","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"29e38e2ec0d091e42133b6a1d42cc121ec1bf2b6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1012.tgz","fileCount":3657,"integrity":"sha512-RcYNbliIdKLCSBlfpkFsDvEMdfPZrpocwWwOZOebDfpJw+KegaL0AKAYT1c19QiSwLeHx9IU5nPNujDr08AurQ==","signatures":[{"sig":"MEUCIBV/ErZOhobbY6aFZnyQkJnQt+MzD1HbNnp7BuDSqbsaAiEA6RZlUEvsWBXSxTpqKt2ROvkMCc7YLDG6rWaoz6eudY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18784549},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.44","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1012_1786768973802_0.42147694658994883","host":"s3://npm-registry-packages-npm-production"}},"0.1.1013":{"name":"ugly-app","version":"0.1.1013","_id":"ugly-app@0.1.1013","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"357f2e2ea03ad07a6013ff8bcc21f3a8a41c4feb","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1013.tgz","fileCount":3657,"integrity":"sha512-Xsczvz8pEVpd6b0q8L5p0jfvOfl0Xc8g2WnDcXYfmRnTWk/mAYoxHW6XsJnHuj7uhC7/bzpzsYm6nZhqPISXDQ==","signatures":[{"sig":"MEYCIQC77tgqglta9h3pDw8uxxWDMEZMTOiBGyEzZH6G1aFKBAIhAJ5iq7dfKhWk+W3EXcfpzbjnEAqHB5GtsxynxZsu8eUY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18801383},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1013_1786777741350_0.7540639349196492","host":"s3://npm-registry-packages-npm-production"}},"0.1.1014":{"name":"ugly-app","version":"0.1.1014","_id":"ugly-app@0.1.1014","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"5d05dc3e6742dc5e1127c9eb311aab7b506deac5","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1014.tgz","fileCount":3662,"integrity":"sha512-90CRDxv9NIcLfYHal8O0mT19Eu3ypRA445XxcbOiqD3tOV2Cw1uJREY7JqUf8TXoyhM4i2WO4sVi6gY9NVGYzA==","signatures":[{"sig":"MEUCIHRlPLcF5DbPUkdh2Yk0HWjnxgJ8U1vi/CwAMZMM6LFEAiEA6127CymZtffV7ulndDSmE9t4SM/kM3Le9xxqcOdHl6U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18806202},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1014_1786814816199_0.5591579683943204","host":"s3://npm-registry-packages-npm-production"}},"0.1.1015":{"name":"ugly-app","version":"0.1.1015","_id":"ugly-app@0.1.1015","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"056fa62903b88ae62efe987c140129bcff55ac49","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1015.tgz","fileCount":3662,"integrity":"sha512-yVKqZII3Ns9J1MELI5ui2sliChwFYsfM7AjcsJrbLum6JTncBuPkRXGhKC8sFO58doX3UGdeNLBbrvBd+FWKiQ==","signatures":[{"sig":"MEUCIQCo2eBK/aAEEcXO5ZRU0P/A9t786/YoLh4Gs81azmQMHwIgGu+gOBJNWwZJL4/WfaLLC9MKimrCCYLrt6I3lGEVQz0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18809819},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1015_1786828375829_0.629626215696373","host":"s3://npm-registry-packages-npm-production"}},"0.1.1016":{"name":"ugly-app","version":"0.1.1016","_id":"ugly-app@0.1.1016","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d8a091be477fdde0c1f9352f7b5b7443432a139a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1016.tgz","fileCount":3677,"integrity":"sha512-ErNQNgn2s/I2m3AuYY7MfvKluUvB1ZHxzaVrsAiZQgSQRWckSjsf4bJsL/0m/Z2kuVFknI3f26K14h/VPbIbLQ==","signatures":[{"sig":"MEQCIDg0ClGwh/QPGCnMEF7H98YjKunI53CVUxitFS77iM6eAiAqgtoGFE3OjJL6cmwF3X9QaXn7jp9d/cw8+l6eqwlgsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19003252},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1016_1786835514357_0.24509469612230816","host":"s3://npm-registry-packages-npm-production"}},"0.1.1017":{"name":"ugly-app","version":"0.1.1017","_id":"ugly-app@0.1.1017","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"65df231292c1a1b05b55ad39c57cc333325cf1c2","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1017.tgz","fileCount":3677,"integrity":"sha512-3T09YP06EBcxwSO+h840ZJ6Jkx0fqoKW1KUEgrvVM3ToTs3w/215F/Zdq6JwHU+fFP1tvV7+qLzWzpL+BKPNuA==","signatures":[{"sig":"MEUCIQCvQxMMMyFk9hkcyjShkveGSPvKIdw3YYoAY1pg1uPSoQIgMg6XZbUxnDe9XSDh8Utq+VK9h1fZee0d3S17AGhRUlg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19007841},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1017_1786840776023_0.9173688045576269","host":"s3://npm-registry-packages-npm-production"}},"0.1.1018":{"name":"ugly-app","version":"0.1.1018","_id":"ugly-app@0.1.1018","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0a5153e16f01620cc4d5d0e70659aac1a7a56a03","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1018.tgz","fileCount":3677,"integrity":"sha512-JKTIDlDK+Em8BjoR0GxIr1pFob8lVfPSGhNGJltsCqRZH0wVzRfpDX3fK2tAdhe+MO99NoUW/2q3GzDfFEJn1A==","signatures":[{"sig":"MEQCIG58mVuJxPddbF5bJsfLDpaYIJ65bKltjDt9zGdhp3l3AiBLCufSwOi8xfNr/K/SgSBQrMauK29EUbu9nO/x5ncDqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19009050},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1018_1786841354299_0.8099000724061758","host":"s3://npm-registry-packages-npm-production"}},"0.1.1019":{"name":"ugly-app","version":"0.1.1019","_id":"ugly-app@0.1.1019","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"543fd4fe9a9a46dfd555a9990989252319f9050c","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1019.tgz","fileCount":3677,"integrity":"sha512-PtRVZ9hB8FbHH94P95DQfDZ1NOgjvcLKCDEBDH/YGqMWuKSHCfDJyz6JRy2Om3ZEDIwrBuKkdIuD1OT55qOyDg==","signatures":[{"sig":"MEYCIQCGqyIFnTW8b4E/Kl9s9JN3Y6Y/HmAL9Yuru/IRdpbI0QIhAJgc2ujibH+EqwTQY5MkWv3EPLRSU3NdnFavmAyXjW5n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19012579},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1019_1786902108713_0.13127084419216928","host":"s3://npm-registry-packages-npm-production"}},"0.1.1020":{"name":"ugly-app","version":"0.1.1020","_id":"ugly-app@0.1.1020","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4d3d93c8c1ba2cb4de48d2e3eefcd61bf5ab4c7b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1020.tgz","fileCount":3677,"integrity":"sha512-RC6bTwwEa0XEGPwpV8C0es6GoNfTpCjNH7YrmtDO69yrjWM1UTe8eTDJKhhgycHNWl5cvCkm1q4PsioJP3bRRA==","signatures":[{"sig":"MEUCICslOnOyoXDl5qN3LUmiwMZi2HaVTvFqq1rpWgk0pgRYAiEAs6T1MPFZcKzu4Jnq9E7msENjsxwLaxcIt3NRVR33XFI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19027905},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1020_1786906525348_0.7778390861786202","host":"s3://npm-registry-packages-npm-production"}},"0.1.1021":{"name":"ugly-app","version":"0.1.1021","_id":"ugly-app@0.1.1021","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"1808ee49b5b90b99413a03a13506fed34e6de545","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1021.tgz","fileCount":3677,"integrity":"sha512-m6D0iwnMzGk5m8YhXADAIqcEy+dKhVL2qV/xrlq3gAPSvfW+lcT3ar+35b1TbtZQi73sRxceeerLGND+bWEnYA==","signatures":[{"sig":"MEYCIQCzdps0WhKEvAghn7SfEOFEZVjjOHPH/UBO4G8+cF/OJQIhANuqF5Qn4U2pQhDOlgYnYUtBJrqM2rnPYt5iniIdb22T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19107557},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1021_1787329621345_0.8850596963761044","host":"s3://npm-registry-packages-npm-production"}},"0.1.1022":{"name":"ugly-app","version":"0.1.1022","_id":"ugly-app@0.1.1022","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"4ce28924d76fb92497e823fdd3304c7307d02eef","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1022.tgz","fileCount":3677,"integrity":"sha512-dRzRScFooOTsJs0aXx5aj/oaJvgN0Uv3axv0/rkRjGvfHOX0f1rwV9kkl1fXEicSqNKbJiTfclLd5S1DlQIOwQ==","signatures":[{"sig":"MEQCIFBXwZlsTRBfHggfc5tma2+1I7ZIVOmt6QOCwKbSjmn/AiBbPXYPKy8gN6YT1A/r35WXQlzjh1QasjWTM0Hax8DFGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19108462},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1022_1787336958930_0.8614025474491969","host":"s3://npm-registry-packages-npm-production"}},"0.1.1023":{"name":"ugly-app","version":"0.1.1023","_id":"ugly-app@0.1.1023","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fc49c31dca9e819275253d096c25a4fe0864f529","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1023.tgz","fileCount":3677,"integrity":"sha512-X+tuUGY38G56YLdE5ULmtS8u26iyqQFO5k4hR7xOFkmT2659GJn+YO+EAOc6riyzOwI9rvxJGIJlF/0G6U3Eeg==","signatures":[{"sig":"MEUCIFqNodDt0zUehU3dL5+J/w69vY+uF2JLYlm2z2ChbToDAiEAkYtQfFU/pNDuGA6YwcaWP73No+4iLjLkORtSwPP4sPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19111169},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1023_1787340111360_0.9173268143805682","host":"s3://npm-registry-packages-npm-production"}},"0.1.1024":{"name":"ugly-app","version":"0.1.1024","_id":"ugly-app@0.1.1024","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"66622c4ba701e570d64de9737b66e83ebd230248","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1024.tgz","fileCount":3674,"integrity":"sha512-CG/QOvogkLD3KdQyy9vZzEaMLqUvQmU2CTXZTT8+jb7oOG6eneME+a0+M198aKUDXyM775i3V8GbG3tBwh9HuA==","signatures":[{"sig":"MEUCIQDk6eYxB9Sx93SJ+yU55Ztc+8rG0RADy7T0Z6+VGMfSjgIgOSoo3dVO1hRRbVkg0GBraWQaQZGPpyPVnfTm0omYnsI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18797057},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./playwright/port":"./dist/cli/projectPort.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a89b82de0baed7a83032fc9d959e84979c412aee","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.46","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1024_1787428943565_0.06592068484587954","host":"s3://npm-registry-packages-npm-production"}},"0.1.1025":{"name":"ugly-app","version":"0.1.1025","_id":"ugly-app@0.1.1025","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"52365242e0009dd5c6861ad4e477ee8cd7221031","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1025.tgz","fileCount":3674,"integrity":"sha512-w/n2NoMN9O6A5JQHKLp5J15FeuX+mmDov8apm98p70QN+9bLKiWkHp6V9SbBn23s29FuU/I7epubJlEHI4TK4w==","signatures":[{"sig":"MEQCIBA7iqerc/nAkHKIEbJCD2p91sabHWCx69Y3sfCvKj9zAiBpXv0TlXw/MoPjJsiiElcHrE0TnTMJBL6kbMxoks4NKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18806792},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./playwright/port":"./dist/cli/projectPort.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a43543213d617c58f4a3882e9f39ad43e6accf23","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.46","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1025_1787460458200_0.1191711397665558","host":"s3://npm-registry-packages-npm-production"}},"0.1.1026":{"name":"ugly-app","version":"0.1.1026","_id":"ugly-app@0.1.1026","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"26fa7e21d70052a49ba8d563af45e3b766e9bcb0","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1026.tgz","fileCount":3677,"integrity":"sha512-8U8rCyx8tnlJ8kIFMl+Mj+f7OBI7iDT8mMmFafPDjy/6Y2X5AP6d6P2b/5jd0U/ZrMEMcdSmP94nvqEbGqYH2w==","signatures":[{"sig":"MEUCIFtO51t+0P0WVKfYP8+sfBulqfSKAHSHy/PuNBXQlg20AiEArlGj6zndn3c5TIyd/k6fjkQMzfTR0lsoyGbYpxS1So8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19120912},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"0ef6827876ecc920456ba95fcbb6178bad0ed6ee","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1026_1787507545962_0.5183347091412138","host":"s3://npm-registry-packages-npm-production"}},"0.1.1027":{"name":"ugly-app","version":"0.1.1027","_id":"ugly-app@0.1.1027","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d9282b47b5d16191644347563f48778bf0652918","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1027.tgz","fileCount":3677,"integrity":"sha512-4jycvrCw+B0Nbj0H09a+ZOR17EO8mE3DrzbpstEvTA9Zcsjt4xlafuUpXcwKw4cGKmSQLZ/e+aKF9R6bfpyJag==","signatures":[{"sig":"MEQCIH3ihFArWCbKYM3oa2FoXJMMtZKCoCTdiaMNpnFZA8ZoAiBg0vS2W3tdztxMm0Sd89W2WVEApNycDDuycCkxtSjJ4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19121898},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1027_1787595861532_0.21447756042082577","host":"s3://npm-registry-packages-npm-production"}},"0.1.1028":{"name":"ugly-app","version":"0.1.1028","_id":"ugly-app@0.1.1028","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9faee979bc1dd9cd826598fc5991f602e36a8a3a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1028.tgz","fileCount":3677,"integrity":"sha512-pcdby+PHyRvyjIISn771RkpTUiwtsuyrZzZe1qqbcEl+B0dozvtL294c5ama7uwmjZmO+xuXy9pWqG9uJ2nSTA==","signatures":[{"sig":"MEYCIQDk7r0LBOZNDIYrudgkTboio7X6qiPR+KhCH332vRw8vAIhAJdiIkmyxWmW63ECaKHlYSWc+4lXwsm2DyfJsticLU3b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19123560},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1028_1787604730892_0.6910311707526691","host":"s3://npm-registry-packages-npm-production"}},"0.1.1029":{"name":"ugly-app","version":"0.1.1029","_id":"ugly-app@0.1.1029","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"36501c6ede83e5438be5f0fd450df2b1c7c821f6","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1029.tgz","fileCount":3677,"integrity":"sha512-vlECztveq4B6oibkrw9Z/yUmCvBqh8VbmItqmA5p7MYHrq+vXn1fjd6ygeibnpIAyvswJX/gu1T9pK0DvzHc9A==","signatures":[{"sig":"MEYCIQCtc7kRAMt3Lbxfq2opJzTzNuGgr7/+kiallndZLuYZVAIhAOrkP437UEZiQOx3N+mfFVreKoTKhi9OS1XAJRnjJ2zp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19124790},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"af0f73c59269fdd5773adf3c83c024129f76af90","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1029_1787758826880_0.26124104928847314","host":"s3://npm-registry-packages-npm-production"}},"0.1.1030":{"name":"ugly-app","version":"0.1.1030","_id":"ugly-app@0.1.1030","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"a987ce77167344e129d23243eea4535a693c1f9d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1030.tgz","fileCount":3678,"integrity":"sha512-5xi4SYC8XYBKHBvGRGZ1SYVwlHORMaNYDWBlbZ8otauqdwjpNcedpziCUYrKsyLrYhxWQxKr1B7mO1zAbmRauQ==","signatures":[{"sig":"MEQCIGG2CTs55YlEj1i3n+FmtWp1cHFoagk3vToKVD6jQd3YAiByYCiQp9rf3852i8o1GFjGnqgAyxRkymR3y0Gz/bdl4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19128529},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"e45f903a0d7cbd544c8a5babced90a0f55b158bb","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1030_1787802476968_0.19102722153014007","host":"s3://npm-registry-packages-npm-production"}},"0.1.1031":{"name":"ugly-app","version":"0.1.1031","_id":"ugly-app@0.1.1031","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"7070a603d6dd5eec59aead1921c806fd2265c19d","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1031.tgz","fileCount":3678,"integrity":"sha512-675joAyYIoouFHPV6QK4RKq3z9YtgwaOYWW4ZZ7MwhIWlCE7VspjlQ/pNm/HTzaKFABgMXpgxCdZzGRWkZo0/Q==","signatures":[{"sig":"MEUCIAq9pYc9fcU4Fsro7QeiYi+EAJzdxc2VCJ8IFtqgKHjiAiEA7+7hRNzSsXWeCgHOiP2EIZgvLaXQg45ULgoyjTxkfqA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19132933},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"acb403e97d7f8057ebfe3341aa1d9e34ae66b8cc","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1031_1787805922598_0.2001046803687716","host":"s3://npm-registry-packages-npm-production"}},"0.1.1032":{"name":"ugly-app","version":"0.1.1032","_id":"ugly-app@0.1.1032","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"3c53cd734193b65560e2809ac2a02e1d7439c22f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1032.tgz","fileCount":3678,"integrity":"sha512-J9TTqRjmCCeP7JptbjuIXCEhqszYqZVJgDdKsi2ls/zzi99YpZ0N+rP6epSstkUGInKTbcytl+uwOGxpth2DXg==","signatures":[{"sig":"MEUCICEpXKbtxgHOOPTQNTYXAMcAVE3KDRBStw5AW4j+ZRVkAiEA9kdkG9mFHeBXtIjNMLyO0B+V3UMwDnWRauOK6t7Ojlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19135557},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"c426f434c9ab0fcf453561d267fea1f5050cf147","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1032_1787809767285_0.2952848674807431","host":"s3://npm-registry-packages-npm-production"}},"0.1.1033":{"name":"ugly-app","version":"0.1.1033","_id":"ugly-app@0.1.1033","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"ddd4814cf12f67a1e33c70cce79517d4c9fe1975","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1033.tgz","fileCount":3678,"integrity":"sha512-1aMuYz2xWIV7aASi+08me1UJb/xIO+Es2QaY9FXREVDNsoifQxEYjvH05aJ73D4CQBbkDAX20c9+ABFZGxLrxA==","signatures":[{"sig":"MEUCIQDXjecW1PbaApCukcLs9v5Ve6gm5M6YH32JPW6iADLn9QIgXGPXMGdDP0w2k5BNFlQ/7j7ciFiXfM5otOVmXHDv0L8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19138219},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1033_1787893258584_0.8198086194375696","host":"s3://npm-registry-packages-npm-production"}},"0.1.1034":{"name":"ugly-app","version":"0.1.1034","_id":"ugly-app@0.1.1034","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"fec12798512b724e203a99203d28984659b51b2e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1034.tgz","fileCount":3678,"integrity":"sha512-UYh1Fuxf7YXu5sPg2+OMpZaFikfwSPVwH0a6GL9+I7GBtMucYEQkcEaSe/1hWkjFfpl91AG0Ppr2pXmVxijw5g==","signatures":[{"sig":"MEQCIDuf+VWjFSUYfAMvUk0ShG837+ur7dXYcz1SWtilvbjfAiAJvkIjgnmV1aMjynvYHpshnKpKWnSMDb9ohWw8uLPMVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19170012},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1034_1787895692411_0.26805648185323605","host":"s3://npm-registry-packages-npm-production"}},"0.1.1035":{"name":"ugly-app","version":"0.1.1035","_id":"ugly-app@0.1.1035","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"d9cb607ea7826b19e6f578410e87bc804d593ed4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1035.tgz","fileCount":3679,"integrity":"sha512-B8mGkc5i/ZwegMyIgOzPySniRyI/pMnBfXRbpad5v9vlr5HPR+6GP8oJL5m0aXLiTwxoi32uXpK1XyOWI5TB9Q==","signatures":[{"sig":"MEYCIQCEep+WzRRR0CuwB1SiwIwIZyDl+fYchtMG14F2nSm1sQIhAPLcBs46dHIBZ7XKlmfN3hDPZX/W3aHGhyPvviGPWrkD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19176854},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1035_1787936604800_0.07239277525899324","host":"s3://npm-registry-packages-npm-production"}},"0.1.1036":{"name":"ugly-app","version":"0.1.1036","_id":"ugly-app@0.1.1036","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"8c87aff6750ee259873ec2f58f8c3d2f4049d849","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1036.tgz","fileCount":3679,"integrity":"sha512-mxOstfy+8FlQH8+bNxvKKFPCc2D8GvUvjl+6XmRzqGVzBeS4sEWOkCMtygodq4muSWa3Xk6A+zvk204Txi8Rrw==","signatures":[{"sig":"MEQCIAFTS4UWNUytgWcT43G2hnJ9zeogUH1s7TssPMxkO70gAiAC1LyZ3UGtF9UYxhZSaDP+pb+NAqOoAQ5NI9Sy8qGaJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19179523},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"a08f0895910cf26f298558f67c8085cf7ba3f6da","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1036_1788146570628_0.4206736390623236","host":"s3://npm-registry-packages-npm-production"}},"0.1.1037":{"name":"ugly-app","version":"0.1.1037","_id":"ugly-app@0.1.1037","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f92f921bf7ba3dd65c31e7547eaa6445c9057fa9","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1037.tgz","fileCount":3679,"integrity":"sha512-ANnAlaulnTMjdNO1JlwOab8nLwUnUxTc4Q/klPUu08ReAVTz8rQYmc9yaHObNkAXu0Jhkrgkpn+MIFSFY40NTw==","signatures":[{"sig":"MEUCIQCFBXYnHMh8iDdGctHv4MaWVkF7uILSjorNJDt6GLJeKAIgDpnxqTp6hdz2VL9pwFnoZpx9Mz6juKqvEC8xJ9ztgG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19183757},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"73576b4396ee7cf2041a3e5a179fcc7ea4505751","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1037_1788152576779_0.9188371325355382","host":"s3://npm-registry-packages-npm-production"}},"0.1.1038":{"name":"ugly-app","version":"0.1.1038","_id":"ugly-app@0.1.1038","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6d7ac8f9d6d88c0f55e83a07eaebc5816252af4a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1038.tgz","fileCount":3684,"integrity":"sha512-BX7kiyU2qgnJeOOgbwhqlv249JcBoC5iYvgcFx/6lk9fBLIf18yO6QSqduwXYULgp2yWvW9dF2vFaewjHJ50dA==","signatures":[{"sig":"MEYCIQDL0DWqyF9p0bX6rtQwK/h6GtGmOAgiLORqeheKfEartQIhALRRX3YR8QeqB2s9+qfdvJEl55swLat/Kvne29NGQ4Rc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19191603},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1038_1788844578057_0.8087268001060413","host":"s3://npm-registry-packages-npm-production"}},"0.1.1039":{"name":"ugly-app","version":"0.1.1039","_id":"ugly-app@0.1.1039","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e97ba22e4a93aeb3a39fb7c47fc79645bb34ebd7","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1039.tgz","fileCount":3684,"integrity":"sha512-k33sxGBfIGHV1yOKwwrpjSyyiqyULfYS65jpRrHK0CS6bn/a5TOvZgKyMTG72ITTtkGaNbKzEWoEd6YXtssUDA==","signatures":[{"sig":"MEUCIQC3JUcohbhk3LmPQCIPJtS4Oz4X6/319633zjQKJHUG8gIgY1WcASP5PBVvUCRt/0ZyOzx9AHSDtvllSPbT5iD+Dxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19192792},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.45","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1039_1789010316946_0.12958558207821946","host":"s3://npm-registry-packages-npm-production"}},"0.1.1040":{"name":"ugly-app","version":"0.1.1040","_id":"ugly-app@0.1.1040","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"07855d31e760f3d990578b090d06cb3503125498","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1040.tgz","fileCount":3684,"integrity":"sha512-CVousSEnQAT4v9BQ26L09thGbPyvyvuy1oUIr97/DNrrYaaFVR6mWSVe89v62np3D4OveE64lneKy/8x4tm/Pw==","signatures":[{"sig":"MEUCIDsrmOa18eWUcr9XdftvWz8RbIqPYrj6jeBG4T1kwlouAiEA83KHISPURMmhZa8pnt8rQUjKTAn1FA34MsLry+Gmyf8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19197752},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1040_1789219759747_0.44147924572820196","host":"s3://npm-registry-packages-npm-production"}},"0.1.1041":{"name":"ugly-app","version":"0.1.1041","_id":"ugly-app@0.1.1041","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"df80f566c8458f05d106bcd0d1555dd8d6dbf0ff","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1041.tgz","fileCount":3685,"integrity":"sha512-PxTL8vJNmeAAi9oapSTUB7U7ypQfl7n3D8QzIofhnO6MxL81sql2j2bMsLlzz1K/Sph9eeHqMXrhaT58yBHoUQ==","signatures":[{"sig":"MEQCIHEoqEBH+W8aCppAn1y3hlX+ifYBDkJJH7xnhHndXsD/AiBD0ubyTmNtrLPMRFeOQgPPrtHIvCemokAx7Xw56/HNIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19215890},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1faff007dcd08791294bdda2149b7dc261f76020","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1041_1789238244852_0.9940418444589654","host":"s3://npm-registry-packages-npm-production"}},"0.1.1042":{"name":"ugly-app","version":"0.1.1042","_id":"ugly-app@0.1.1042","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e5335803b4e3fcad4daba82cd2a0ff3a0f34e440","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1042.tgz","fileCount":3690,"integrity":"sha512-Jk4J4DJfWdDK08giFpxs/BlBT7uRVJ7C+P9d9syktdUqIkBtyG/V83UMfwD1oWhvHJm/mcRWuV0kZ3cG2BuXAA==","signatures":[{"sig":"MEUCIQC7ppxM7kjje9Lz8rUnIRJma+zbN5cGxtY04vFe5piYZQIgJmIgZgijFgv3zgBlqHN6DVo3ZTAUVVYzpJ1PmUPMpBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19250544},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1042_1789252333945_0.7780940379389982","host":"s3://npm-registry-packages-npm-production"}},"0.1.1043":{"name":"ugly-app","version":"0.1.1043","_id":"ugly-app@0.1.1043","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"e889909b923c83addc534590399e01394fdd7446","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1043.tgz","fileCount":3702,"integrity":"sha512-YXO7DzZhhjGMpHa64XFqZty8nHsnHjvPMoOQ1m72xROVf3erqAdem3fFtHYyE/LWpezdnBc0eQKz1jEDAU1koA==","signatures":[{"sig":"MEUCIQDKl1Lxjr05UpznMLLyV3kmv2YVZXaLaoujWqoh8sV5qwIgXpPFJMrIJaRv4lLnwETdzpnIq1d4N7IlGz37suE3K5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19336215},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"60315c048b0976bf747b58071226f811b1fec808","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1043_1789319980819_0.28714847285293077","host":"s3://npm-registry-packages-npm-production"}},"0.1.1044":{"name":"ugly-app","version":"0.1.1044","_id":"ugly-app@0.1.1044","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"02e213bf980de975fab5315e46a0d47f04ef4c19","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1044.tgz","fileCount":3702,"integrity":"sha512-5zgu21As8pF0j4WOIxVmN0CWGgvHLYAkA0/QkErcvQfmoBIk1WtrLCuG3J4Ju0k+CoU7FhCaA4qC1msovkTKMw==","signatures":[{"sig":"MEUCIHUnsqHG6J2gZlh7hRSoInxcXrQFkZf3lnIHwC9aduzuAiEAgy7ZZ0PSPZFYVetXSINd/hc/DVBo/o3jRHjIa9ZkZ1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19336383},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f2b0383abb6a794bdeb7740a9a159db593541ac0","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1044_1789321359429_0.8109891859845964","host":"s3://npm-registry-packages-npm-production"}},"0.1.1045":{"name":"ugly-app","version":"0.1.1045","_id":"ugly-app@0.1.1045","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"272a2b77ff15590045ea85e6dbdbce4b992e0704","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1045.tgz","fileCount":3702,"integrity":"sha512-BIFpmGYQ6wOzZa0LeWPIUwVEjUemcEf6w1/vi4KRay6/aLsxq7umejuwfLOuIRAli2AEM18LjBBd/Z7nUUzX5w==","signatures":[{"sig":"MEUCIBWkf1YT8CoSGGIaiXazbkOx8hxpWctlC/eawXbtKv5WAiEAzman0uVjyltQVFrY3Y6nm52Nnc99mVJjz8NoGjwc3js=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19337631},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"d4769ffe126ea931b3efc392d30a71b8959a5f8c","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1045_1789321556529_0.561419228176292","host":"s3://npm-registry-packages-npm-production"}},"0.1.1046":{"name":"ugly-app","version":"0.1.1046","_id":"ugly-app@0.1.1046","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"47721b3783ad777fd74505649c0065180338c40b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1046.tgz","fileCount":3703,"integrity":"sha512-q5ipR84pOjd/Rxnk5n+AW/S+evr8/hjOKGVJxcYMyxeUbpGTf67fsVsA/+1FaHik0jBQUMm/2Hsu6fBM++fqFw==","signatures":[{"sig":"MEUCIQClLqkJnAaaJT/m3HzyFqkl2rjlrqMtvB4jK78itZlp7QIgIIB12VqMYBbh0jE0dqzA3OgICJ2Su+xJOHXvJbhtikY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEUA/k1A2J2pIJpr1/r9niB30u5kdDFWMPxJadH5SQXHAiBTbFCIPxYfyLGoSmzi3rpxaAMo9hmVe/jP/AlUr707pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19347124},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"22b294491c5b69a8308b3a411172f6d56f6dd3d4","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1046_1790442359367_0.6290646503508817","host":"s3://npm-registry-packages-npm-production"}},"0.1.1047":{"name":"ugly-app","version":"0.1.1047","_id":"ugly-app@0.1.1047","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"bd98aea93955b1001315b270e0de7c1fab0e0bfc","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1047.tgz","fileCount":3703,"integrity":"sha512-3mQMLIvmPjQgYK1GeJI+urOm41rREUpnK0b1uQC4PEAqyQdftOoc8gV2BI96QwE9rB9zv1uzX+pJc9SPPFhZ2A==","signatures":[{"sig":"MEQCIClFzmr4YKjz7EuufrbrSh1OgkvH++vL+oM72702hgZvAiALc7XmoXNzEjqflwUXDIdyo+P/uwaC7eHaamNxHHKqCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDLvhcO9aUIJCOFA8xDMy/cx5parCJEAumNowhah3iyOQIhAMctIB0opi8aOtkxz72tVNdRfI57dGXzyjFLlnjPwbnR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19351650},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f01a6f11831c4a7a0c22218e9cfc935dc15a8130","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1047_1790444654194_0.15075085617244444","host":"s3://npm-registry-packages-npm-production"}},"0.1.1048":{"name":"ugly-app","version":"0.1.1048","_id":"ugly-app@0.1.1048","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"45f185b89dedc2555df7c91bcec4f07886b1a3a3","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1048.tgz","fileCount":3709,"integrity":"sha512-2Tpjeu3hZs6JTLdwhtblx4seA8DgESDaJt1sEDhSnOEkCj7N9XcVtjU8/tWrLaZlVtrFY35Fspm2FA5FQNk18A==","signatures":[{"sig":"MEQCIEaGGMnBFYzRwVAazAbRRjEnF+kZwPpQSa9/VhoAsc+HAiA44UFUa+W8bUYRUG+cGjrHX/kHGqBDbuS9/T3BY0Zdog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID/uhRLHC2jz3DTT267popOcutjrqfGvlr7S49N1e2Y0AiBJ9o9du94UYZALpIQ2mK4vwny4zdt2nTe3Pr/PWA4Jjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19375135},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"2c11fc448301346c3dcd602aa9a15e6ba4c1673c","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1048_1790470686286_0.8666849525034925","host":"s3://npm-registry-packages-npm-production"}},"0.1.1049":{"name":"ugly-app","version":"0.1.1049","_id":"ugly-app@0.1.1049","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"49b30e1c40f2549b32be68776408bbedfc649baf","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1049.tgz","fileCount":3715,"integrity":"sha512-8XIxyx8IoCZfK40BjA6UBV3ZIZEK2Q0Xj2b/0KtD9cBKMzgRZ/tpE6kefAPAr6/aVLDROj926tsd3/uK48o/Vw==","signatures":[{"sig":"MEYCIQDiGJYkauTR64Re8eee0ohyVCUe8m7wSiWQXb7g0q+tzwIhAJeHqvorx2IBSFufS//vMRESJ+XylyDfRHaWancNewtx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCa3SNOoO8wgYMFen1Th8mRpU2UR+kZrbMSnIPzZxfrZQIhAPPxvTLdihW7YS2iFrOrOAXYMbbvbl+bc1+Y0WO4WNxb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19386653},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"f75bc8abc9bbe4907c25ca92e7af22d0547ccb57","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1049_1790471484337_0.7919226228662226","host":"s3://npm-registry-packages-npm-production"}},"0.1.1050":{"name":"ugly-app","version":"0.1.1050","_id":"ugly-app@0.1.1050","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"25dbbeea1e6a5ec42963568e1b511826c89cca0f","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1050.tgz","fileCount":3715,"integrity":"sha512-rLz1w4GMsLXBS559rUOcnq3WzVsnCoJHAVP+g1awiq/D6WxGgBPXvc2S3K4jkdfW1bMx+oUqAxK48qelmCbGaQ==","signatures":[{"sig":"MEYCIQDJ0t3yJAJoeI1VsMdqRdMWoK6/ON+Bp0q0XTH0SE677QIhANNd0LEdX9fg+zuPLgNLHC4wkaq30YqD2DGy2RjDuXr8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCwx41d4bk0elsXDjlcNkag0JQTbCVf5O7eD+R/BCvpnwIgVBfkUCr5V7GJP2v48q1B6QpW10q8xb9w0RbyKD94Voo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19389413},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"3db926f163ce754ac9240e70dfafa8d44aa2183f","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1050_1790472380660_0.8710502562989844","host":"s3://npm-registry-packages-npm-production"}},"0.1.1051":{"name":"ugly-app","version":"0.1.1051","_id":"ugly-app@0.1.1051","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"724eed6b229abeb16b0072a24e0054f9cb9bdfc1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1051.tgz","fileCount":3715,"integrity":"sha512-ZteNJZhWvNjV/cmhcFKgquYtaP13OjQQUKA4tb00j9kU++yEzYY2LXYIZ3gxoBSKXvYskelIFapjmnExVntj4Q==","signatures":[{"sig":"MEYCIQCvDsk3Rf2u3taBPJTJYf0q2wWHX9+G7+b9toPjmPJcnwIhALD79CguNZ+sbZkeW1bCTpb4ehPf3c1S3BD5X+j5BGBZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD9kGwKyKT/2S5ge8MYL8vm1TNvka60OWr578qMNB2z8wIhAPtwJNC+CB606UQfvboqOcIkRKOB/4qBTQiL4wwe1OQI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19391724},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"98a6c075d34bd28fb9725d3b9dcda5cb9f98a1a1","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1051_1790473034728_0.44779066072952833","host":"s3://npm-registry-packages-npm-production"}},"0.1.1052":{"name":"ugly-app","version":"0.1.1052","_id":"ugly-app@0.1.1052","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"f1eecc9827f2fc8e58d43ec1ee13005ec74ba694","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1052.tgz","fileCount":3715,"integrity":"sha512-iODDimEiGR1vwK5UaOfJghRoHxJXhQPj/rv0AHO+A6rXiCaSMOhdQlY+aziztSOkF3U6cvIVN9mRmfsB5oKDOA==","signatures":[{"sig":"MEQCIEzxz0ij4+hPU3RN49tDpXhYeDGIt7QqgILqzU3bzHuwAiB0djUmDsgSMPn/2XIBP2hm0tvBomjkxfKnzH4xP/CEyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICBeOvJ2z+bbxehxh0+ejm1L3xbvLXjbEkmmHJydCGYCAiEA9ucepn4dCSLJxR/i33YgvvrG1MW+s/Oxo3tDOfvb1hs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19399577},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"5771312e61d1d4ec8890b035e417ce9868c00df0","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1052_1790475174612_0.7931955887728686","host":"s3://npm-registry-packages-npm-production"}},"0.1.1053":{"name":"ugly-app","version":"0.1.1053","_id":"ugly-app@0.1.1053","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"0d9046ce39d8732fb6c7e21b6134835780ce411a","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1053.tgz","fileCount":3715,"integrity":"sha512-FKDo3KRh705zDWkEl4ul9pme/+kq1HkcI0qfPfd5PsrfUvFh5fhnik5uciKZRxqhmWGvH+u5yi1Awpd2Xy7JIA==","signatures":[{"sig":"MEQCIB11NW/Ktmq70h+ozRUhAKRykCwaErwnT8KzTyEs0FmiAiAev/Fdap+c300KsS6ce1CO7Wu1KeyG9qXlJwoULvKVBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD4U5xzGcVtXkLJGWYHw5taE3UjuHbJ8E6ltUBDN9J8wAIhAKoEzg5+UsJE4Z8WGHv00+JbLQyr2VeERdcigcQu0R0Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19403333},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"708c8116fda4a01492e82a49e030833eb472690d","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1053_1790478530183_0.7160153889690306","host":"s3://npm-registry-packages-npm-production"}},"0.1.1054":{"name":"ugly-app","version":"0.1.1054","_id":"ugly-app@0.1.1054","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"b1e564d5ab1dabeda9988c43504123771be43eb4","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1054.tgz","fileCount":3716,"integrity":"sha512-V1SoQKYLOL4ygEjv+pNAseQQp1SdsGcssABws1Kmjth2ROjP6qevk/O96UoJdEQSYXHacSOkZ6VJnHLvmSqhrQ==","signatures":[{"sig":"MEQCIFcUUUARU584czyhTB8xxtcSWl96rpLeKNoKxp9NodQAAiAIOGR4HXPVVrTj9vv35rDOuUR7EMF/UXpbes9YcCciGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCMVdRuDk96D/A1FoqKZjSW3VQGTmYzMaeCr1GPcpMkHgIgB/V8ff8jY2LO5as1VmnkMw63AqROXeTKCNSefdZw64M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19432787},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"eeb3760c931785a3e7821158691c85ecc4a0cdf2","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1054_1790573946960_0.649842567726141","host":"s3://npm-registry-packages-npm-production"}},"0.1.1055":{"name":"ugly-app","version":"0.1.1055","_id":"ugly-app@0.1.1055","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"58ca382a2eca6f5cb1b6500c7a8d25f9e7ac1180","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1055.tgz","fileCount":3716,"integrity":"sha512-5hgkHytVD+R8JiqhH7N7aIwzeUo9+efgRrk4gKRQjD47JpLnggMc2YzfvxtvpfTROLDOknK8I6IrdjCzVctHFQ==","signatures":[{"sig":"MEQCIHPep2Fq9A7XjEbgs366jwzqZswyVdA9bw2kLm4Wfn3xAiAUPEU4VflGHuhAEMK1DF8mfaXnDz7XXiVxT8U0A9fUiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEKqMjoE9JIidl4kuvHPFENPa8+EHA8udK/4t1HX2FOAAiBHLIj9lItIjPRYYwtW/K8x86ZBv66gqEr31YYmQuDk8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19447545},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"effa55fdc029458d086d0779073a3944412ae258","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1055_1790575889005_0.2023319585120289","host":"s3://npm-registry-packages-npm-production"}},"0.1.1056":{"name":"ugly-app","version":"0.1.1056","_id":"ugly-app@0.1.1056","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eb58fe2b3ad6457ea6a96fecf1241b3da7e66104","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1056.tgz","fileCount":3722,"integrity":"sha512-iLbzTj8NApO54OI0dACuyoeoazu9VM9WQga/UFfR2wqYE4PZ02zXaRflg8MN2uWNOOhm/nPk3juKo/Cxr1nRPg==","signatures":[{"sig":"MEUCIHJncVVDu6BtpOGpaKbR58FCPwSbHPaRk7PqPy6UG75nAiEAvpcdT3edZdP4RColr7xM1j9RESYt1ucZFKgSXmo4YsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIG9oPm9w+SZaTQ/76CWXoKgnfOLegYfjU2dmftZ8vHHFAiApEY3tNvHH8mXQuaDmmbck5bgq4yum6wsBNy1eInvIqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19465787},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"10c2db3f98d682afd5c175d2afee9833d5f6a825","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1056_1790577165457_0.44349342884155973","host":"s3://npm-registry-packages-npm-production"}},"0.1.1057":{"name":"ugly-app","version":"0.1.1057","_id":"ugly-app@0.1.1057","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"eef552aecb3fd9a0f856c5b72677ae10baaa794e","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1057.tgz","fileCount":3722,"integrity":"sha512-aZexZv8InPnyXDF6RpvRWLlrTcvkSQrUx9GMDBWCEG4xtFVhfxDiiiMeLRxJpqJkFSH4Y1bKC5gEiPipzA7zYw==","signatures":[{"sig":"MEUCIHn71RedgTONsb518t1450hEEPrLAZJWT05FC4GTmbUyAiEAufJRv2Ydo6dk8tLUQmrucprqtWWjOsP+B9dMtVmluVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIA1671v5qaJVbc9FL5KTS/W/XsNJGyd1jwt5c50GKWKKAiEA0VMMcqXlZIrJa86Bjc5aNAsq4wf2DJdFkYaP+ScgmJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19474509},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"726540f264588b462369a00931ced92e692929c9","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1057_1790648333006_0.43903392621891246","host":"s3://npm-registry-packages-npm-production"}},"0.1.1058":{"name":"ugly-app","version":"0.1.1058","_id":"ugly-app@0.1.1058","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"9730c2dec8b08705cac50be5625e1bc60a60d3c1","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1058.tgz","fileCount":3722,"integrity":"sha512-Zh57puzFcjGwmmHHmkd1fSEEFVi+i/mLTwwaEGsLq6Ne6dXRc9u4iJH6N4EA9PraW8VwQvWwZPz0Tz0444Q0EA==","signatures":[{"sig":"MEQCIDJ25N7pssWKAAUT8hsH2vrNGNgYKIvYDt/5VTrIWfTlAiB3ze4FAGrs2WIdEQEGQOCmFF1H0ZVaG/DRvb3ZYX4+gA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8vNbuOsjJbc4GwSkHBBymz/agtlw3uW9BHg29JkVxHAIhAKV9ec1z4MyoI61da+zrDKr+VpWdnErQ+mNsKU8QhECh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19476755},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1382cc8639b591152267fbd0700ef88fe79d5326","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1058_1790649538684_0.35925012588736616","host":"s3://npm-registry-packages-npm-production"}},"0.1.1059":{"name":"ugly-app","version":"0.1.1059","_id":"ugly-app@0.1.1059","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6ec136a707da81fd87ed6cbbf6528ae4b71aec25","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1059.tgz","fileCount":3728,"integrity":"sha512-xgB/8DXJ8HyJ/aVJRZ05ACUpJD7lpcQXyEnTsqG3AJgidHN39Cw8K12zKG/wz967qcC1KpBl/2FOYfnmYhzA3Q==","signatures":[{"sig":"MEQCIFSfbuR7qmV/Sy32HUet21iwErUHqMurMYLeUe/Z6Vd/AiBfQe0vpJch5J01ywnIGAxz0/Qq21j8CeXw6I2ibxkH+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICghRqSaBudhXBz4MyrbUmA9MjVGRJ14/f62f7gyzX8UAiBoaoqt/tkJu9AHyIUzapkmdRbFlViv9SGJf15S4wJQ+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19490075},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"1382cc8639b591152267fbd0700ef88fe79d5326","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1059_1791059236754_0.4458458600928139","host":"s3://npm-registry-packages-npm-production"}},"0.1.1060":{"name":"ugly-app","version":"0.1.1060","_id":"ugly-app@0.1.1060","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"6c5f1dfb88885d653a62296a9b7cbbc607ed6059","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1060.tgz","fileCount":3728,"integrity":"sha512-UX7KmsMwXuf0YkmgDlqo97w6Uczmc2Ti1Er1S8FqX0conWtfxq3FDXSAC5n5XTpCdFKH5ODCNLsThyDI5MOyiA==","signatures":[{"sig":"MEQCIF3wMWt+BlIaR1UYe6clp6Ru42f5e+sFvvxk8Wd8bVZKAiAKIe4/qhnyIBjU8nmCDQdlpRRuW+0OcRkYpcknRo/AGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFhs4KoX2oSFPFi3Qb4fnFMJtqBOddJ5K3UCJ9bV0QTbAiEAuID2BwGCEXIgq42RnDjb5m1pcnBowLiPVjzTaQ2/wc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19491779},"main":"./dist/server/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"51aa2e589e2d39909cf2ef3f8ed8979e3420a2e3","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ugly-app_0.1.1060_1791060379028_0.2892357703111137","host":"s3://npm-registry-packages-npm-production"}},"0.1.1061":{"_id":"ugly-app@0.1.1061","bin":{"ugly-app":"dist/cli/index.js"},"dist":{"shasum":"229afd36b24d69baeb29b7fce9da778ff173456b","tarball":"https://registry.npmjs.org/ugly-app/-/ugly-app-0.1.1061.tgz","fileCount":3729,"integrity":"sha512-qHyb6Tx6GioIRV0I8vTAFpNhkN75ATp4ENyf9Lhwc70p0aMeBIX5PYhy1BwqS8AfdMJ7cmKkvHd+nzicbd/snA==","signatures":[{"sig":"MEUCIQCYAb2STO90SxE7obtfvEoIZV0KawwjE+fGcznHLbAWZAIgEytfguWvpVzlXGRsIH6ow52L70IBSm68Qf+msPfC+v4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCaQnlDGjJC4yOTuX1sWEuuWMdlxmwkA2zCXYKLj9gXKwIhAK2KShQFs0UkDnFbXbO3G6WTiddN3Abps3W5RFMZBSZC"}],"unpackedSize":19495065},"main":"./dist/server/index.js","name":"ugly-app","pnpm":{"onlyBuiltDependencies":["better-sqlite3","bcrypt","esbuild","sharp","onnxruntime-node","workerd"]},"type":"module","types":"./dist/server/index.d.ts","exports":{".":"./dist/server/index.js","./vite":"./dist/vite/index.js","./client":"./dist/client/index.js","./eslint":"./dist/eslint/index.js","./native":"./dist/native/index.js","./server":"./dist/server/index.js","./shared":"./dist/shared/index.js","./webrtc":{"default":"./dist/webrtc/index.js"},"./worker":"./dist/worker/index.js","./inspect":"./dist/inspect/index.js","./testing":"./dist/testing/index.js","./inspect/ui":"./dist/inspect/ui/index.js","./playwright":"./dist/playwright/index.js","./server/ssr":"./dist/server/adapter/workers/createSsrRender.js","./cli/publish":"./dist/cli/publish/orchestrator.js","./menu-chrome":"./dist/shared/menuChrome.js","./agent/client":"./dist/agent/client/index.js","./agent/server":"./dist/agent/server/index.js","./agent/shared":"./dist/agent/shared/index.js","./three/client":"./dist/three/client/index.js","./three/server":"./dist/three/server/index.js","./collab/client":"./dist/collab/client/index.js","./collab/server":"./dist/collab/server/index.js","./inspect/agent":"./dist/inspect/agent/install.js","./native/server":"./dist/native/server/index.js","./search/server":"./dist/search/server/index.js","./search/shared":"./dist/search/shared/index.js","./webrtc/server":"./dist/webrtc/server/index.js","./character/game":"./dist/character/game/index.js","./client/overlay":"./dist/client/overlay/index.js","./markdown/client":"./dist/markdown/client/index.js","./markdown/shared":"./dist/markdown/shared/index.js","./character/client":"./dist/character/client/index.js","./character/server":"./dist/character/server/index.js","./character/shared":"./dist/character/shared/index.js","./cli/publish/types":"./dist/cli/publish/types.js","./native/conformance":"./dist/native/conformance/harness.js","./conversation/client":"./dist/conversation/client/index.js","./conversation/engine":"./dist/conversation/server/engine.js","./conversation/server":"./dist/conversation/server/index.js","./conversation/shared":"./dist/conversation/shared/index.js","./inspect/host-bundle":"./dist/inspect/host-bundle.js","./server/publishFrame":"./dist/server/adapter/publishFrame.js","./cli/auth/credentials":"./dist/cli/auth/credentials.js","./inspect/agent-bundle":"./dist/inspect/agent-bundle.js","./native/server/binaries":"./dist/native/server/binaries/index.js","./server/adapter/workers":"./dist/server/adapter/workers/index.js","./cli/publish/secret-storage":"./dist/cli/publish/secret-storage.js"},"gitHead":"51aa2e589e2d39909cf2ef3f8ed8979e3420a2e3","scripts":{"lint":"ESLINT_USE_FLAT_CONFIG=true NODE_OPTIONS=--max-old-space-size=8192 eslint .","logo":"cd assets/icons && ./logo.sh","test":"vitest run","build":"tsc && chmod +x dist/cli/index.js && cp src/markdown/client/*.css dist/markdown/client/ && mkdir -p dist/cli/publish/recipes && cp -R src/cli/publish/recipes/. dist/cli/publish/recipes/ && mkdir -p dist/native/server/taskHost && cp src/native/server/taskHost/*.mjs dist/native/server/taskHost/ && esbuild src/inspect/agent/bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/agent-bundle.js --footer:js='//# sourceURL=ugly-inspect-agent.js' && esbuild src/inspect/host-bundle-entry.ts --bundle --format=iife --platform=browser --minify --outfile=dist/inspect/host-bundle.js","pretty":"prettier --write .","release":"npm version patch --force && pnpm run build && npm publish && git push --follow-tags","prebuild":"node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));require('fs').writeFileSync('src/cli/version.ts','// Auto-generated by prebuild — do not edit manually\\nexport const CLI_VERSION = '+JSON.stringify(p.version)+';\\n');\" && rm -rf dist","test:e2e":"E2E=1 vitest run tests/cli/e2e-integration.test.ts","test:full":"pnpm run test:parity && pnpm run test:e2e-pages","preinstall":"npx only-allow pnpm","preversion":"[ \"$SKIP_README\" = \"1\" ] || claude --print 'Read src/server/App.ts, src/client/Router.tsx, src/shared/Router.ts, src/client/AppProvider.tsx, templates/server/index.ts and rewrite README.md to accurately document the current ugly-app public API. Cover: createApp/AppConfigurator, routing (definePage/lazyPage/lazyPageLoader/useRouter/openPopup), auth flow, TypedDB, AI providers, storage. Then run npm run build to verify everything compiles.'","test:watch":"vitest","dev:workers":"tsx scripts/dev-workers.ts","test:parity":"vitest run tests/adapter-parity && vitest --config vitest.workers.config.ts run && vitest --config vitest.e2e-workers.config.ts run","test:workers":"vitest --config vitest.workers.config.ts run","build:workers":"tsx scripts/build-workers.ts && tsx scripts/check-workers-bundle.ts","check:workers":"tsx scripts/check-workers-bundle.ts","release:quick":"SKIP_README=1 pnpm run release","test:e2e:full":"pnpm exec tsx tests/e2e/full-e2e.ts","test:scaffold":"vitest run tests/cli/scaffold.test.ts","test:template":"node scripts/test-template.mjs","prepublishOnly":"pnpm run pretty && pnpm run lint","test:e2e-pages":"playwright test --config playwright.e2e-pages.config.ts","test:e2e-workers":"vitest --config vitest.e2e-workers.config.ts run","test:character-gpu":"node scripts/character-stage2-gpu.mjs"},"version":"0.1.1061","_npmUser":{"name":"justinmann","email":"justin.mann@gmail.com"},"_npmVersion":"10.9.4","description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","directories":{},"maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.21.0","ws":"^8.18.0","zod":"^4.3.6","hono":"^4.12.25","jose":"^6.0.13","nats":"^2.28.2","katex":"^0.16.45","bcrypt":"^6.0.0","eslint":"^8.57.0","lucide":"^1.8.0","nanoid":"^5.1.5","esbuild":"^0.27.5","express":"^4.21.1","mermaid":"^11.14.0","fs-extra":"^11.0.0","turndown":"^7.2.4","commander":"^12.0.0","lru-cache":"^11.0.0","ugly-game":"^0.15.47","url-parse":"^1.5.10","@eslint/js":"^8.57.1","codemirror":"^6.0.2","handlebars":"^4.7.8","sprintf-js":"^1.1.3","vega-embed":"^7.1.0","html2canvas":"^1.4.1","markmap-lib":"^0.18.12","concurrently":"^9.0.0","highlight.js":"^11.11.1","jsonwebtoken":"^9.0.3","markmap-view":"^0.18.12","cookie-parser":"^1.4.7","y-prosemirror":"^1.3.7","better-sqlite3":"^12.11.1","markmap-common":"^0.18.9","mdast-util-gfm":"^3.1.0","@types/turndown":"^5.0.6","canvas-confetti":"^1.9.4","@codemirror/view":"^6.41.0","@types/url-parse":"^1.4.11","onnxruntime-node":"^1.23.0","prosemirror-view":"^1.41.8","react-datepicker":"^9.1.0","@codemirror/state":"^6.6.0","hast-util-to-html":"^9.0.5","prosemirror-model":"^1.25.4","prosemirror-state":"^1.4.4","typescript-eslint":"^8.57.2","@aws-sdk/client-s3":"^3.700.0","mdast-util-to-hast":"^13.2.1","prosemirror-keymap":"^1.2.3","prosemirror-tables":"^1.8.5","@types/jsonwebtoken":"^9.0.10","eslint-plugin-react":"^7.37.5","google-auth-library":"^10.9.0","prosemirror-history":"^1.5.0","@codemirror/commands":"^6.10.3","mdast-util-to-string":"^4.0.0","prosemirror-commands":"^1.7.1","prosemirror-transform":"^1.12.0","@tanstack/virtual-core":"^3.0.0","mdast-util-to-markdown":"^2.1.2","prosemirror-inputrules":"^1.5.1","mdast-util-gfm-footnote":"^2.1.0","micromark-extension-gfm":"^3.0.0","prosemirror-schema-list":"^1.5.1","@neondatabase/serverless":"^1.1.0","mdast-util-from-markdown":"^2.0.3","@codemirror/lang-markdown":"^6.5.0","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^7.0.1","@codemirror/theme-one-dark":"^6.1.3","@aws-sdk/s3-request-presigner":"^3.700.0","@typescript-eslint/eslint-plugin":"^8.0.0","micromark-extension-gfm-footnote":"^2.1.0"},"comment:files":"Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"tsx":"^4.22.4","yjs":"^13.6.30","jsdom":"^29.0.1","react":"^19.2.4","three":"^0.183.2","vitest":"^4.0.18","prettier":"^3.9.5","@types/pg":"^8.20.0","@types/ws":"^8.5.13","miniflare":"^4.20260603.0","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.0.0","html2canvas":"^1.4.1","@types/katex":"^0.16.8","@types/react":"^19.2.14","@types/three":"^0.183.1","@types/bcrypt":"^5.0.2","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@playwright/test":"^1.58.2","@types/react-dom":"^19.2.3","@types/sprintf-js":"^1.1.4","@vitest/coverage-v8":"^4.1.2","@testing-library/dom":"^10.4.1","@types/cookie-parser":"^1.4.10","@vitejs/plugin-react":"^6.0.1","@types/better-sqlite3":"^7.6.13","@testing-library/react":"^16.3.2","@types/canvas-confetti":"^1.9.0","@types/react-datepicker":"^6.2.0","@cloudflare/workers-types":"^4.20260610.1","@cloudflare/vitest-pool-workers":"^0.16.14"},"peerDependencies":{"yjs":">=13.0.0","react":">=18.0.0","three":">=0.150.0","preact":"^10.29.0","react-dom":">=18.0.0","@types/react":">=18.0.0"},"peerDependenciesMeta":{"yjs":{"optional":true},"three":{"optional":true},"preact":{"optional":true},"mediasoup":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ugly-app_0.1.1061_1791080285383_0.1247737860371112"}}},"time":{"created":"2026-03-25T03:26:12.130Z","modified":"2026-10-04T02:18:05.750Z","0.1.0":"2026-03-25T03:26:12.332Z","0.1.1":"2026-03-25T03:36:41.683Z","0.1.2":"2026-03-25T03:47:14.121Z","0.1.3":"2026-03-25T03:49:10.630Z","0.1.4":"2026-03-25T05:17:53.999Z","0.1.5":"2026-03-25T05:20:46.182Z","0.1.6":"2026-03-25T05:23:27.711Z","0.1.7":"2026-03-25T05:25:44.636Z","0.1.8":"2026-03-25T05:29:09.074Z","0.1.9":"2026-03-25T06:17:18.638Z","0.1.10":"2026-03-25T06:39:54.352Z","0.1.11":"2026-03-25T06:44:38.548Z","0.1.12":"2026-03-25T15:00:37.373Z","0.1.13":"2026-03-25T15:07:38.223Z","0.1.14":"2026-03-25T15:41:41.492Z","0.1.15":"2026-03-25T15:52:04.853Z","0.1.16":"2026-03-25T15:56:12.801Z","0.1.19":"2026-03-26T02:58:34.082Z","0.1.20":"2026-03-26T03:00:53.287Z","0.1.22":"2026-03-26T04:40:08.130Z","0.1.23":"2026-03-26T04:41:21.285Z","0.1.24":"2026-03-26T04:47:58.891Z","0.1.25":"2026-03-26T05:12:07.610Z","0.1.26":"2026-03-26T05:14:29.402Z","0.1.27":"2026-03-26T05:25:00.338Z","0.1.28":"2026-03-26T05:27:36.098Z","0.1.29":"2026-03-26T05:33:26.006Z","0.1.30":"2026-03-26T05:35:20.275Z","0.1.31":"2026-03-26T05:41:01.950Z","0.1.32":"2026-03-26T05:43:23.433Z","0.1.33":"2026-03-26T05:52:06.013Z","0.1.34":"2026-03-26T14:55:40.208Z","0.1.35":"2026-03-26T19:57:42.933Z","0.1.36":"2026-03-27T01:53:33.957Z","0.1.37":"2026-03-27T01:56:21.870Z","0.1.38":"2026-03-27T03:23:30.891Z","0.1.39":"2026-03-27T04:04:11.661Z","0.1.40":"2026-03-27T04:22:58.315Z","0.1.41":"2026-03-27T04:42:13.951Z","0.1.42":"2026-03-27T05:02:05.914Z","0.1.43":"2026-03-27T05:13:46.764Z","0.1.44":"2026-03-27T05:40:04.154Z","0.1.45":"2026-03-28T03:39:27.989Z","0.1.46":"2026-03-28T03:50:57.169Z","0.1.47":"2026-03-28T04:14:55.133Z","0.1.48":"2026-03-28T04:23:17.311Z","0.1.49":"2026-03-28T04:35:05.920Z","0.1.50":"2026-03-28T04:43:24.178Z","0.1.51":"2026-03-28T04:55:11.135Z","0.1.52":"2026-03-28T05:03:17.988Z","0.1.54":"2026-03-28T05:12:39.644Z","0.1.55":"2026-03-28T05:15:09.708Z","0.1.56":"2026-03-28T05:25:16.955Z","0.1.57":"2026-03-28T05:44:43.417Z","0.1.58":"2026-03-28T06:08:00.811Z","0.1.59":"2026-03-28T06:13:28.880Z","0.1.60":"2026-03-28T06:29:58.096Z","0.1.61":"2026-03-28T06:32:03.718Z","0.1.62":"2026-03-28T06:43:38.071Z","0.1.63":"2026-03-28T06:53:23.842Z","0.1.65":"2026-03-28T16:11:58.016Z","0.1.66":"2026-03-28T16:18:07.353Z","0.1.67":"2026-03-28T16:41:19.459Z","0.1.68":"2026-03-28T16:49:01.876Z","0.1.69":"2026-03-28T17:30:55.158Z","0.1.70":"2026-03-28T18:40:41.686Z","0.1.71":"2026-03-28T18:42:01.588Z","0.1.72":"2026-03-28T19:57:48.959Z","0.1.73":"2026-03-28T20:10:44.773Z","0.1.74":"2026-03-28T20:33:01.506Z","0.1.75":"2026-03-28T21:40:43.440Z","0.1.76":"2026-03-28T23:11:01.748Z","0.1.77":"2026-03-29T00:31:06.096Z","0.1.78":"2026-03-29T19:02:12.137Z","0.1.79":"2026-03-29T20:41:24.999Z","0.1.80":"2026-03-29T22:54:39.157Z","0.1.81":"2026-03-29T23:10:45.574Z","0.1.82":"2026-03-29T23:11:40.049Z","0.1.83":"2026-03-29T23:49:25.200Z","0.1.84":"2026-03-30T01:49:02.800Z","0.1.85":"2026-03-30T01:58:08.777Z","0.1.86":"2026-03-30T02:36:50.629Z","0.1.87":"2026-03-30T02:42:52.796Z","0.1.88":"2026-03-30T02:43:35.936Z","0.1.89":"2026-03-30T02:55:58.457Z","0.1.90":"2026-03-30T03:02:09.232Z","0.1.91":"2026-03-30T03:07:55.722Z","0.1.92":"2026-03-30T03:11:00.848Z","0.1.93":"2026-03-30T03:14:18.261Z","0.1.94":"2026-03-30T03:20:37.452Z","0.1.95":"2026-03-30T03:22:14.634Z","0.1.96":"2026-03-30T03:24:37.527Z","0.1.97":"2026-03-30T03:39:01.134Z","0.1.98":"2026-03-30T03:41:31.488Z","0.1.99":"2026-03-30T04:02:26.578Z","0.1.100":"2026-03-30T04:05:26.546Z","0.1.101":"2026-03-30T04:08:18.447Z","0.1.102":"2026-03-30T04:09:07.468Z","0.1.103":"2026-03-30T04:14:09.955Z","0.1.104":"2026-03-30T04:33:33.965Z","0.1.105":"2026-03-30T05:20:19.068Z","0.1.106":"2026-03-30T06:10:52.652Z","0.1.107":"2026-03-30T06:37:26.963Z","0.1.108":"2026-03-30T07:04:46.974Z","0.1.109":"2026-03-30T07:07:42.456Z","0.1.111":"2026-03-30T14:56:25.581Z","0.1.112":"2026-03-30T14:57:36.643Z","0.1.113":"2026-03-30T15:02:04.573Z","0.1.114":"2026-03-30T15:06:49.294Z","0.1.115":"2026-03-30T15:10:40.924Z","0.1.116":"2026-03-30T15:18:54.587Z","0.1.117":"2026-03-30T15:23:51.301Z","0.1.118":"2026-03-30T15:51:07.264Z","0.1.119":"2026-03-30T16:36:25.904Z","0.1.120":"2026-03-31T00:45:36.620Z","0.1.121":"2026-03-31T00:49:27.719Z","0.1.122":"2026-03-31T00:52:29.662Z","0.1.123":"2026-03-31T00:54:36.335Z","0.1.124":"2026-03-31T01:03:34.977Z","0.1.125":"2026-03-31T01:12:29.938Z","0.1.126":"2026-03-31T01:24:58.593Z","0.1.127":"2026-03-31T01:27:34.436Z","0.1.128":"2026-03-31T02:55:30.465Z","0.1.129":"2026-03-31T02:59:28.534Z","0.1.130":"2026-03-31T03:01:53.372Z","0.1.131":"2026-03-31T03:07:43.150Z","0.1.132":"2026-03-31T03:21:52.662Z","0.1.133":"2026-03-31T03:27:09.768Z","0.1.134":"2026-03-31T03:34:04.706Z","0.1.135":"2026-03-31T03:48:28.242Z","0.1.136":"2026-03-31T03:51:26.666Z","0.1.137":"2026-03-31T03:53:28.776Z","0.1.138":"2026-03-31T04:03:39.579Z","0.1.139":"2026-03-31T04:07:36.701Z","0.1.140":"2026-03-31T04:12:06.692Z","0.1.141":"2026-03-31T04:15:18.280Z","0.1.142":"2026-03-31T04:19:03.148Z","0.1.143":"2026-03-31T04:32:55.499Z","0.1.144":"2026-03-31T04:38:46.005Z","0.1.145":"2026-03-31T06:11:46.884Z","0.1.146":"2026-03-31T06:56:29.415Z","0.1.147":"2026-03-31T14:29:12.961Z","0.1.148":"2026-03-31T14:59:22.138Z","0.1.149":"2026-03-31T16:00:54.012Z","0.1.150":"2026-03-31T16:03:01.164Z","0.1.151":"2026-04-01T01:36:36.037Z","0.1.152":"2026-04-01T03:23:07.319Z","0.1.153":"2026-04-01T03:25:38.593Z","0.1.154":"2026-04-01T04:29:34.572Z","0.1.155":"2026-04-01T04:30:26.257Z","0.1.156":"2026-04-01T04:31:36.088Z","0.1.157":"2026-04-01T05:12:14.136Z","0.1.158":"2026-04-01T05:34:29.619Z","0.1.159":"2026-04-01T05:39:15.328Z","0.1.160":"2026-04-01T05:43:17.057Z","0.1.161":"2026-04-01T05:46:56.382Z","0.1.162":"2026-04-01T05:57:46.696Z","0.1.163":"2026-04-01T06:03:39.295Z","0.1.164":"2026-04-01T06:06:58.251Z","0.1.165":"2026-04-01T06:21:09.736Z","0.1.166":"2026-04-01T06:38:26.203Z","0.1.167":"2026-04-01T07:06:08.169Z","0.1.168":"2026-04-01T07:13:04.735Z","0.1.169":"2026-04-02T02:25:09.268Z","0.1.170":"2026-04-02T02:31:40.093Z","0.1.171":"2026-04-02T04:25:34.331Z","0.1.172":"2026-04-02T04:50:07.330Z","0.1.173":"2026-04-02T06:16:24.181Z","0.1.174":"2026-04-02T06:35:20.788Z","0.1.175":"2026-04-02T06:35:33.162Z","0.1.176":"2026-04-02T14:23:49.546Z","0.1.177":"2026-04-02T14:57:43.711Z","0.1.179":"2026-04-02T15:15:24.518Z","0.1.181":"2026-04-02T15:52:53.633Z","0.1.182":"2026-04-02T16:17:30.853Z","0.1.183":"2026-04-02T16:22:59.873Z","0.1.184":"2026-04-02T22:09:46.620Z","0.1.185":"2026-04-02T22:10:18.385Z","0.1.186":"2026-04-02T22:24:15.752Z","0.1.187":"2026-04-02T22:30:50.999Z","0.1.188":"2026-04-02T23:18:44.592Z","0.1.189":"2026-04-02T23:29:08.746Z","0.1.190":"2026-04-03T00:31:49.360Z","0.1.191":"2026-04-03T01:07:58.820Z","0.1.192":"2026-04-03T01:17:57.218Z","0.1.193":"2026-04-03T01:23:46.061Z","0.1.194":"2026-04-03T01:24:26.731Z","0.1.195":"2026-04-03T02:15:32.505Z","0.1.196":"2026-04-03T02:56:07.672Z","0.1.197":"2026-04-03T03:10:05.405Z","0.1.198":"2026-04-03T03:22:50.787Z","0.1.199":"2026-04-03T03:26:47.707Z","0.1.200":"2026-04-03T03:36:38.576Z","0.1.201":"2026-04-03T04:43:46.656Z","0.1.202":"2026-04-03T05:06:00.631Z","0.1.203":"2026-04-03T16:13:31.995Z","0.1.204":"2026-04-03T21:35:18.441Z","0.1.205":"2026-04-03T23:17:15.602Z","0.1.206":"2026-04-04T06:19:04.621Z","0.1.207":"2026-04-04T06:19:47.388Z","0.1.208":"2026-04-04T14:48:00.349Z","0.1.209":"2026-04-04T14:49:28.540Z","0.1.210":"2026-04-04T16:08:52.093Z","0.1.211":"2026-04-04T16:10:41.378Z","0.1.212":"2026-04-04T17:01:07.947Z","0.1.213":"2026-04-04T20:27:13.716Z","0.1.214":"2026-04-04T20:33:50.116Z","0.1.215":"2026-04-04T21:45:06.708Z","0.1.216":"2026-04-04T21:52:18.704Z","0.1.217":"2026-04-04T22:00:46.500Z","0.1.218":"2026-04-04T22:43:01.696Z","0.1.219":"2026-04-04T22:58:13.858Z","0.1.220":"2026-04-04T23:44:24.324Z","0.1.221":"2026-04-04T23:53:35.194Z","0.1.222":"2026-04-05T03:05:39.618Z","0.1.223":"2026-04-05T03:34:06.237Z","0.1.224":"2026-04-05T03:43:52.037Z","0.1.225":"2026-04-05T03:46:12.360Z","0.1.226":"2026-04-05T03:48:54.774Z","0.1.227":"2026-04-05T03:49:27.918Z","0.1.228":"2026-04-05T03:55:07.409Z","0.1.229":"2026-04-05T04:14:27.945Z","0.1.230":"2026-04-05T05:31:44.535Z","0.1.231":"2026-04-05T05:33:39.327Z","0.1.232":"2026-04-05T05:41:33.583Z","0.1.233":"2026-04-05T06:10:14.734Z","0.1.234":"2026-04-05T06:25:10.516Z","0.1.237":"2026-04-05T06:42:26.830Z","0.1.238":"2026-04-05T06:53:23.253Z","0.1.239":"2026-04-05T07:17:33.081Z","0.1.240":"2026-04-05T07:27:53.744Z","0.1.241":"2026-04-05T07:35:53.686Z","0.1.242":"2026-04-05T07:45:41.113Z","0.1.243":"2026-04-05T21:15:23.297Z","0.1.244":"2026-04-05T22:08:15.713Z","0.1.245":"2026-04-05T22:13:40.929Z","0.1.246":"2026-04-05T22:14:57.249Z","0.1.247":"2026-04-05T22:28:17.335Z","0.1.248":"2026-04-05T22:35:22.801Z","0.1.249":"2026-04-05T22:48:56.631Z","0.1.250":"2026-04-05T23:07:46.444Z","0.1.251":"2026-04-05T23:08:59.950Z","0.1.252":"2026-04-05T23:54:45.846Z","0.1.253":"2026-04-05T23:55:54.996Z","0.1.254":"2026-04-06T00:00:59.858Z","0.1.255":"2026-04-06T00:10:55.114Z","0.1.256":"2026-04-06T03:20:44.730Z","0.1.257":"2026-04-06T03:29:40.606Z","0.1.258":"2026-04-06T03:38:18.711Z","0.1.259":"2026-04-06T03:38:59.714Z","0.1.260":"2026-04-06T03:47:34.281Z","0.1.261":"2026-04-06T03:57:53.803Z","0.1.262":"2026-04-06T03:58:53.942Z","0.1.263":"2026-04-06T04:00:01.297Z","0.1.264":"2026-04-06T04:00:53.298Z","0.1.265":"2026-04-06T04:37:11.144Z","0.1.266":"2026-04-06T05:05:56.126Z","0.1.267":"2026-04-06T05:47:45.352Z","0.1.268":"2026-04-06T05:57:46.726Z","0.1.269":"2026-04-06T06:15:36.598Z","0.1.270":"2026-04-06T06:19:29.604Z","0.1.271":"2026-04-06T06:21:10.389Z","0.1.272":"2026-04-06T06:25:05.047Z","0.1.273":"2026-04-06T06:35:54.027Z","0.1.274":"2026-04-06T14:53:39.810Z","0.1.275":"2026-04-06T15:01:42.267Z","0.1.276":"2026-04-06T15:38:16.612Z","0.1.277":"2026-04-07T01:49:23.581Z","0.1.279":"2026-04-07T02:27:53.136Z","0.1.280":"2026-04-07T02:28:10.288Z","0.1.281":"2026-04-07T04:12:46.277Z","0.1.282":"2026-04-07T04:52:50.215Z","0.1.283":"2026-04-07T05:02:32.987Z","0.1.284":"2026-04-07T05:27:15.946Z","0.1.285":"2026-04-07T06:14:34.523Z","0.1.286":"2026-04-07T06:19:22.955Z","0.1.287":"2026-04-07T06:23:35.072Z","0.1.288":"2026-04-07T06:33:30.581Z","0.1.289":"2026-04-07T15:53:13.747Z","0.1.290":"2026-04-08T00:52:02.950Z","0.1.291":"2026-04-08T01:04:02.077Z","0.1.292":"2026-04-08T01:34:30.178Z","0.1.293":"2026-04-08T03:20:46.482Z","0.1.294":"2026-04-08T04:15:32.115Z","0.1.295":"2026-04-08T04:50:00.724Z","0.1.296":"2026-04-08T04:53:02.507Z","0.1.297":"2026-04-08T05:35:35.267Z","0.1.298":"2026-04-08T06:02:38.499Z","0.1.299":"2026-04-08T06:54:49.166Z","0.1.300":"2026-04-08T15:04:16.079Z","0.1.301":"2026-04-08T15:07:31.901Z","0.1.302":"2026-04-08T15:26:26.962Z","0.1.303":"2026-04-08T15:35:54.277Z","0.1.304":"2026-04-08T15:50:21.442Z","0.1.305":"2026-04-08T16:09:31.885Z","0.1.306":"2026-04-09T02:06:27.937Z","0.1.307":"2026-04-09T03:23:53.652Z","0.1.308":"2026-04-09T05:26:42.232Z","0.1.309":"2026-04-09T05:42:06.109Z","0.1.310":"2026-04-09T05:42:47.367Z","0.1.311":"2026-04-09T06:05:30.286Z","0.1.312":"2026-04-09T06:42:40.725Z","0.1.313":"2026-04-09T15:07:58.171Z","0.1.314":"2026-04-09T16:14:13.527Z","0.1.315":"2026-04-09T16:48:43.894Z","0.1.316":"2026-04-09T16:55:01.264Z","0.1.317":"2026-04-09T23:38:47.087Z","0.1.318":"2026-04-09T23:53:03.535Z","0.1.319":"2026-04-09T23:56:52.055Z","0.1.320":"2026-04-10T02:30:12.809Z","0.1.321":"2026-04-10T15:28:37.862Z","0.1.322":"2026-04-10T16:56:31.526Z","0.1.323":"2026-04-10T17:13:04.944Z","0.1.324":"2026-04-10T17:18:25.714Z","0.1.325":"2026-04-10T17:57:14.723Z","0.1.326":"2026-04-10T23:05:13.022Z","0.1.327":"2026-04-10T23:16:56.036Z","0.1.328":"2026-04-11T00:14:24.044Z","0.1.329":"2026-04-11T00:21:03.496Z","0.1.330":"2026-04-11T00:23:38.331Z","0.1.331":"2026-04-11T00:25:51.482Z","0.1.332":"2026-04-11T01:14:24.612Z","0.1.333":"2026-04-11T01:42:13.926Z","0.1.334":"2026-04-11T01:49:20.981Z","0.1.335":"2026-04-11T01:56:36.831Z","0.1.336":"2026-04-11T01:59:26.529Z","0.1.337":"2026-04-11T04:09:16.401Z","0.1.338":"2026-04-11T04:27:11.328Z","0.1.339":"2026-04-11T04:32:18.699Z","0.1.340":"2026-04-11T05:02:15.284Z","0.1.341":"2026-04-11T05:34:55.854Z","0.1.342":"2026-04-11T05:41:36.286Z","0.1.343":"2026-04-11T20:46:52.234Z","0.1.344":"2026-04-11T21:11:20.528Z","0.1.345":"2026-04-11T21:47:43.351Z","0.1.346":"2026-04-11T22:03:23.907Z","0.1.347":"2026-04-11T22:14:52.704Z","0.1.348":"2026-04-11T23:33:28.867Z","0.1.349":"2026-04-12T01:33:24.777Z","0.1.350":"2026-04-12T01:34:20.275Z","0.1.351":"2026-04-12T02:52:39.399Z","0.1.352":"2026-04-12T06:07:10.521Z","0.1.353":"2026-04-12T16:25:46.495Z","0.1.354":"2026-04-12T17:21:47.059Z","0.1.355":"2026-04-12T18:48:10.793Z","0.1.356":"2026-04-12T19:16:06.366Z","0.1.357":"2026-04-12T19:20:14.364Z","0.1.358":"2026-04-12T21:04:02.759Z","0.1.359":"2026-04-12T22:33:47.177Z","0.1.360":"2026-04-12T22:43:32.652Z","0.1.361":"2026-04-12T22:43:47.337Z","0.1.362":"2026-04-12T23:04:11.389Z","0.1.363":"2026-04-13T02:05:00.889Z","0.1.364":"2026-04-13T03:31:16.329Z","0.1.365":"2026-04-13T03:42:40.611Z","0.1.366":"2026-04-13T04:08:06.897Z","0.1.367":"2026-04-14T03:01:22.284Z","0.1.368":"2026-04-14T04:37:01.443Z","0.1.369":"2026-04-14T05:12:02.239Z","0.1.370":"2026-04-14T05:34:10.925Z","0.1.371":"2026-04-14T15:37:04.748Z","0.1.372":"2026-04-15T00:56:18.503Z","0.1.373":"2026-04-15T01:37:26.341Z","0.1.374":"2026-04-15T02:25:56.311Z","0.1.375":"2026-04-16T00:36:19.780Z","0.1.376":"2026-04-18T00:59:22.763Z","0.1.377":"2026-04-18T01:20:22.244Z","0.1.378":"2026-04-18T17:34:49.851Z","0.1.379":"2026-04-18T18:31:27.834Z","0.1.380":"2026-04-18T19:10:20.290Z","0.1.381":"2026-04-18T19:44:00.430Z","0.1.382":"2026-04-18T21:15:05.369Z","0.1.383":"2026-04-18T23:14:04.395Z","0.1.384":"2026-04-18T23:23:15.261Z","0.1.385":"2026-04-18T23:34:14.032Z","0.1.386":"2026-04-18T23:36:45.218Z","0.1.387":"2026-04-19T00:28:08.973Z","0.1.388":"2026-04-19T00:31:07.951Z","0.1.389":"2026-04-19T00:32:28.643Z","0.1.390":"2026-04-19T00:41:48.505Z","0.1.391":"2026-04-19T00:56:00.939Z","0.1.392":"2026-04-19T01:11:04.120Z","0.1.393":"2026-04-19T01:40:32.172Z","0.1.394":"2026-04-19T01:43:12.068Z","0.1.395":"2026-04-19T02:17:04.336Z","0.1.396":"2026-04-19T02:26:29.417Z","0.1.397":"2026-04-19T02:29:11.948Z","0.1.398":"2026-04-19T02:43:13.175Z","0.1.399":"2026-04-19T03:23:19.611Z","0.1.400":"2026-04-19T03:23:51.126Z","0.1.401":"2026-04-19T22:11:06.729Z","0.1.402":"2026-04-19T22:15:12.114Z","0.1.403":"2026-04-20T05:24:45.785Z","0.1.404":"2026-04-20T20:12:31.435Z","0.1.405":"2026-04-21T06:37:39.986Z","0.1.406":"2026-04-22T14:47:37.259Z","0.1.407":"2026-04-24T19:37:30.521Z","0.1.408":"2026-04-24T22:57:41.238Z","0.1.409":"2026-04-25T03:02:04.917Z","0.1.410":"2026-04-25T03:36:22.424Z","0.1.411":"2026-04-25T15:34:31.348Z","0.1.412":"2026-04-25T17:59:30.864Z","0.1.413":"2026-04-25T18:46:42.966Z","0.1.414":"2026-04-25T21:47:28.286Z","0.1.415":"2026-04-27T19:59:19.642Z","0.1.416":"2026-04-27T20:00:13.066Z","0.1.417":"2026-04-28T15:18:42.721Z","0.1.418":"2026-04-28T15:36:41.548Z","0.1.419":"2026-04-28T16:27:43.862Z","0.1.420":"2026-04-28T16:28:53.602Z","0.1.422":"2026-04-29T23:54:32.858Z","0.1.423":"2026-04-30T02:22:49.771Z","0.1.424":"2026-04-30T02:25:46.214Z","0.1.425":"2026-04-30T02:32:35.461Z","0.1.426":"2026-04-30T06:59:35.560Z","0.1.427":"2026-05-03T20:00:38.553Z","0.1.428":"2026-05-03T20:49:34.816Z","0.1.429":"2026-05-03T21:00:34.287Z","0.1.430":"2026-05-03T21:25:32.065Z","0.1.431":"2026-05-03T21:44:01.345Z","0.1.432":"2026-05-03T22:31:42.176Z","0.1.433":"2026-05-03T22:52:09.209Z","0.1.434":"2026-05-03T23:12:08.994Z","0.1.435":"2026-05-03T23:23:17.429Z","0.1.436":"2026-05-03T23:34:52.256Z","0.1.437":"2026-05-04T04:35:53.673Z","0.1.438":"2026-05-04T04:46:22.249Z","0.1.439":"2026-05-04T05:18:14.129Z","0.1.440":"2026-05-04T17:33:35.346Z","0.1.441":"2026-05-05T00:50:35.282Z","0.1.443":"2026-05-05T05:19:27.225Z","0.1.444":"2026-05-06T00:09:24.293Z","0.1.445":"2026-05-07T02:54:37.270Z","0.1.446":"2026-05-07T03:05:18.516Z","0.1.447":"2026-05-07T03:57:52.270Z","0.1.448":"2026-05-07T04:02:04.127Z","0.1.449":"2026-05-07T05:42:10.162Z","0.1.450":"2026-05-07T05:47:14.540Z","0.1.451":"2026-05-08T04:34:59.341Z","0.1.452":"2026-05-08T06:34:54.035Z","0.1.453":"2026-05-08T06:53:50.260Z","0.1.454":"2026-05-08T15:51:14.396Z","0.1.455":"2026-05-09T02:12:30.641Z","0.1.456":"2026-05-09T02:20:37.974Z","0.1.457":"2026-05-09T03:03:13.472Z","0.1.458":"2026-05-09T03:38:57.467Z","0.1.459":"2026-05-09T17:17:43.013Z","0.1.460":"2026-05-10T03:22:11.334Z","0.1.461":"2026-05-10T03:58:45.320Z","0.1.463":"2026-05-10T18:03:36.464Z","0.1.464":"2026-05-10T18:08:55.186Z","0.1.465":"2026-05-10T18:12:08.447Z","0.1.466":"2026-05-10T19:21:12.415Z","0.1.467":"2026-05-10T19:44:52.052Z","0.1.468":"2026-05-11T06:38:36.934Z","0.1.469":"2026-05-11T15:00:47.209Z","0.1.470":"2026-05-11T15:59:26.729Z","0.1.471":"2026-05-13T02:51:37.708Z","0.1.472":"2026-05-13T03:25:20.063Z","0.1.473":"2026-05-16T04:47:44.281Z","0.1.474":"2026-05-17T18:05:19.381Z","0.1.477":"2026-05-23T23:02:02.117Z","0.1.478":"2026-05-23T23:17:03.251Z","0.1.479":"2026-05-24T02:07:12.410Z","0.1.480":"2026-05-24T04:35:34.346Z","0.1.481":"2026-05-24T05:30:18.817Z","0.1.482":"2026-05-24T05:34:17.581Z","0.1.483":"2026-05-25T00:18:46.011Z","0.1.484":"2026-05-31T01:56:20.606Z","0.1.485":"2026-05-31T02:45:02.635Z","0.1.486":"2026-05-31T06:01:32.524Z","0.1.487":"2026-05-31T20:56:33.671Z","0.1.488":"2026-06-01T22:01:13.555Z","0.1.489":"2026-06-01T22:48:51.119Z","0.1.490":"2026-06-01T23:00:12.623Z","0.1.492":"2026-06-02T06:59:41.950Z","0.1.493":"2026-06-07T05:28:04.728Z","0.1.494":"2026-06-08T15:07:03.491Z","0.1.495":"2026-06-08T16:32:26.649Z","0.1.496":"2026-06-08T18:11:38.018Z","0.1.497":"2026-06-08T20:43:16.174Z","0.1.498":"2026-06-09T04:11:11.338Z","0.1.499":"2026-06-11T02:28:02.183Z","0.1.500":"2026-06-11T02:31:18.498Z","0.1.501":"2026-06-11T05:59:30.852Z","0.1.502":"2026-06-11T06:07:44.348Z","0.1.503":"2026-06-11T06:16:39.140Z","0.1.504":"2026-06-11T06:25:11.628Z","0.1.505":"2026-06-11T06:33:50.477Z","0.1.506":"2026-06-11T06:42:57.437Z","0.1.507":"2026-06-11T07:10:28.901Z","0.1.508":"2026-06-11T15:35:13.710Z","0.1.509":"2026-06-11T15:48:31.186Z","0.1.510":"2026-06-11T16:02:51.251Z","0.1.511":"2026-06-12T01:17:59.435Z","0.1.512":"2026-06-12T01:35:58.777Z","0.1.513":"2026-06-12T01:49:59.928Z","0.1.514":"2026-06-12T02:00:14.364Z","0.1.515":"2026-06-12T06:48:02.575Z","0.1.516":"2026-06-12T07:08:02.283Z","0.1.517":"2026-06-12T15:38:17.585Z","0.1.518":"2026-06-13T00:59:00.340Z","0.1.519":"2026-06-13T01:16:50.313Z","0.1.521":"2026-06-13T04:12:55.699Z","0.1.523":"2026-06-13T04:17:07.115Z","0.1.524":"2026-06-13T07:03:03.028Z","0.1.525":"2026-06-13T07:38:02.391Z","0.1.526":"2026-06-13T08:02:24.979Z","0.1.527":"2026-06-13T08:06:24.839Z","0.1.528":"2026-06-13T08:18:56.183Z","0.1.529":"2026-06-13T17:08:40.281Z","0.1.530":"2026-06-13T19:37:12.418Z","0.1.531":"2026-06-13T19:37:56.314Z","0.1.532":"2026-06-13T19:43:33.269Z","0.1.533":"2026-06-13T19:48:48.265Z","0.1.534":"2026-06-13T19:55:56.533Z","0.1.535":"2026-06-13T20:04:03.073Z","0.1.536":"2026-06-13T20:08:42.727Z","0.1.537":"2026-06-13T20:50:22.127Z","0.1.538":"2026-06-13T21:23:42.799Z","0.1.539":"2026-06-13T21:37:08.041Z","0.1.540":"2026-06-13T21:41:40.359Z","0.1.541":"2026-06-13T22:07:35.713Z","0.1.542":"2026-06-13T22:08:18.793Z","0.1.543":"2026-06-13T22:17:17.968Z","0.1.544":"2026-06-13T22:21:54.902Z","0.1.545":"2026-06-13T22:30:56.384Z","0.1.547":"2026-06-13T22:47:34.930Z","0.1.548":"2026-06-13T22:50:49.860Z","0.1.549":"2026-06-14T00:16:17.394Z","0.1.550":"2026-06-14T01:14:58.092Z","0.1.551":"2026-06-14T01:24:10.925Z","0.1.552":"2026-06-14T01:31:04.883Z","0.1.553":"2026-06-14T01:36:17.608Z","0.1.554":"2026-06-14T01:43:36.626Z","0.1.555":"2026-06-14T02:05:33.511Z","0.1.556":"2026-06-14T02:14:10.664Z","0.1.557":"2026-06-14T04:32:15.699Z","0.1.558":"2026-06-14T04:49:11.855Z","0.1.559":"2026-06-14T05:03:04.240Z","0.1.560":"2026-06-14T05:53:30.145Z","0.1.561":"2026-06-14T06:14:12.846Z","0.1.562":"2026-06-14T06:24:32.890Z","0.1.563":"2026-06-14T06:48:04.286Z","0.1.564":"2026-06-14T06:54:45.142Z","0.1.565":"2026-06-14T07:06:00.193Z","0.1.566":"2026-06-14T15:39:14.323Z","0.1.567":"2026-06-14T15:43:08.584Z","0.1.568":"2026-06-14T15:54:51.044Z","0.1.569":"2026-06-14T16:06:09.424Z","0.1.570":"2026-06-14T16:32:13.531Z","0.1.571":"2026-06-14T19:16:46.621Z","0.1.572":"2026-06-14T22:12:02.316Z","0.1.573":"2026-06-14T22:39:14.543Z","0.1.574":"2026-06-14T22:45:28.140Z","0.1.575":"2026-06-15T00:48:10.630Z","0.1.576":"2026-06-15T01:21:44.514Z","0.1.577":"2026-06-15T02:29:50.920Z","0.1.578":"2026-06-15T02:46:12.392Z","0.1.579":"2026-06-15T03:00:12.436Z","0.1.580":"2026-06-15T04:29:27.472Z","0.1.581":"2026-06-15T04:43:58.913Z","0.1.582":"2026-06-15T05:24:04.007Z","0.1.583":"2026-06-15T05:59:15.628Z","0.1.584":"2026-06-15T06:08:25.234Z","0.1.585":"2026-06-15T06:14:19.042Z","0.1.586":"2026-06-15T15:51:49.057Z","0.1.587":"2026-06-15T15:56:26.157Z","0.1.588":"2026-06-15T16:05:32.747Z","0.1.589":"2026-06-15T16:16:52.574Z","0.1.590":"2026-06-15T20:56:03.890Z","0.1.591":"2026-06-15T21:07:36.239Z","0.1.592":"2026-06-15T23:01:34.545Z","0.1.593":"2026-06-15T23:17:09.366Z","0.1.594":"2026-06-15T23:42:38.839Z","0.1.595":"2026-06-16T04:30:45.445Z","0.1.596":"2026-06-16T04:46:28.593Z","0.1.597":"2026-06-16T05:04:19.371Z","0.1.598":"2026-06-16T05:43:27.280Z","0.1.600":"2026-06-16T06:06:43.622Z","0.1.601":"2026-06-16T06:12:24.757Z","0.1.603":"2026-06-16T06:23:24.540Z","0.1.604":"2026-06-16T15:29:56.500Z","0.1.605":"2026-06-16T15:40:41.727Z","0.1.606":"2026-06-16T16:02:10.365Z","0.1.607":"2026-06-16T17:00:31.253Z","0.1.608":"2026-06-16T23:31:07.423Z","0.1.609":"2026-06-17T00:14:25.216Z","0.1.610":"2026-06-17T06:20:25.616Z","0.1.611":"2026-06-17T15:48:12.707Z","0.1.612":"2026-06-17T17:15:19.110Z","0.1.613":"2026-06-19T16:54:50.593Z","0.1.614":"2026-06-19T16:57:47.079Z","0.1.615":"2026-06-19T18:52:23.188Z","0.1.616":"2026-06-19T20:31:30.392Z","0.1.617":"2026-06-19T22:41:24.493Z","0.1.618":"2026-06-19T23:00:38.836Z","0.1.619":"2026-06-20T00:20:58.340Z","0.1.620":"2026-06-20T01:00:19.445Z","0.1.621":"2026-06-20T01:35:16.631Z","0.1.622":"2026-06-20T01:58:28.675Z","0.1.623":"2026-06-20T02:20:33.272Z","0.1.624":"2026-06-20T04:12:17.737Z","0.1.625":"2026-06-20T04:55:47.410Z","0.1.626":"2026-06-20T05:02:34.708Z","0.1.627":"2026-06-20T05:03:57.754Z","0.1.628":"2026-06-20T05:10:27.536Z","0.1.629":"2026-06-20T05:14:04.428Z","0.1.630":"2026-06-20T19:10:30.610Z","0.1.631":"2026-06-20T19:35:33.968Z","0.1.632":"2026-06-20T19:41:47.428Z","0.1.633":"2026-06-20T20:34:04.835Z","0.1.634":"2026-06-20T20:55:53.324Z","0.1.635":"2026-06-20T21:08:10.512Z","0.1.636":"2026-06-20T22:02:49.935Z","0.1.637":"2026-06-20T22:04:12.960Z","0.1.638":"2026-06-20T22:09:02.600Z","0.1.639":"2026-06-20T22:11:19.155Z","0.1.640":"2026-06-20T22:19:23.555Z","0.1.641":"2026-06-21T00:59:49.271Z","0.1.642":"2026-06-21T01:28:15.185Z","0.1.643":"2026-06-21T02:45:36.123Z","0.1.644":"2026-06-21T02:59:40.542Z","0.1.645":"2026-06-21T06:21:45.634Z","0.1.646":"2026-06-21T16:12:28.987Z","0.1.647":"2026-06-21T16:58:23.158Z","0.1.648":"2026-06-21T17:03:14.020Z","0.1.649":"2026-06-21T17:16:27.202Z","0.1.650":"2026-06-21T17:30:28.046Z","0.1.651":"2026-06-21T17:36:09.507Z","0.1.652":"2026-06-21T20:17:49.901Z","0.1.653":"2026-06-21T23:11:45.487Z","0.1.654":"2026-06-21T23:35:02.588Z","0.1.655":"2026-06-21T23:40:08.531Z","0.1.656":"2026-06-22T00:00:08.735Z","0.1.657":"2026-06-22T00:18:25.496Z","0.1.658":"2026-06-22T01:30:33.562Z","0.1.659":"2026-06-22T02:23:38.246Z","0.1.660":"2026-06-22T02:28:09.030Z","0.1.661":"2026-06-22T02:30:45.509Z","0.1.662":"2026-06-22T02:40:58.628Z","0.1.663":"2026-06-22T02:59:38.546Z","0.1.664":"2026-06-22T03:16:53.563Z","0.1.665":"2026-06-22T03:32:29.361Z","0.1.666":"2026-06-22T03:59:44.867Z","0.1.667":"2026-06-22T05:02:00.609Z","0.1.668":"2026-06-22T05:20:51.941Z","0.1.669":"2026-06-22T05:27:27.947Z","0.1.670":"2026-06-22T05:40:29.574Z","0.1.671":"2026-06-22T06:03:49.795Z","0.1.672":"2026-06-22T06:09:29.453Z","0.1.673":"2026-06-22T15:23:52.810Z","0.1.674":"2026-06-22T15:43:39.658Z","0.1.675":"2026-06-22T23:36:01.332Z","0.1.676":"2026-06-22T23:40:41.896Z","0.1.677":"2026-06-23T00:08:29.606Z","0.1.678":"2026-06-23T00:15:20.315Z","0.1.679":"2026-06-23T00:17:22.896Z","0.1.680":"2026-06-23T01:11:47.318Z","0.1.681":"2026-06-23T01:15:20.599Z","0.1.682":"2026-06-23T02:18:56.483Z","0.1.683":"2026-06-23T02:32:20.455Z","0.1.684":"2026-06-23T02:33:52.341Z","0.1.685":"2026-06-23T02:40:17.483Z","0.1.686":"2026-06-23T02:56:49.499Z","0.1.687":"2026-06-23T03:38:10.544Z","0.1.688":"2026-06-23T03:58:19.186Z","0.1.689":"2026-06-23T04:01:57.593Z","0.1.690":"2026-06-23T04:28:32.517Z","0.1.691":"2026-06-23T04:48:09.326Z","0.1.692":"2026-06-23T04:53:08.138Z","0.1.693":"2026-06-23T05:21:40.010Z","0.1.694":"2026-06-23T05:45:45.979Z","0.1.695":"2026-06-23T06:52:30.624Z","0.1.696":"2026-06-24T00:08:08.141Z","0.1.697":"2026-06-24T00:13:57.814Z","0.1.698":"2026-06-24T00:58:35.087Z","0.1.699":"2026-06-25T04:44:26.298Z","0.1.700":"2026-06-25T15:30:18.053Z","0.1.701":"2026-06-26T02:18:49.224Z","0.1.702":"2026-06-26T03:27:03.915Z","0.1.703":"2026-06-26T04:55:21.560Z","0.1.704":"2026-06-26T05:53:12.905Z","0.1.705":"2026-06-26T06:00:43.239Z","0.1.706":"2026-06-26T06:11:04.958Z","0.1.707":"2026-06-27T19:19:54.005Z","0.1.708":"2026-06-27T20:13:26.223Z","0.1.709":"2026-06-27T23:43:02.294Z","0.1.710":"2026-06-28T01:31:59.065Z","0.1.711":"2026-06-28T18:35:59.230Z","0.1.712":"2026-06-28T18:41:50.823Z","0.1.713":"2026-06-28T18:48:03.540Z","0.1.714":"2026-06-28T19:04:23.042Z","0.1.715":"2026-06-28T19:58:02.487Z","0.1.716":"2026-06-28T20:15:44.387Z","0.1.717":"2026-06-28T20:54:09.464Z","0.1.718":"2026-06-28T21:29:59.782Z","0.1.719":"2026-06-28T21:30:57.683Z","0.1.720":"2026-06-28T21:34:37.827Z","0.1.721":"2026-06-28T22:02:09.329Z","0.1.722":"2026-06-28T22:07:47.239Z","0.1.723":"2026-06-29T02:36:54.797Z","0.1.724":"2026-06-30T02:14:04.216Z","0.1.725":"2026-06-30T03:06:42.011Z","0.1.726":"2026-06-30T05:03:13.677Z","0.1.727":"2026-06-30T06:18:30.311Z","0.1.728":"2026-06-30T16:26:18.816Z","0.1.729":"2026-07-01T06:28:52.548Z","0.1.730":"2026-07-01T07:19:25.160Z","0.1.731":"2026-07-01T15:33:35.171Z","0.1.732":"2026-07-02T03:49:36.256Z","0.1.733":"2026-07-02T05:18:15.129Z","0.1.734":"2026-07-02T17:13:38.438Z","0.1.735":"2026-07-02T17:28:57.285Z","0.1.736":"2026-07-02T18:57:28.703Z","0.1.737":"2026-07-02T20:39:22.952Z","0.1.738":"2026-07-02T21:10:17.234Z","0.1.739":"2026-07-02T22:08:44.823Z","0.1.740":"2026-07-02T23:19:59.995Z","0.1.741":"2026-07-02T23:33:05.668Z","0.1.742":"2026-07-02T23:52:26.758Z","0.1.743":"2026-07-03T01:02:15.410Z","0.1.744":"2026-07-03T01:33:38.385Z","0.1.745":"2026-07-03T02:22:58.228Z","0.1.746":"2026-07-03T04:12:08.044Z","0.1.747":"2026-07-03T04:39:42.597Z","0.1.748":"2026-07-03T05:00:59.784Z","0.1.749":"2026-07-03T05:14:41.112Z","0.1.750":"2026-07-03T07:48:26.451Z","0.1.751":"2026-07-03T18:31:29.464Z","0.1.752":"2026-07-03T18:52:40.054Z","0.1.753":"2026-07-03T19:29:21.658Z","0.1.754":"2026-07-03T20:14:55.204Z","0.1.755":"2026-07-03T23:18:16.217Z","0.1.756":"2026-07-04T00:05:47.435Z","0.1.757":"2026-07-04T00:34:40.326Z","0.1.758":"2026-07-04T00:51:32.790Z","0.1.759":"2026-07-04T01:14:24.432Z","0.1.760":"2026-07-04T04:43:58.878Z","0.1.761":"2026-07-04T05:45:48.642Z","0.1.762":"2026-07-04T06:09:51.366Z","0.1.763":"2026-07-04T07:12:00.263Z","0.1.764":"2026-07-04T08:21:33.466Z","0.1.765":"2026-07-04T17:38:51.290Z","0.1.766":"2026-07-04T17:44:37.772Z","0.1.767":"2026-07-04T18:40:14.693Z","0.1.768":"2026-07-04T18:44:49.376Z","0.1.769":"2026-07-04T19:13:01.747Z","0.1.770":"2026-07-04T20:02:03.986Z","0.1.771":"2026-07-04T21:44:33.834Z","0.1.772":"2026-07-04T22:10:34.239Z","0.1.773":"2026-07-04T23:30:40.456Z","0.1.774":"2026-07-05T01:13:46.592Z","0.1.775":"2026-07-05T01:19:22.759Z","0.1.776":"2026-07-05T06:53:30.016Z","0.1.777":"2026-07-05T07:01:15.078Z","0.1.778":"2026-07-05T14:53:45.499Z","0.1.779":"2026-07-05T15:49:53.895Z","0.1.780":"2026-07-05T15:50:25.424Z","0.1.781":"2026-07-05T15:59:24.368Z","0.1.782":"2026-07-05T16:29:46.556Z","0.1.783":"2026-07-05T17:24:19.626Z","0.1.784":"2026-07-05T21:45:53.188Z","0.1.785":"2026-07-05T21:59:09.195Z","0.1.786":"2026-07-05T22:10:34.839Z","0.1.787":"2026-07-05T23:01:00.248Z","0.1.788":"2026-07-06T01:05:13.651Z","0.1.789":"2026-07-06T03:49:38.934Z","0.1.790":"2026-07-06T04:54:32.972Z","0.1.791":"2026-07-06T06:23:57.078Z","0.1.792":"2026-07-06T07:21:45.353Z","0.1.793":"2026-07-06T16:04:27.748Z","0.1.794":"2026-07-06T16:53:38.566Z","0.1.795":"2026-07-06T18:23:23.477Z","0.1.796":"2026-07-06T18:44:32.257Z","0.1.797":"2026-07-06T18:58:25.491Z","0.1.798":"2026-07-06T19:05:57.306Z","0.1.799":"2026-07-06T19:54:22.158Z","0.1.800":"2026-07-06T23:39:23.352Z","0.1.801":"2026-07-07T00:00:10.949Z","0.1.802":"2026-07-07T00:16:47.615Z","0.1.803":"2026-07-07T05:35:45.673Z","0.1.804":"2026-07-07T06:42:11.464Z","0.1.805":"2026-07-07T18:26:19.212Z","0.1.806":"2026-07-07T19:57:32.183Z","0.1.807":"2026-07-07T22:30:11.580Z","0.1.808":"2026-07-07T23:47:05.258Z","0.1.809":"2026-07-08T00:02:47.767Z","0.1.810":"2026-07-09T01:54:06.245Z","0.1.811":"2026-07-09T03:41:26.549Z","0.1.812":"2026-07-09T22:06:48.655Z","0.1.813":"2026-07-10T02:26:07.369Z","0.1.814":"2026-07-10T02:39:31.253Z","0.1.815":"2026-07-10T02:43:30.839Z","0.1.816":"2026-07-10T03:57:13.635Z","0.1.817":"2026-07-10T04:05:33.404Z","0.1.818":"2026-07-10T04:19:23.639Z","0.1.819":"2026-07-10T04:32:10.600Z","0.1.820":"2026-07-10T05:28:30.087Z","0.1.821":"2026-07-10T06:14:59.798Z","0.1.822":"2026-07-10T18:54:02.260Z","0.1.823":"2026-07-10T22:17:56.615Z","0.1.824":"2026-07-10T22:37:58.560Z","0.1.825":"2026-07-10T23:05:28.138Z","0.1.826":"2026-07-11T03:34:12.688Z","0.1.827":"2026-07-11T14:03:38.286Z","0.1.828":"2026-07-11T14:07:40.522Z","0.1.829":"2026-07-11T14:12:05.090Z","0.1.830":"2026-07-11T15:05:24.059Z","0.1.831":"2026-07-11T17:00:27.259Z","0.1.832":"2026-07-11T17:06:16.254Z","0.1.833":"2026-07-12T00:27:47.574Z","0.1.834":"2026-07-12T03:25:35.153Z","0.1.835":"2026-07-12T03:34:23.272Z","0.1.836":"2026-07-12T03:44:40.415Z","0.1.837":"2026-07-12T05:23:15.015Z","0.1.838":"2026-07-12T06:24:59.213Z","0.1.839":"2026-07-12T06:33:04.193Z","0.1.840":"2026-07-12T06:41:53.446Z","0.1.841":"2026-07-12T07:01:57.377Z","0.1.842":"2026-07-12T07:14:03.684Z","0.1.843":"2026-07-12T19:40:39.890Z","0.1.844":"2026-07-12T22:07:29.352Z","0.1.845":"2026-07-12T22:12:47.413Z","0.1.846":"2026-07-12T23:58:20.704Z","0.1.847":"2026-07-14T04:57:19.672Z","0.1.848":"2026-07-14T06:48:05.450Z","0.1.849":"2026-07-14T15:24:00.135Z","0.1.850":"2026-07-14T16:04:56.436Z","0.1.851":"2026-07-14T16:48:46.301Z","0.1.852":"2026-07-14T19:48:20.651Z","0.1.853":"2026-07-14T20:58:56.260Z","0.1.854":"2026-07-14T21:03:08.534Z","0.1.855":"2026-07-14T21:04:30.244Z","0.1.856":"2026-07-16T01:23:14.336Z","0.1.857":"2026-07-16T02:46:54.199Z","0.1.858":"2026-07-16T05:09:20.608Z","0.1.859":"2026-07-16T05:29:01.071Z","0.1.860":"2026-07-16T07:19:39.079Z","0.1.861":"2026-07-16T16:53:43.330Z","0.1.862":"2026-07-16T17:13:36.758Z","0.1.863":"2026-07-16T23:16:46.600Z","0.1.864":"2026-07-17T01:42:50.333Z","0.1.865":"2026-07-17T02:21:13.272Z","0.1.866":"2026-07-17T02:31:16.112Z","0.1.867":"2026-07-17T02:56:07.891Z","0.1.868":"2026-07-17T03:43:31.308Z","0.1.869":"2026-07-17T03:54:33.818Z","0.1.870":"2026-07-17T17:22:53.132Z","0.1.871":"2026-07-17T17:31:04.395Z","0.1.872":"2026-07-17T17:50:16.132Z","0.1.873":"2026-07-17T20:15:42.864Z","0.1.874":"2026-07-18T02:55:32.872Z","0.1.875":"2026-07-18T05:10:20.925Z","0.1.876":"2026-07-18T05:45:04.240Z","0.1.877":"2026-07-18T06:16:09.821Z","0.1.878":"2026-07-18T17:38:05.391Z","0.1.879":"2026-07-18T20:29:49.054Z","0.1.880":"2026-07-18T21:34:52.837Z","0.1.881":"2026-07-18T21:40:21.913Z","0.1.882":"2026-07-18T21:58:09.469Z","0.1.883":"2026-07-18T22:00:54.970Z","0.1.884":"2026-07-18T23:44:05.210Z","0.1.885":"2026-07-19T08:36:00.197Z","0.1.886":"2026-07-19T18:51:53.783Z","0.1.887":"2026-07-19T19:08:48.106Z","0.1.888":"2026-07-19T20:10:45.164Z","0.1.889":"2026-07-19T20:45:20.811Z","0.1.890":"2026-07-20T05:55:23.122Z","0.1.891":"2026-07-20T06:08:09.886Z","0.1.892":"2026-07-20T06:42:05.286Z","0.1.893":"2026-07-20T18:09:49.730Z","0.1.894":"2026-07-20T18:40:47.246Z","0.1.895":"2026-07-21T05:55:54.426Z","0.1.896":"2026-07-21T18:33:49.979Z","0.1.897":"2026-07-21T19:28:24.850Z","0.1.898":"2026-07-23T02:42:29.794Z","0.1.899":"2026-07-25T17:25:08.920Z","0.1.900":"2026-07-25T17:39:24.604Z","0.1.901":"2026-07-25T17:49:05.027Z","0.1.902":"2026-07-25T19:18:53.457Z","0.1.903":"2026-07-25T19:32:24.034Z","0.1.904":"2026-07-25T19:34:04.633Z","0.1.905":"2026-07-25T21:21:26.419Z","0.1.906":"2026-07-25T22:31:35.970Z","0.1.907":"2026-07-25T23:43:31.905Z","0.1.908":"2026-07-26T00:23:57.267Z","0.1.909":"2026-07-26T02:23:17.398Z","0.1.910":"2026-07-26T02:41:10.264Z","0.1.911":"2026-07-26T03:06:23.049Z","0.1.912":"2026-07-26T03:34:22.833Z","0.1.915":"2026-07-26T04:42:32.234Z","0.1.916":"2026-07-26T05:46:27.901Z","0.1.917":"2026-07-26T06:36:06.553Z","0.1.919":"2026-07-26T07:03:26.047Z","0.1.920":"2026-07-27T16:12:38.008Z","0.1.921":"2026-07-27T16:29:03.659Z","0.1.922":"2026-07-27T16:38:47.588Z","0.1.923":"2026-07-28T03:44:29.656Z","0.1.924":"2026-07-28T07:23:16.491Z","0.1.925":"2026-07-28T23:51:52.704Z","0.1.926":"2026-07-29T00:39:19.916Z","0.1.927":"2026-07-29T02:40:40.276Z","0.1.928":"2026-07-29T03:05:42.978Z","0.1.929":"2026-07-29T03:15:57.618Z","0.1.930":"2026-07-29T03:25:00.193Z","0.1.931":"2026-07-29T03:33:42.564Z","0.1.932":"2026-07-29T03:47:17.334Z","0.1.933":"2026-07-29T04:02:42.426Z","0.1.934":"2026-07-29T04:24:42.364Z","0.1.935":"2026-07-29T04:35:23.913Z","0.1.936":"2026-07-29T04:46:24.018Z","0.1.937":"2026-07-29T04:58:42.874Z","0.1.938":"2026-07-29T05:16:21.027Z","0.1.940":"2026-07-29T05:24:20.410Z","0.1.941":"2026-07-29T06:33:34.059Z","0.1.942":"2026-07-29T07:54:23.379Z","0.1.943":"2026-07-29T08:33:20.641Z","0.1.944":"2026-07-29T10:08:53.648Z","0.1.945":"2026-07-29T15:41:18.537Z","0.1.946":"2026-07-29T15:50:37.882Z","0.1.947":"2026-07-30T22:40:49.512Z","0.1.948":"2026-07-31T06:09:42.871Z","0.1.949":"2026-07-31T07:41:02.875Z","0.1.950":"2026-07-31T07:57:20.618Z","0.1.951":"2026-07-31T08:04:36.532Z","0.1.952":"2026-07-31T16:00:00.616Z","0.1.953":"2026-07-31T18:04:09.781Z","0.1.954":"2026-07-31T18:39:17.429Z","0.1.955":"2026-07-31T21:42:30.818Z","0.1.956":"2026-08-01T01:33:00.718Z","0.1.957":"2026-08-01T03:22:49.715Z","0.1.958":"2026-08-01T04:02:12.619Z","0.1.959":"2026-08-01T05:06:04.045Z","0.1.960":"2026-08-01T06:12:24.194Z","0.1.961":"2026-08-01T16:13:59.507Z","0.1.962":"2026-08-01T17:19:43.195Z","0.1.963":"2026-08-01T19:10:31.134Z","0.1.964":"2026-08-01T19:16:28.904Z","0.1.965":"2026-08-01T22:37:09.451Z","0.1.966":"2026-08-01T23:11:26.806Z","0.1.967":"2026-08-02T00:48:48.003Z","0.1.968":"2026-08-02T02:48:17.401Z","0.1.969":"2026-08-02T03:42:03.768Z","0.1.970":"2026-08-02T04:55:00.113Z","0.1.971":"2026-08-02T18:27:06.391Z","0.1.972":"2026-08-02T18:43:41.286Z","0.1.973":"2026-08-02T19:25:28.673Z","0.1.974":"2026-08-02T21:38:00.270Z","0.1.975":"2026-08-02T21:47:57.285Z","0.1.976":"2026-08-02T21:52:15.904Z","0.1.977":"2026-08-02T22:00:01.547Z","0.1.978":"2026-08-02T23:31:12.427Z","0.1.979":"2026-08-03T01:37:25.464Z","0.1.980":"2026-08-03T01:47:55.605Z","0.1.981":"2026-08-03T01:56:10.305Z","0.1.982":"2026-08-04T01:59:39.371Z","0.1.983":"2026-08-05T18:09:31.321Z","0.1.984":"2026-08-06T04:41:32.530Z","0.1.985":"2026-08-07T16:54:09.296Z","0.1.986":"2026-08-07T18:20:52.427Z","0.1.987":"2026-08-09T05:42:14.448Z","0.1.988":"2026-08-09T06:07:07.911Z","0.1.989":"2026-08-10T01:09:41.231Z","0.1.990":"2026-08-10T05:51:00.661Z","0.1.991":"2026-08-10T06:15:42.670Z","0.1.992":"2026-08-10T07:11:14.222Z","0.1.993":"2026-08-10T16:22:25.377Z","0.1.994":"2026-08-11T15:59:04.378Z","0.1.995":"2026-08-12T17:41:35.317Z","0.1.996":"2026-08-12T18:07:19.356Z","0.1.997":"2026-08-12T18:54:30.499Z","0.1.998":"2026-08-13T23:54:29.639Z","0.1.999":"2026-08-14T16:42:37.068Z","0.1.1000":"2026-08-14T18:33:17.618Z","0.1.1001":"2026-08-14T20:38:49.099Z","0.1.1002":"2026-08-14T21:17:33.928Z","0.1.1003":"2026-08-14T21:31:47.824Z","0.1.1004":"2026-08-14T21:50:38.308Z","0.1.1005":"2026-08-14T22:07:26.011Z","0.1.1006":"2026-08-14T22:18:28.840Z","0.1.1007":"2026-08-14T22:36:20.627Z","0.1.1008":"2026-08-14T22:56:35.413Z","0.1.1009":"2026-08-14T23:15:00.335Z","0.1.1010":"2026-08-15T00:49:19.010Z","0.1.1011":"2026-08-15T03:27:19.111Z","0.1.1012":"2026-08-15T04:42:54.101Z","0.1.1013":"2026-08-15T07:09:01.586Z","0.1.1014":"2026-08-15T17:26:56.483Z","0.1.1015":"2026-08-15T21:12:56.113Z","0.1.1016":"2026-08-15T23:11:54.597Z","0.1.1017":"2026-08-16T00:39:36.283Z","0.1.1018":"2026-08-16T00:49:14.622Z","0.1.1019":"2026-08-16T17:41:48.926Z","0.1.1020":"2026-08-16T18:55:25.627Z","0.1.1021":"2026-08-21T16:27:01.667Z","0.1.1022":"2026-08-21T18:29:19.222Z","0.1.1023":"2026-08-21T19:21:51.670Z","0.1.1024":"2026-08-22T20:02:23.834Z","0.1.1025":"2026-08-23T04:47:38.477Z","0.1.1026":"2026-08-23T17:52:26.255Z","0.1.1027":"2026-08-24T18:24:21.774Z","0.1.1028":"2026-08-24T20:52:11.183Z","0.1.1029":"2026-08-26T15:40:27.268Z","0.1.1030":"2026-08-27T03:47:57.244Z","0.1.1031":"2026-08-27T04:45:23.083Z","0.1.1032":"2026-08-27T05:49:27.581Z","0.1.1033":"2026-08-28T05:00:58.824Z","0.1.1034":"2026-08-28T05:41:32.651Z","0.1.1035":"2026-08-28T17:03:25.046Z","0.1.1036":"2026-08-31T03:22:50.876Z","0.1.1037":"2026-08-31T05:02:57.055Z","0.1.1038":"2026-09-08T05:16:18.288Z","0.1.1039":"2026-09-10T03:18:37.221Z","0.1.1040":"2026-09-12T13:29:20.027Z","0.1.1041":"2026-09-12T18:37:25.097Z","0.1.1042":"2026-09-12T22:32:14.216Z","0.1.1043":"2026-09-13T17:19:41.063Z","0.1.1044":"2026-09-13T17:42:39.654Z","0.1.1045":"2026-09-13T17:45:56.803Z","0.1.1046":"2026-09-26T17:05:59.597Z","0.1.1047":"2026-09-26T17:44:14.382Z","0.1.1048":"2026-09-27T00:58:06.490Z","0.1.1049":"2026-09-27T01:11:24.545Z","0.1.1050":"2026-09-27T01:26:20.871Z","0.1.1051":"2026-09-27T01:37:14.960Z","0.1.1052":"2026-09-27T02:12:54.837Z","0.1.1053":"2026-09-27T03:08:50.363Z","0.1.1054":"2026-09-28T05:39:07.169Z","0.1.1055":"2026-09-28T06:11:29.217Z","0.1.1056":"2026-09-28T06:32:45.717Z","0.1.1057":"2026-09-29T02:18:53.249Z","0.1.1058":"2026-09-29T02:38:58.868Z","0.1.1059":"2026-10-03T20:27:16.920Z","0.1.1060":"2026-10-03T20:46:19.212Z","0.1.1061":"2026-10-04T02:18:05.607Z"},"description":"A full-stack TypeScript framework for shipping production web apps: Node + React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc subscriptions, built-in auth, AI generation, storage, cron / workers, and a CLI for every workflow.","maintainers":[{"name":"justinmann","email":"justin.mann@gmail.com"}],"readme":"# ugly-app\n\nA full-stack TypeScript framework for shipping production web apps: Node +\nReact + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc\nsubscriptions, built-in auth, AI generation, storage, cron / workers, and a\nCLI for every workflow.\n\nugly-app runs against [ugly.bot](https://ugly.bot), which provides auth,\ninfra (Postgres, Qdrant, NATS, S3-compatible object storage), AI provider\nkeys, email, push, and deployment. Your app talks to all of it through the\nproject's dev tunnel and its `UGLY_BOT_TOKEN`.\n\n```bash\nnpx ugly-app init my-app\ncd my-app\nnpm run dev\n```\n\n## Package entry points\n\n| Import path | Contents |\n|-------------|----------|\n| `ugly-app` (a.k.a. `ugly-app/server`) | Server: `createApp`, `TypedDB`, auth, AI clients, storage, NATS. |\n| `ugly-app/shared` | Cross-tier: `defineRequests`, `defineCollections`, `definePage`, `defineWorkers`, Zod, experiments, model catalogs. |\n| `ugly-app/client` | React: `bootstrapApp`, `createRouter`, `lazyPage` / `lazyPageLoader`, `AppProvider` / `useApp`, `SimpleScrollView`, animations, audio, AI helpers. |\n| `ugly-app/server/adapter/workers` | Cloudflare Workers entry (Hono router + Durable Objects + Neon HTTP driver + R2). |\n| `ugly-app/server/ssr` | SSR renderer used by the Workers adapter. |\n| `ugly-app/playwright`, `ugly-app/testing` | E2E and test-mode helpers. |\n| `ugly-app/vite`, `ugly-app/eslint` | Build-tool plugins. |\n\nAdditional per-feature bundles: `conversation`, `character`, `collab`,\n`markdown`, `search`, `agent`, `webrtc`, `three`, `native`, `inspect`,\n`worker` — each with its own `shared` / `server` / `client` split.\n\n---\n\n## 1. Server — `createApp()`\n\n`createApp` is the single server entry. It owns Express, the WebSocket\nserver, the typed DB, and the RPC dispatcher.\n\n```ts\n// server/index.ts\nimport {\n  createApp,\n  type AppConfigurator,\n  type InboundEmail,\n  type RequestHandlers,\n} from 'ugly-app';\nimport type { WorkerHandlers } from 'ugly-app/shared';\nimport { messages, requests } from '../shared/api';\nimport { collections } from '../shared/collections';\nimport { cronTasks } from '../shared/cron';\nimport { experiments } from '../shared/experiments';\nimport { pages } from '../shared/pages';\nimport { stringsDef } from '../shared/strings';\nimport en from '../shared/lang/en';\nimport es from '../shared/lang/es';\n\nconst cronHandlers: WorkerHandlers<typeof cronTasks> = { /* … */ };\n\nconst app = createApp(\n  { requests, messages },\n  { /* handlers */ } satisfies RequestHandlers<typeof requests>,\n  collections,\n  (configurator: AppConfigurator) => {\n    configurator.setPages({ pages });\n    configurator.setExperiments(experiments);\n    configurator.setStrings({\n      defaultLang: stringsDef.defaultLang,\n      langs: stringsDef.langs,\n      criticalKeys: stringsDef.criticalKeys,\n      getTable: (lang) => ({ en, es })[lang] ?? en,\n    });\n    configurator.setWorkers(cronTasks, cronHandlers);\n    configurator.setOnEmail(async (inbound: InboundEmail) => { /* … */ });\n  },\n);\n\nawait app.start(parseInt(process.env['PORT'] ?? '4321'));\n```\n\n### Signature\n\n```ts\nfunction createApp<\n  R extends AppRegistryBase,               // { requests, messages, pages? }\n  Defs extends CollectionDefRegistry,\n>(\n  registry: R,\n  requests: Partial<RequestHandlers<R['requests']>>,\n  appDefs: Defs,\n  configure?: (c: AppConfigurator) => void,\n  deleteHandlers?: DeleteHandlers<Defs>,   // per-collection onDelete hooks\n): App<CollectionMap<typeof BUILTIN_DEFS & Defs>, RegistryPages<R>>;\n```\n\nPassing `pages` in the registry (`{ requests, messages, pages }`) upgrades\n`app.pushSend()` to a per-route typed API. `pages` is optional; apps that\nonly call `configurator.setPages()` still work — they just get the loose\n`PageRegistry` typing on `pushSend`.\n\n### The returned `App`\n\n`App` extends `AppRouter`, so `dispatch(name, input, userId)` is available\nfor in-process invocation of any registered handler.\n\n| Member | Description |\n|--------|-------------|\n| `start(port?)` | Start the server. Framework default is `3000`; templates pass `PORT` (default `4321`). |\n| `db` | `TypedDB<Map>` — map inferred from your collections + framework built-ins. |\n| `httpServer` | The underlying Node `http.Server`. |\n| `wss` | The main `WebSocketServer` (path set via `setWsPath`, default `/rpc`). |\n| `dispatch(name, input, userId)` | `(name: string, input: unknown, userId: string \\| null) => Promise<unknown>` — invoke any registered RPC handler programmatically. |\n| `registerRoutes(fn)` | Mount additional Express routes after creation. |\n| `pushSend(input)` | Typed push whose click-through target is a route from this app's `pages`. Mints a `https://ugly.bot/l/<code>` short link so the URL is always absolute and dock-app-routable. |\n\nFramework services start inside `app.start()`: schema drift check, NATS\nconnection + KV buckets, data-proxy connection, event-counter flush, TTL\ncleanup for log tables, console/error capture, and ugly.bot log forwarding.\nPostgres, NATS, storage, and AI clients load **lazily** — a host without\n`DATABASE_URL` / `NATS_URL` / `R2_BUCKET` doesn't pay their startup cost.\n\n### `AppConfigurator`\n\nEvery method is optional; `setPages` is what mounts the SPA.\n\n| Method | Purpose |\n|--------|---------|\n| `setPages({ pages, renderPage?, clientDistPath? })` | Mount the SPA. Dev runs Vite in middleware mode; prod serves `clientDistPath` (default `dist/client`). Provide `renderPage(routeName, params) => Promise<string>` to SSR any `ssr: true` pages. |\n| `setUserHelper(helper)` | A `UserHelper<UserBase>` the framework uses to look up / create users on WebSocket auth. |\n| `setOnUserCreate(handler)` | `(userId, { email?, phone? }, db) => Promise<void>` — called on first login; create the user record. |\n| `setAuth(provider)` | Replace the default auth provider (`verify(code)`, `authUrl(origin)`, optional `registerRoutes`). |\n| `setOnSocketMessage(handler)` | Single raw-WebSocket handler. `(ws, userId, msg) => boolean` — return `true` to consume, `false` to fall through. **Replaces** any previously registered handler. |\n| `addSocketMessageHandler(handler)` | Append to the handler chain; first `true` wins. |\n| `setWsPath(path)` | Override the WebSocket path (default `/rpc`). |\n| `setOnWsAuth(handler)` | `(ws, userId, req) => void` — fires after a socket session authenticates. |\n| `setOnAfterStart(handler)` | `(db) => Promise<void>` — called once after data-proxy + NATS are ready. |\n| `setOnMinuteTick(fn)` / `setOnHourlyTick(fn)` | Framework-managed periodic callbacks. Fire only when `CLOCK_ENABLED=true`. Hourly receives `(now, currentHour)`. |\n| `setHealthHandler(fn)` | Override the default `GET /health`. |\n| `setExperiments(experiments)` | Register `Experiment` definitions for `initSession` / `captureEvent` bucketing. |\n| `setIsAdmin(fn)` | `(userId, db) => boolean \\| Promise<boolean>` — gate for admin-only framework requests. Defaults to matching `MAINTAIN_BOT_USER_ID`. |\n| `setZeroTestUserBalance(fn)` | How to zero a synthetic test user's balance so the out-of-credit path can be exercised. Only apps that own the balance ledger register this. |\n| `setOnEmail(handler)` | Handle inbound emails routed to `{domain}@ugly.bot` (delivered as internal HTTP). |\n| `setCronTasks(tasks, handlers)` | **Deprecated.** Legacy cron-only registry — prefer `setWorkers()`. |\n| `setWorkers(workers, handlers)` | Register named async tasks with optional Zod input schema and cron schedule. Powers `GET /_workers/manifest`, `POST /_workers/run`, and the cron orchestrator. Scheduled workers are mirrored into the cron registry automatically. |\n| `setStrings(config)` | Localization config — the framework injects language + critical strings into SSR HTML. |\n| `registerRoutes(fn)` | Mount custom Express routes. |\n| `setWorkerQueue(queue)` | Register a `WorkerQueue` with `start()` / `stop()` for lifecycle management. |\n\n### Handler signatures\n\nHandlers are plain async functions — no context object. Access state via\ncaptured imports (`app.db`, `storage`, `pgQuery`, `uglyBotRequest`, …).\n\n```ts\n// req() — public, userId may be null\ngetPublicData: async (userId: string | null, input) => { /* … */ }\n\n// authReq() — authenticated, framework returns 401 if no/invalid token\ngetMe: async (userId: string, input) => { /* … */ }\n```\n\n### Built-in framework requests\n\n`createApp` registers several framework handlers reachable from any client\nvia the normal RPC pipeline. App-provided handlers with the same name\noverride the framework's defaults. Rate-limited handlers are marked below.\n\n| Name | Notes |\n|------|-------|\n| `userGet` | Returns `{ userId, name, avatarUri }` for the given user (or caller). |\n| `initSession` / `captureEvent` | Session + event logging tagged with experiment branches (public — no auth). |\n| `textGen` | AI text proxy — server-validated, billed through ugly.bot. Rate-limited 20/60s. |\n| `imageGen` | AI image proxy. Rate-limited 10/60s. |\n| `kagiSearch` / `kagiEnrichWeb` / `kagiEnrichNews` | Web search via ugly.bot. Rate-limited 20/60s. |\n| `kagiSummarize` | URL / text summary. Rate-limited 10/60s. |\n| `uploadUrl` | Issues a presigned PUT for the `temp` bucket. |\n| `shareLink` | Mint a `https://ugly.bot/l/<code>` short link with OG metadata. Rate-limited 60/60s. |\n| `feedbackReportCreateNoAuth` | Public, same-origin feedback endpoint used by browser telemetry. Rate-limited 10/60s. |\n| `feedbackReportResolve` | Mark an in-app feedback report resolved/declined. Admin-gated. |\n| `errorLogCaptureNoAuth` | Public error-log capture. |\n| `perfSnapshotCaptureNoAuth` | Public perf snapshot capture. Rate-limited 60/60s. |\n| `adminGetPerfLogs` | Admin-only perf log query used by the CLI `perf:*` commands. |\n| `adminCreateTestUser` / `adminListTestUsers` / `adminDeleteTestUser` | Admin-only synthetic-user management. Gated by `setIsAdmin()`. |\n| `projectPlanList` / `projectPlanCreate` / `projectPlanUpdate` / `projectPlanDelete` | Studio-integration project-plan management. |\n\nAdd per-endpoint rate limits on your own handlers with\n`rateLimit: { max, window }` on the request definition.\n\n---\n\n## 2. Routing\n\nRoute definitions live in `shared/pages.ts`; the client-side router is\ncreated by `createRouter({ pages, allPages?, ssrPages? })`.\n\n### `definePage` / `definePages`\n\n```ts\nimport { definePage, definePages } from 'ugly-app/shared';\n\nexport const pages = definePages({\n  '':              definePage<{}>({ auth: false }),                     // /\n  'user/:userId':  definePage<{ userId: string }>(),                    // /user/abc\n  'search':        definePage<{ q?: string }>({ auth: false, cacheQuery: ['q'] }),\n  'blog/*slug':    definePage<{ slug: string }>({ ssr: true, auth: false }),\n});\nexport type AppPages = typeof pages;\n```\n\n`definePage<Params>(options?)` returns a `PageDef<Params>` — a runtime\nobject carrying `PageMeta` plus a phantom `_params` used only for\nTypeScript inference. `PageMeta` fields:\n\n- `auth` (default `true`) — protected route. When `isAuthenticated()` returns false on this route, the router synchronously renders the framework's `<AuthRoot>` in place of the page (Mode A → `<LoginPopup>`, Mode B → `<MagicLinkForm>` plus optional Google button). Apps cannot override this fallback.\n- `ssr` (default `false`) — server-render the page for SEO. `{ auth: true, ssr: true }` is silently downgraded to `ssr: false` with a warning: the SSR document is served from a shared edge cache and must not depend on the viewer.\n- `cacheQuery?: string[]` — query params that participate in the SSR edge-cache key. Anything NOT listed bypasses the cache instead of poisoning it (e.g. `cacheQuery: ['q']` on a search page).\n- `ssrCacheTimeout?: number` — edge cache lifetime in seconds. Default is `DEFAULT_SSR_CACHE_TIMEOUT` (1 year) because the `buildId` is already part of the cache key. Override only for pages that drift between deploys.\n\nPath syntax: `:param` matches a single path segment; `*param` is greedy\n(captures slashes). Query-string params are declared in `Params` but never\nappear in the path template.\n\n`definePages<T>(p)` is a pass-through identity — use it to name the\nregistry.\n\n### `createRouter()` (`ugly-app/client`)\n\n```ts\nimport { createRouter } from 'ugly-app/client';\nimport { pages } from '../shared/pages';\nimport { allPages } from './allPages';\n\nexport const {\n  RouterProvider,\n  RouterView,\n  useRouter,\n  Link,\n  setAllPages,\n} = createRouter({ pages, allPages });\n```\n\n**Config:**\n- `pages` (required) — the `PageRegistry` from `shared/pages.ts`.\n- `allPages?` — the lazy route → element map (`PageMap<Pages>`). Prefer registering via `setAllPages()` from the browser entry when the app also server-renders — the Worker bundle has no code splitting, so a static import inlines every page (and its deps) into `worker.js`.\n- `ssrPages?: SsrPageMap<Pages>` — `Partial<{ [K]: ComponentType<Params> }>` of statically-imported components for `ssr: true` routes. Used by both the Worker's `renderToString` and the client's first hydration render so the initial paint resolves synchronously and never mismatches the server output.\n\n**Returns:**\n\n- **`RouterProvider`** — props: `children`, `fallback?: ReactNode` (rendered before the initial route resolves), `isAuthenticated?: () => boolean`, `initialUrl?: { pathname, search }` (required for SSR; used during client hydration so the first render matches the server output). Manages route state, browser history, and the popup layer. Runs the per-route auth check synchronously and renders `<AuthRoot>` in place of the page when the current route has `auth: true` and `isAuthenticated()` returns false — apps cannot override this login fallback.\n- **`RouterView`** — renders the active page with animated transitions (default: `ViewFlipper`). Props: `durationMs?`, `easing?: EasingFunction`, `transitionComponent?: React.ComponentType<RouterTransitionProps>`, `renderPage?(state: RouterStateRaw) => ReactElement` (sync alternative to `allPages` loaders — bypassed when the auth guard is showing).\n- **`useRouter()`** — returns `RouterContextValue<Pages>`: `{ current, transitionType, push, replace, back, openPopup, closePopup, closeAllPopups }`. Throws if used outside `<RouterProvider>`.\n- **`Link`** — typed SPA link bound to this router. Renders a real `<a>` (right-click / cmd-click / SEO keep working) but intercepts a plain left-click and routes through `push` / `replace`. Props: `to`, `params` (both type-checked against `pages`), `replace?`, `children`, plus common anchor attrs (`className`, `style`, `target`, `aria-label`, `data-id`, `onClick`).\n- **`setAllPages(map)`** — register the lazy `PageMap<Pages>` after construction (typically from the browser entry, so the Worker's import graph stays free of every lazy page).\n\nA standalone `Link` is also exported from `ugly-app/client` for code that\ncan't easily reach the typed one; it accepts an optional `router` prop and\nfalls back to `<RouterProvider>` context.\n\n**Never use a bare `<a href=\"/route\">`** for internal navigation — it\ntriggers a full document reload (white flash + repaint). See the \"client\nnavigation\" rule in `CLAUDE.md`.\n\n### Page map — `lazyPage` / `lazyPageLoader`\n\n```ts\n// client/allPages.ts\nimport { lazyPage, lazyPageLoader } from 'ugly-app/client';\nimport type { PageMap } from 'ugly-app/shared';\nimport type { AppPages } from '../shared/pages';\n\nexport const allPages = {\n  ['']:             lazyPage(() => import('./pages/HomePage')),\n  ['user/:userId']: lazyPage(() => import('./pages/UserPage')),\n  ['slow/:id']:     lazyPageLoader(() => import('./pages/SlowPageLoader')),\n} satisfies PageMap<AppPages>;\n```\n\n- **`lazyPage(factory)`** — lazy-imports a default-exported `React.ComponentType<Params>`. The page receives route params as props.\n- **`lazyPageLoader(factory)`** — lazy-imports an async loader `(params) => Promise<ReactElement>`. Use when a route needs data fetching before render. The loader file is the chunk boundary, so it can statically import its page component.\n\nBoth wrappers recover from stale-deploy chunk 404s (\"Failed to fetch\ndynamically imported module\"): on the first failure they trigger a single\n`window.location.reload()` (guarded by `sessionStorage` so a genuinely\nbroken chunk can't loop) to fetch fresh chunk hashes.\n\n```ts\n// pages/SlowPageLoader.tsx\nimport SlowPage from './SlowPage';\nexport default async function PageLoader({ id }: { id: string }) {\n  const data = await fetchSlowData(id);\n  return <SlowPage {...data} />;\n}\n```\n\n### `useRouter()`\n\n```ts\nconst {\n  current,           // { routeName, params } — typed union over all pages\n  transitionType,    // 'PUSH' | 'REPLACE' | 'POP' | 'NONE' — how we got here\n  push,\n  replace,\n  back,\n  openPopup,\n  closePopup,\n  closeAllPopups,\n} = useRouter();\n\npush('user/:userId', { userId: '123' });   // → /user/123\nreplace('search', { q: 'hello' });         // → /search?q=hello\nback();                                    // browser history back\n```\n\nRoute names and params are fully typed against `pages`. `push` / `replace`\nno-op with a `console.error` when `buildUrl()` produces a URL that doesn't\nmatch a registered route.\n\n### Popups — `openPopup()`\n\n`useRouter().openPopup()` is the canonical modal / sheet / menu API. The\nrouter owns the popup layer, drives a spring animation, and stacks popups\nz-index-correctly above every page.\n\n```tsx\nconst { openPopup } = useRouter();\n\nconst handle = openPopup(<MyContent />, {\n  mode: 'transient',    // 'block' (default) | 'transient' | 'contextMenu'\n  slideFrom: 'bottom',  // 'left' | 'right' | 'top' | 'bottom' | 'none' (default)\n  onClose: () => {},\n  containerStyle: { /* CSS for the content wrapper */ },\n  backgroundStyle: { /* CSS for the backdrop */ },\n  animConfig: { duration: 300, easing: myEasingFn },\n  renderLayer: (props) => <CustomLayer {...props} />, // fully replace the layer\n});\n\nhandle.hide(); // dismiss programmatically — same as router.closePopup(handle.id)\n```\n\n`openPopup(content, options?)` returns a `PopupHandle = { id, hide }`. Modes:\n\n- **`block`** (default) — 40% opacity backdrop, **does not** dismiss on backdrop click.\n- **`transient`** — 20% opacity backdrop, **dismisses** on backdrop click.\n- **`contextMenu`** — same as transient, intended for menus and pickers.\n\n`renderLayer` receives `{ content, spring, hide }`: `spring` is a\n`createAnimatedValue()` result driving 0 → 1; `hide` closes the popup. The\ndefault layer animates open with `easeOut` (default 250 ms) and closed\nwith `easeIn` (default 200 ms); override via `animConfig`. Popups render\nas siblings of the router's children (managed inside `RouterProvider`), so\nthey stack above every page.\n\n### Scroll containers\n\n`html, body, #root` are `overflow: hidden` — the document itself never\nscrolls, so a page that just renders tall content is clipped. For pages\nthat own their scrolling (or render outside the normal authed chrome —\ne.g. a public page special-cased before the auth gate), wrap the content\nin `SimpleScrollView` (exported from `ugly-app/client`). For long /\nvirtualized lists with scroll-position persistence, use the richer\n`ScrollView`. See the \"page scrolling\" rule in `CLAUDE.md`.\n\n---\n\n## 3. Client — `bootstrapApp()` and `useApp()`\n\nThe recommended client entry point. Handles auth detection, socket\ncreation, background account-sync with ugly.bot, and provider wiring.\n\n```tsx\n// client/main.tsx\nimport { bootstrapApp } from 'ugly-app/client';\nimport { requests } from '../shared/api';\nimport { RouterProvider, RouterView } from './router';\nimport './styles.css';\n\nbootstrapApp({\n  requests,\n  RouterProvider,\n  render: () => <RouterView />,\n});\n```\n\n`bootstrapApp(options): void` renders directly to the DOM.\n\n**`BootstrapAppOptions`:**\n\n| Field | Description |\n|-------|-------------|\n| `requests` | Your `RequestRegistry` (merged with framework requests internally). |\n| `messages?` | Your `MessageRegistry` (merged with framework messages). |\n| `RouterProvider` | The `RouterProvider` component returned from `createRouter()`. |\n| `render` | Callback returning the app's UI tree (typically `<RouterView />`). |\n| `root?` | Root element or CSS selector (default `'#root'`). |\n| `fallback?` | UI for unmatched routes (default: tiny \"404\"). |\n| `socketUrl?` | Override the WebSocket path (default `/rpc`). |\n| `strings?` | Localization config — when present, wraps the tree with `<StringsProvider>`. |\n| `keyboard?: false` | Disable the framework `<KeyboardProvider>` wrapper. |\n| `billingBanner?: false` | Disable the out-of-credit banner. Only set on apps where the developer pays for AI (owner-billed proxy token) — apps that make user-billed calls should leave it on so a user with no credit sees a warning instead of silent request failures. Has no effect inside Ugly Studio (which shows its own). |\n| `silentSso?` | Apex-domain apps that use ugly.bot as their auth authority but don't share its cookie. When `true`, a logged-out boot attempts a top-level SSO redirect (once per tab) to adopt an existing ugly.bot session. Leave unset for `*.ugly.bot` subdomains and Mode B apps. |\n| `testMode?` | Skip ugly.bot silent SSO and trust the auth cookie the fixture set. Only honored when `UGLY_APP_TEST_MODE=1`. |\n\n`bootstrapApp` reads `window.__AUTH_TOKEN__` (injected by the server after\ncookie verification). If absent, it renders unauthenticated immediately —\nthe router's per-route auth guard surfaces `<AuthRoot>` only when the user\nopens a protected route. If the token is present, it connects the socket,\nmounts `<AppProvider>`, and renders.\n\nAfter render, a hidden iframe silently calls\n`${UGLY_BOT_URL}/oauth/silent`: if it returns a fresh code, the cookie is\nrefreshed via `POST /auth/verify`; if the returned account differs from\nthe current session, the page reloads onto the live account (guarded once\nper from→to pair to prevent loops). Any `?ugly_oauth_code=…` in the URL\n(redirect-fallback OAuth code from ugly.bot) is redeemed at the top of\nbootstrap before anything renders.\n\nIf `bootstrapApp` is loaded at `/auth/magic-link/verify` (Mode B), it\nrenders `<MagicLinkCallback>` instead of the regular app shell.\n\n### `AppProvider` & `useApp()`\n\n`bootstrapApp` mounts `<AppProvider>` automatically after socket connect.\nUse `useApp()` inside any page to access the active user, socket, and\napp-scoped services.\n\n```ts\nconst {\n  userId,        // current user id (string)\n  user,          // UserBase doc\n  socket,        // AppSocket — typed RPC client\n  uglyBotSocket, // UglyBotSocket | null — direct platform socket for STT/TTS\n  showPopup,     // (content: ReactElement) => id — flat overlay layer (see note)\n  hidePopup,     // (id: string) => void\n  hideAllPopups, // () => void\n  runAsync,      // (label, async () => {…}, options?) — shows loading overlay\n  splashDone,    // (step: string) => void — mark a splash-screen step complete\n  localizer,     // (key, params?) => string — alias for useLocalizer()\n} = useApp();\n```\n\n`useApp<TAsyncOptions>()` is generic in the async-options type so apps can\npass a custom option through to a custom `loadingOverlay` element. When\n`runAsync` is pending, `AppProvider` `cloneElement`s the overlay with\n`{ label, asyncOptions }` (and hides it once the last concurrent\n`runAsync` resolves — counts are refcounted, not toggled).\n`useAppOptional()` returns `null` outside the provider;\n`useLocalizer()` prefers `<StringsProvider>` data, falls back to the\n`AppProvider` `localizer` prop, and finally to identity.\n\nTwo popup APIs coexist: `useRouter().openPopup()` (spring-animated,\ndismissible, mode-aware — **the default choice**) and `useApp().showPopup()`\n(a flat overlay layer returning a string id, for content that must sit\n*outside* the router transition). Prefer the router's.\n\n### Direct socket access\n\n`AppSocket` is exposed through `useApp().socket`. Common methods:\n\n| Method | Description |\n|--------|-------------|\n| `request(name, input)` | Invoke a typed RPC handler. |\n| `getDoc(collection, id)` | Server-mediated doc fetch. |\n| `getDocs(collection, filter?, opts?)` | Filtered query. |\n| `trackDoc(collection, id, cb)` | Live subscription (with initial snapshot) — returns unsubscribe. |\n| `trackDocs(collection, params, cb)` | Live filtered subscription (with initial snapshot). |\n| `uploadFile(file, key)` | Presigned upload to the `temp` bucket. |\n| `connectionState` | `'connecting' \\| 'connected' \\| 'reconnecting' \\| 'disconnected' \\| 'idle-disconnected'`. |\n| `disconnect()` | Close the connection. |\n\nFor pure HTTP (no WebSocket), use\n`createHttpClient({ requests, token?, baseUrl? })` from `ugly-app/client`.\n\n---\n\n## 4. Auth flow\n\nugly-app uses HttpOnly cookies and server-side JWT injection — no\n`localStorage`, no client-side token handling.\n\nTwo modes, picked from the `auth` block in the project's `.uglyapp` config:\n\n- **Mode A — `mode: 'uglybot'`** (default when no `auth` block is present). Auth is delegated to ugly.bot OAuth. AI / email / push proxies bill the end user's ugly.bot credits.\n- **Mode B — `mode: 'self'`**. The app issues its own sessions via magic-link email and/or Google OAuth. AI / email / push proxies bill the developer's ugly.bot account using the project's `AI_PROXY_TOKEN`.\n\n`window.__UGLY_APP_AUTH_MODE__` is injected into every page so client code\n(incl. `<AuthRoot>`) can branch correctly. In Mode B with Google\nconfigured, `window.__UGLY_APP_GOOGLE_CLIENT_ID__` is also injected.\n\n### Mode A — ugly.bot OAuth (default)\n\n1. Every page request: the server checks the `auth_token` cookie. If it verifies through `${UGLY_BOT_URL}/verify`, the server injects `window.__AUTH_TOKEN__` into the HTML.\n2. Client boot: if `__AUTH_TOKEN__` is present, `bootstrapApp` opens the WebSocket with the token. Otherwise it renders logged-out immediately (no first-paint block).\n3. Background account-sync (always): `bootstrapApp` opens a hidden iframe to `${UGLY_BOT_URL}/oauth/silent`. If it returns a one-time code, the client POSTs `/auth/verify` to refresh the cookie. If the refreshed account's `userId` differs, the client calls `/auth/logout` and reloads onto the live account (guarded once per from→to pair).\n4. Apex apps (`silentSso: true`): if the hidden iframe can't read ugly.bot's cookie (Safari / 3p-cookie blocking), a **top-level** redirect to `/oauth/silent` (first-party) runs instead — one-shot, marked done in `localStorage` so it can't loop.\n5. Manual login: on protected routes, the per-route auth guard surfaces `<AuthRoot>` → `<LoginPopup>`, which opens `${UGLY_BOT_URL}/oauth` in a popup. On completion, the platform redirects back with either a `postMessage` code or `?ugly_oauth_code=…`; `bootstrapApp` redeems either at the top of boot.\n\n### Mode B — self-issued sessions\n\nWhen `.uglyapp` sets `auth.mode: 'self'`, `buildAuth()` wires the\nmagic-link provider as primary; if `providers.google.clientId` is\nconfigured it adds Google as an extra provider on the same router.\n\n- `<AuthRoot>` renders `<MagicLinkForm>` (plus the Google button when configured) instead of `<LoginPopup>`.\n- Background ugly.bot silent SSO is a no-op.\n- `POST /auth/magic-link/request` accepts an email, mints a one-time token (default 15 min lifetime, configurable via `auth.magicLinkExpiresMin`), and emails a link.\n- `GET /auth/magic-link/verify?token=…` validates the token, calls `onUserCreate` on first login, sets the session cookie, and redirects.\n- Google login lives at `GET /auth/google/url` + `POST /auth/google/callback` when enabled.\n\n### Token-in-URL embed\n\nAny GET request with `?token=<JWT>` will, if the token verifies, set the\ncookie and 302-redirect to the same URL without the token parameter —\nuseful for embedding any page in an iframe.\n\n### Built-in auth routes\n\n| Endpoint | Description |\n|----------|-------------|\n| `POST /auth/verify` | Exchange an OAuth `code` for a session cookie. |\n| `POST /auth/logout` | Clear the cookie. |\n| `GET /auth/token` | Refresh and return the current token. |\n| `GET /auth/url` | Return the OAuth popup URL. |\n| `POST /auth/magic-link/request` | Mode B only — send a magic-link email. |\n| `GET /auth/magic-link/verify` | Mode B only — verify a magic-link token and set the cookie. |\n| `GET /auth/google/url`, `POST /auth/google/callback` | Mode B only — Google OAuth, registered when configured. |\n\n### Custom provider\n\n```ts\nconfigurator.setAuth({\n  verify: async (code) => ({ userId: '…', token: 'platform-issued-jwt' }),\n  authUrl: (origin) => `https://my-oauth.example/authorize?origin=${origin}`,\n  registerRoutes: (router, { db, onUserCreate }) => { /* extra routes */ },\n});\n```\n\n### Server-side auth helpers\n\n- `verifyToken(token)` — verifies a token against ugly.bot and returns the `userId`.\n- `getRequestUser(req)` — synchronous decode of the per-project `UGLY_PROJECT_TOKEN` cookie set by ugly.bot's wake-on-traffic gate. Returns `{ userId } | null` without a network round-trip; safe as the primary auth check in deployed-app handlers.\n\n---\n\n## 5. Database — `TypedDB`\n\nAccess via `app.db`. All methods accept a `CollectionDef` (from\n`defineCollections()`) or, on the `raw*` / `getQuery*` variants, a plain\ncollection name string.\n\n### Requests (`shared/api.ts`)\n\n```ts\nimport { authReq, defineRequests, req, z } from 'ugly-app/shared';\n\nexport const requests = defineRequests({\n  // Public — handler signature: (userId: string | null, input) => Promise<output>\n  getPublicData: req({\n    input: z.object({ id: z.string() }),\n    output: z.object({ data: z.string() }),\n  }),\n\n  // Authenticated — 401 enforced automatically, userId guaranteed string\n  getMe: authReq({\n    input: z.object({}),\n    output: z.object({ userId: z.string(), email: z.string().optional() }),\n  }),\n\n  // Per-endpoint rate limiting — enforced before the handler runs\n  submitFeedback: authReq({\n    input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),\n    output: z.object({ id: z.string() }),\n    rateLimit: { max: 20, window: 60 },\n  }),\n});\n```\n\nEvery request is reachable as **both** `socket.request(name, input)`\n(WebSocket) and `POST /api/:name { input }` (HTTP). `z` is re-exported from\nZod for convenience.\n\n### Collections (`shared/collections.ts`)\n\n```ts\nimport { defineCollections, InferDocType, neon } from 'ugly-app/shared';\nimport { z } from 'zod';\n\nexport const TodoSchema = z.object({\n  userId: z.string(),\n  text: z.string(),\n  done: z.boolean(),\n});\nexport type Todo = InferDocType<typeof TodoSchema>;\n\nexport const collections = defineCollections({\n  todo: {\n    schema: TodoSchema,\n    meta: {\n      db: neon,                // REQUIRED — `neon` (Postgres) or `d1` (SQLite / D1)\n      cache: true,             // or { ttlMs: 60_000 }\n      trackable: true,\n      public: false,\n      cascadeFrom: null,\n    },\n  },\n});\n```\n\n**`CollectionMeta`:**\n- `db` — **required.** `neon` (Postgres) or `d1` (Cloudflare D1 / SQLite). Both handles are exported from `ugly-app/shared`. Omitting it is a compile error and runtime throw.\n- `cache` — `true` / `false` / `{ ttlMs }`. When enabled, `getDoc` / `getByIds` read from an LRU cache; writes invalidate it.\n- `trackable` — enables real-time `trackDoc` / `trackDocs` via change-stream NATS notifications.\n- `public` — allow unauthenticated client reads.\n- `cascadeFrom` — parent collection: when the parent doc is deleted, docs in this collection are cascade-deleted.\n- `trackKeys?` — fields usable as NATS routing keys for scoped `trackDocs` subscriptions.\n- `getter?(ids)` — batch resolver for collections with no local table (e.g. `userPublic` resolves via ugly.bot).\n- `skipReadValidation?` — opt out of per-row zod validation on reads for very hot collections. Writes are always validated. Global kill-switch: `UGLY_DB_VALIDATE_READS=0`.\n- `search?: { fields, language? }` — full-text index over the named JSONB paths (Neon: Postgres FTS; D1: SQLite FTS5, ranked by bm25). On D1 this provisions two extra tables per collection — the `\"<collection>_fts\"` mirror and a small `\"<collection>_ftsid\"` `_id`→rowid map. The map is not optional bookkeeping: FTS5 can only seek on `rowid`, so without it every write full-scans the whole index (it once accounted for 98.8% of the account's D1 rows read). Don't hand-write against `_fts`; go through `searchDocs`.\n- `vector?: { dimensions, metric?, filterable? }` — ANN index. Vector supplied out-of-band at write time (`setDoc(c, doc, { vec })`) — never stored in the doc JSON. Query with `getDocs(c, filter, { near })`.\n\nAll documents extend `DBObject`: `{ _id, version, created, updated }`.\nUse `dbDefaults()` to stamp `version` / `created` / `updated` on inserts.\n**Always generate `_id` with `nanoid()`** — never `crypto.randomUUID()`,\n`Date.now()`, or `Math.random()` (see `CLAUDE.md`).\n\nAfter schema changes, run `npm run db:schema-gen` then `npm run db:migrate`.\nThe app refuses to start when drift is detected (set `SCHEMA_CHECK_SKIP=true`\nonly as a last resort).\n\n### Writing\n\n```ts\nawait db.setDoc(collections.note, doc);                                  // upsert\nawait db.setDoc(collections.note, doc, { skipIfExists: true });          // insert-only\nawait db.setDoc(collections.note, doc, { vec: embedding });              // out-of-band vector\nawait db.setDoc(collections.note, doc, { transient: true });             // ephemeral trackDocs frame\n\nawait db.setDocFields(collections.note, id, { title: 'New' });           // partial; throws if missing\nawait db.setDocFieldsOrIgnore(collections.note, id, { title });          // returns null if missing\nawait db.setDocFieldsOrCreate(collections.note, id, { title }, default); // upsert with default\n\nawait db.setDocOp(collections.note, id, { $inc: { views: 1 } });         // MongoDB-style ops\nawait db.setDocOpOrIgnore(collections.note, id, { $inc: { views: 1 } });\n\n// Coalesce trackDocs notifications for multiple writes into one flush per key.\n// batch() takes a function — NOT an array of ops — and returns its result.\nawait db.batch(async () => {\n  await db.setDoc(collections.note, note);\n  await db.setDocFields(collections.user, userId, { updated: Date.now() });\n});\n```\n\nSupported update operators: `$inc`, `$addToSet`, `$pull`, `$unset`, `$set`.\nAll keys are dot-notation, fully typed against the collection's schema.\nPartial updates go through optimistic concurrency to prevent lost updates\non concurrent writers.\n\n### Reading\n\n```ts\nconst doc  = await db.getDoc(collections.note, id);\nconst many = await db.getByIds(collections.note, ids);                    // batched, order-preserving, cache-aware\n\n// Typed SQL-native query API (preferred for new code) — filter/sort keys must be indexed.\nconst notes  = await db.find(collections.note, { userId, done: { $ne: true } }, { sort: { created: -1 }, limit: 20 });\nconst count  = await db.findCount(collections.note, { userId });\nconst sample = await db.findRandom(collections.note, { userId }, 5);\n\n// getDocs — same constraint set as find, plus optional full-text `search` and vector `near`.\nconst docs = await db.getDocs(collections.note, { userId }, { sort: { created: -1 }, limit: 20 });\n\n// Aggregation pipelines (untyped; escape hatch for unindexed queries)\nconst results = await db.getQuery<MyResult>('note', pipeline, { skip, limit });\nconst total   = await db.getQueryCount('note', pipeline);\nconst raw     = await db.getQueryRaw<MyResult>('note', pipeline);\n\n// Dynamic / untyped access — when the collection name is a runtime string\nawait db.rawGetDoc('note', id);\nawait db.rawGetDocs('note', filter, { sort: { created: -1 }, limit: 20 });\n```\n\n### Deleting\n\n```ts\nawait db.deleteDoc(collections.note, id);                  // cascade-deletes children\nawait db.deleteWhere(collections.note, { userId });        // typed bulk delete\nawait db.deleteQuery(collections.note, { userId });        // legacy untyped bulk delete\n```\n\nPass `deleteHandlers` as the 5th argument to `createApp` to run\nper-collection `onDelete` callbacks.\n\n### Search\n\n```ts\n// Full-text — requires `search: { fields, language? }` on the collection\nconst hits = await db.searchDocs(collections.note, 'react hooks', { limit: 10 });\n\n// Vector — requires `vector: { dimensions }` on the collection; vector supplied at write time\nconst similar = await db.vectorSearch(collections.note, embeddingVector, { limit: 10 });\nconst vecs    = await db.getVecs(collections.note, ids);\n```\n\n### Caching\n\n```ts\ndb.cacheGet<MyType>(key);\ndb.cacheSet(key, value, ttlMs);\ndb.cacheDelete(key);                                       // broadcasts invalidation via NATS\nconst k = db.cacheKey('prefix', id);\n```\n\n### Helpers\n\n```ts\nimport { createUserHelper, dbDefaults } from 'ugly-app';\nimport { nanoid } from 'nanoid';\n\nconst newDoc = { _id: nanoid(), ...dbDefaults(), title: 'Hi' };\n//                              ^^^^^^^^^^^^^^^ { version: 1, created, updated }\n\nconst userHelper = createUserHelper<User>(collections.user);\nconst user = await userHelper.get(db, userId);\n```\n\n### Direct SQL & infra\n\nImports available from `ugly-app`:\n\n- `pgQuery(sql, params?)` — parameterized SQL on the data proxy.\n- `ensureTable(…)`, `tableExists(…)`, `ensureSearchColumn(…)`.\n- `ensureQdrantCollection(…)`, `upsertVector(…)`, `searchVectors(…)`, `deleteVector(…)`, `deleteQdrantCollection(…)`.\n- `connectNats()`, `natsPublish(subject, payload)`, `natsSubscribe(subject, cb)`, `ensureKvBucket(name, opts)`, `jsPublish(…)`, `jsConsumerCreate(…)`, `jsConsumerConsume(…)`.\n- `subscribeCollection`, `subscribeDoc`, `subscribeDocKey` — NATS subjects emitted by the data proxy on writes.\n\n---\n\n## 6. AI providers\n\nAI calls are proxied through ugly.bot — your app never holds a provider\nkey. Pass `UGLY_BOT_TOKEN` in the environment and the framework handles\nrouting, balance tracking, retries, and per-user billing.\n\n### Server-side text generation\n\n```ts\nimport { createTextGen } from 'ugly-app';\nconst textGen = createTextGen(userId);\n\nconst text = await textGen.generate(messages, { model: 'gemini_2_5_flash' });\nconst obj  = await textGen.generateJson(mySchema, messages, { model: 'gemini_2_5_flash' });\n```\n\nOr invoke the framework `textGen` request through the RPC pipeline — its\nschema is intentionally minimal (`{ model, messages }` in, `{ text }` out).\nReach for `createTextGen(...).generate(messages, options)` when you need\n`maxTokens`, `temperature`, `thinking`, tool calls, or streaming.\n\n```ts\nconst { text } = await app.dispatch('textGen', {\n  model: 'gemini_2_5_flash',\n  messages: [{ role: 'user', content: 'Hello!' }],\n}, userId) as { text: string };\n```\n\nAvailable models are exposed via `textGenModels` / `textGenModelData` from\n`ugly-app` — the platform supports Claude, GPT, Gemini, Together, Groq,\nFireworks, Kimi, and Kie families.\n\n### Server-side image generation\n\n```ts\nimport { createImageGen } from 'ugly-app';\nconst imageGen = createImageGen(userId);\n\nconst url = await imageGen.generate('A red panda eating noodles', { model: 'flux_schnell' });\n```\n\n`imageGenModels` / `imageGenModelData` enumerate available models\n(Together FLUX, FAL, Google Imagen, Wavespeed, Kie Kolors).\n\n### Embeddings\n\n```ts\nimport { createEmbeddingClient, cosineSimilarity } from 'ugly-app';\nconst embeddings = createEmbeddingClient();\nconst vector = await embeddings.embed('hello world');\nconst many   = await embeddings.embedBatch(['a', 'b', 'c']);\nconst sim    = cosineSimilarity(vectorA, vectorB);\n```\n\n### Web search\n\n```ts\nimport { createWebSearchClient } from 'ugly-app';\nconst search = createWebSearchClient(userId);\n\nawait search.search({ query: 'react 19', limit: 10 });\nawait search.summarize({ url: 'https://…' });\nawait search.enrichWeb({ query: 'topic' });\nawait search.enrichNews({ query: 'topic' });\n```\n\n### Client-side AI calls\n\nCalls from React components go through the framework RPC pipeline — no\ntoken plumbing in the browser:\n\n```ts\nimport { callTextGen, callJsonGen, callImageGen } from 'ugly-app/client';\n\nconst text  = await callTextGen({ messages, model: 'gemini_2_5_flash' });\nconst json  = await callJsonGen({ messages, schema, model: 'gemini_2_5_flash' });\nconst image = await callImageGen({ prompt: 'a corgi astronaut', model: 'flux_schnell' });\n```\n\n### STT / TTS\n\nSpeech goes **directly** from the browser to ugly.bot — never proxied\nthrough your app server (see the \"STT/TTS routes to ugly.bot\" rule in\n`CLAUDE.md`).\n\n```ts\nimport { useSTT, useTTS, AudioPlayer, AudioRecorder } from 'ugly-app/client';\n\nconst { start, stop, transcript, isListening } = useSTT(uglyBotSocket, options);\nconst { speak, stop: stopTTS }                 = useTTS(uglyBotSocket);\n```\n\n`uglyBotSocket` is the `UglyBotSocket` on `useApp()`; it opens a direct\nWebSocket to the platform.\n\n### Sharing / share links\n\n```ts\nimport { shareLink } from 'ugly-app';   // server\nconst url = await shareLink({\n  target: `/article/${id}`,             // app route or absolute URL\n  og: { title, description, image },    // OG card metadata\n  requireAuth: false,                   // true → logged-out web users hit login\n});                                     // → https://ugly.bot/l/<code>\n```\n\nMinting is idempotent (deterministic code) and dedupes within a run.\nNever hand-build outbound URLs (`${PUBLIC_URL}/article/${id}`) in emails,\npush, or share flows — always go through `shareLink()`. See the \"sharing\nlinks\" rule in `CLAUDE.md`.\n\n---\n\n## 7. Storage\n\nS3-compatible. Two logical buckets:\n\n- **`temp`** — short-lived uploads (presigned PUT from the browser).\n- **`public`** — durable, served by CDN.\n\nServer-side (`StorageClient` from `createStorageClient()`):\n\n```ts\nimport { createStorageClient } from 'ugly-app';\nconst storage = createStorageClient();\n\nconst url = await storage.put('temp', key, buffer, 'image/png');           // returns URL\nconst publicUrl = await storage.moveToPublic(tempKey, destKey);\nconst permaUrl  = storage.url('public', destKey);\nconst { uploadUrl, resultUrl } = await storage.presignedPut('temp', key);\nawait storage.delete('public', destKey);\n```\n\nClient-side, use `socket.uploadFile(file, key)` — it requests a presigned\nURL via the built-in `uploadUrl` framework request and streams the upload.\nIn dev, uploads go through a same-origin `/_s3` proxy to avoid CORS with\nlocal MinIO.\n\n`STORAGE_KEY_PREFIX` (env) prefixes all keys — useful for per-environment\nisolation.\n\nOn Cloudflare Workers, storage uses the R2 binding directly; presigned\nPUTs are not exposed (browser uploads must go through a Worker endpoint).\n\n### Static assets — `static/`\n\nLarge, rarely-changing files (3D models, textures, audio, fonts) go in the\nproject-root `static/` folder. `ugly-app build:static` hashes them and\ngenerates `shared/StaticAssets.ts`; publish uploads only the files whose\nbytes changed.\n\n```ts\nimport { staticUrl } from '../shared/StaticAssets'\n\nconst url = staticUrl('models/char2.ugm')\n// → 'https://static.myapp.com/static/models/char2.a1b2c3d4e5f6.ugm'\n```\n\nThe bucket gets its own custom domain, so **Cloudflare's CDN serves these\ndirectly** — no Worker invocation per request, and R2 answers `Range`\nnatively for progressive loaders. Publish also sets the bucket CORS policy\nand a `Cross-Origin-Resource-Policy: cross-origin` response rule, without\nwhich COEP `require-corp` would silently block them.\n\nUnlike `/{buildId}/assets/*`, these URLs do not change when you deploy, so\nreturning users do not re-download unchanged files. Assets that no build\nfrom the last `retentionDays` (default 7) references are deleted from R2\nautomatically, along with expired `builds/` prefixes.\n\nRequires a provisioned app domain — publish fails rather than emitting\nURLs nothing serves. Configure in `.uglyapp`:\n\n```json\n\"staticAssets\": { \"dir\": \"static\", \"retentionDays\": 7 }\n```\n\nDev serves the same files off disk at same-origin, so a newly added asset\nworks before it has ever been published.\n\n### `hostBundle` — serve the vite bundle from the CDN too\n\n```json\n\"staticAssets\": { \"hostBundle\": true }\n```\n\nOpt-in. Publish provisions `static.<zone>` (or `<app>-static.<zone>` for a\nsubdomain app), persists the `baseUrl`, and vite then emits every asset\nURL against it. Because the URLs are content-addressed rather than\nbuild-id prefixed, a byte-identical chunk keeps its URL across deploys —\nso returning users re-download only what actually changed, and each deploy\nuploads a handful of KB instead of the whole bundle.\n\nThe first deploy only provisions; the bundle moves to the CDN on the next\none. That is deliberate — a single pass would point the bundle at a\nhostname whose TLS certificate may not have issued yet.\n\n**Workers are handled for you, but know why.** The bundle is then\ncross-origin, and `new Worker(url)` *rejects a cross-origin script URL\noutright* — that is structural, and no CORS or CORP header lifts it.\n`bootstrapApp` installs a shim that routes such URLs through a same-origin\n`blob:` importing the real script, so `new Worker(new URL('./x.worker.ts',\nimport.meta.url))` keeps working. `SharedWorker` is **not** shimmed: every\nblob URL is unique, so the same trick would give each caller a private\nworker and break sharing. Register service workers by root-absolute path\n(`/sw.js`) — `register()` resolves against the document, so those stay\nsame-origin.\n\n---\n\n## Workers & cron\n\n```ts\n// shared/cron.ts\nimport { defineWorkers, z } from 'ugly-app/shared';\n\nexport const cronTasks = defineWorkers({\n  dailyCleanup: {\n    schedule: '0 3 * * *',   // every day at 03:00 UTC\n    description: 'Delete completed todos older than 30 days',\n  },\n  resyncSearch: {\n    inputSchema: z.object({ since: z.string().datetime() }),\n    description: 'Re-embed search vectors since the given ISO timestamp',\n  },\n});\n```\n\n```ts\n// server/index.ts\nconst cronHandlers: WorkerHandlers<typeof cronTasks> = {\n  dailyCleanup: async () => { /* runs on schedule */ },\n  resyncSearch: async ({ since }) => { /* runs on manual trigger from studio */ },\n};\n\nconfigurator.setWorkers(cronTasks, cronHandlers);\n```\n\nEach worker can have `inputSchema`, `outputSchema`, `schedule`, `timeout`,\n`description`. Workers without a schedule are still invocable via\n`POST /_workers/run` (auth: localhost in dev, `Authorization: Bearer $CRON_SECRET`\nin prod). Scheduled workers also appear in `/_cron/manifest` for the\ndeploy orchestrator.\n\nOn the Workers adapter, scheduled workers dispatch through Cloudflare Cron\nTriggers and durable queueing goes through Cloudflare Queues. On the Node\nadapter, `enqueueWorker` runs the handler inline (in-process queues only).\n\n---\n\n## Localization\n\n```ts\nconfigurator.setStrings({\n  defaultLang: 'en',\n  langs: ['en', 'es'],\n  criticalKeys: ['app.title', 'nav.home'],\n  getTable: (lang) => tables[lang] ?? tables.en,\n});\n```\n\nThe framework injects `window.__LANG__`, `window.__STRINGS_VERSION__`, and\n`window.__CRITICAL_STRINGS__` into SSR HTML. Use `useLocalizer()` /\n`useStrings()` / `useLang()` / `useChangeLanguage()` on the client.\n\n---\n\n## Experiments\n\n```ts\nimport type { Experiment } from 'ugly-app/shared';\n\nexport const experiments: Experiment[] = [\n  {\n    id: 'new-onboarding',\n    name: 'New Onboarding',\n    active: true,\n    branches: [\n      { id: 'control', weight: 50 },\n      { id: 'variant', weight: 50 },\n    ],\n    events: ['ONBOARDING_COMPLETE'],\n  },\n];\n\nconfigurator.setExperiments(experiments);\n```\n\nBucketing is deterministic: `hash(experimentId + userId)` (or `sessionId`\nfor unauthenticated users). The framework's `initSession` / `captureEvent`\nrequests automatically tag events with the user's branch assignments.\n\n---\n\n## Built-in HTTP endpoints\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /health` | Health check — returns `{ status, timestamp, lastRequestAt }`. |\n| `POST /api/:name` | Dispatch any registered request handler over HTTP. |\n| `POST /auth/verify` | Exchange OAuth code for session cookie. |\n| `POST /auth/logout` | Clear the auth cookie. |\n| `GET /auth/token` | Refresh and return the current token. |\n| `GET /auth/url` | Get the OAuth popup URL. |\n| `GET /_workers/manifest` | Worker definitions (used by ugly-studio). |\n| `POST /_workers/run` | Synchronously invoke a worker handler. |\n| `GET /_workers/runs` | Recent in-memory worker runs (last 200). |\n| `GET /_cron/manifest` | Cron tasks for the deploy orchestrator. |\n| `POST /api/_cron/:taskName` | Trigger a cron task (auth via `CRON_SECRET`). |\n| `POST /internal/email-callback` | Inbound email gateway (auth via `INTERNAL_EMAIL_SECRET`). |\n| `PUT /_s3/*` | Dev-only S3 upload proxy (avoids CORS with MinIO). |\n\n---\n\n## Two-adapter architecture\n\nThe same developer source compiles for two runtimes via\n`src/server/adapter/`:\n\n- **Adapter A — Node + TCP** (`src/server/adapter/node/`): default for `npm run dev` and any non-Workers deploy. Wraps `pg.Pool`, `nats.js`, AWS S3 SDK.\n- **Adapter B — Cloudflare Workers** (`src/server/adapter/workers/`): used when the Studio publish flow deploys to Cloudflare. Hono router + Durable Objects (one `CollectionDO` per project-collection, plus a `SessionDO` per user WS) + `@neondatabase/serverless` HTTP driver + R2 binding + Cloudflare Cron Triggers + Cloudflare Queues.\n\nDeveloper-facing APIs (`createTypedDB`, `subscribeDoc`,\n`createStorageClient`, `setCronTasks`, `setWorkers`) don't change between\nadapters. Local Workers dev boots via `npm run dev:workers`, which starts\na small Node HTTP proxy speaking Neon's wire format so the Worker can talk\nto a real Postgres.\n\n---\n\n## Environment variables\n\n| Variable | Description |\n|----------|-------------|\n| `PORT` | Server port (templates default to 4321). |\n| `NODE_ENV` | `development` or `production`. |\n| `UGLY_BOT_TOKEN` | App token for the ugly.bot platform — required for AI, logs, billing. |\n| `UGLY_BOT_URL` | Override the platform base URL (default `https://ugly.bot`). |\n| `DATA_PROXY_URL` | WebSocket URL for the data proxy (default `ws://localhost:4200`). |\n| `DATA_PROXY_TOKEN` | Auth token for the data proxy. |\n| `STORAGE_KEY_PREFIX` | Prefix all storage keys (per-env isolation). |\n| `MINIO_ENDPOINT` | Dev-only S3 endpoint for the upload proxy. |\n| `NATS_PREFIX` / `COMPOSE_PROJECT_NAME` | NATS subject prefix for per-env isolation. |\n| `CLOCK_ENABLED` | `true` to enable `setOnMinuteTick` / `setOnHourlyTick`. |\n| `CRON_SECRET` | Bearer secret for `POST /api/_cron/:taskName` and prod `POST /_workers/run`. |\n| `MAINTAIN_BOT_USER_ID` | User id allowed to access admin-only handlers when `setIsAdmin()` is unset. |\n| `INTERNAL_EMAIL_SECRET` | Shared secret for `/internal/email-callback`. |\n| `JWT_SECRET` | Required when using `getRequestUser()` for the per-project session cookie. |\n| `APP_DOMAIN` | App domain; combined with `NATS_PREFIX` for `getRequestUser()` validation. |\n| `LOG_CAPTURE_URL` | Studio override for client log capture (empty → ugly.bot default). |\n| `UGLY_APP_HMR` | Set to `false` to disable Vite HMR in dev. |\n| `SCHEMA_CHECK_SKIP` | `true` to start despite schema drift (unsafe). |\n| `NEON_PROXY_URL` | Set by `dev:workers` — Neon-wire endpoint the local Neon HTTP driver dials. |\n| `CLOUDFLARE_WORKERS` | Set to `1` inside the Workers adapter for runtime detection. |\n\nBrowser-visible variables must be prefixed `VITE_` and consumed via\n`import.meta.env.VITE_*`.\n\n---\n\n## CLI\n\n| Command | Description |\n|---------|-------------|\n| `ugly-app init <name>` | Scaffold a new project. |\n| `ugly-app upgrade` | Upgrade framework config files to the latest version. |\n| `ugly-app configure` | Generate/update `.uglyapp` config. |\n| `ugly-app login` | Authenticate with ugly.bot. |\n| `ugly-app url` | Print the local dev server URL. |\n| `ugly-app deploy` | Build + push to production infrastructure. |\n| `ugly-app prod --buildId <id>` | Promote a build to prod. |\n| `ugly-app versions` | List deployed versions. |\n| `ugly-app versions:prune` | Clean up non-prod versions. |\n| `ugly-app infra:destroy` | Tear down all project infra. |\n| `ugly-app textGen [prompt]` | Generate text via AI (`--model`, `--system-prompt`, `--max-tokens`, `--json`). |\n| `ugly-app imageGen [prompt]` | Generate an image (`--model`, `--output <path>`). |\n| `ugly-app error:dev` / `error:prod` | Query error logs (your tunnel / production). |\n| `ugly-app perf:dev` / `perf:prod` | Query performance metrics. |\n| `ugly-app feedback:dev` / `feedback:prod` | Query user feedback. |\n| `ugly-app feedback:submit` / `feedback:resolve` | Manage feedback (run with `--help` for flags). |\n\nInside a scaffolded project, the same commands are available via\n`npm run …` scripts — see `templates/CLAUDE.md`.\n\n---\n\n## Migrations\n\nSchema changes must be deliberate:\n\n1. Update the Zod schema in `shared/collections.ts`.\n2. Run `npm run db:schema-gen` — produces a migration file with compile-blocking `REPLACE_ME` placeholders for any non-trivial change.\n3. Replace every `REPLACE_ME` with the correct migration logic.\n4. Run `npm run db:migrate`.\n\nThe framework refuses to start when drift is detected (set\n`SCHEMA_CHECK_SKIP=true` only as a temporary escape hatch).\n\n---\n\n## Tech stack\n\nNode.js · TypeScript · Express · React 19 · Vite · PostgreSQL (JSONB) ·\nQdrant · NATS · S3-compatible storage · Zod · JWT (jose) · Cloudflare\nWorkers + Durable Objects (Adapter B) · ugly.bot platform\n","readmeFilename":"README.md"}