@pyric/cli 0.1.0-alpha.16 → 0.1.0-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +13 -9
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +80 -72
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/cli/database-rules.d.ts.map +1 -1
  7. package/dist/cli/database-rules.js +6 -4
  8. package/dist/cli/database-rules.js.map +1 -1
  9. package/dist/cli/dev-runner.d.ts +9 -0
  10. package/dist/cli/dev-runner.d.ts.map +1 -1
  11. package/dist/cli/dev-runner.js +18 -0
  12. package/dist/cli/dev-runner.js.map +1 -1
  13. package/dist/cli/serve.d.ts.map +1 -1
  14. package/dist/cli/serve.js +61 -6
  15. package/dist/cli/serve.js.map +1 -1
  16. package/dist/cli/verify.js +2 -2
  17. package/dist/cli/verify.js.map +1 -1
  18. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  19. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  20. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  21. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  22. package/dist/conformance/.generated/can-i-use.js +1 -1
  23. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  24. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  25. package/dist/conformance/.generated/conformance-docs.js +1 -1
  26. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  27. package/dist/next/client-aliases.d.ts +11 -0
  28. package/dist/next/client-aliases.d.ts.map +1 -0
  29. package/dist/next/client-aliases.js +38 -0
  30. package/dist/next/client-aliases.js.map +1 -0
  31. package/dist/next/dev-rewrites.d.ts +9 -0
  32. package/dist/next/dev-rewrites.d.ts.map +1 -0
  33. package/dist/next/dev-rewrites.js +53 -0
  34. package/dist/next/dev-rewrites.js.map +1 -0
  35. package/dist/next/guard.d.ts +15 -0
  36. package/dist/next/guard.d.ts.map +1 -0
  37. package/dist/next/guard.js +52 -0
  38. package/dist/next/guard.js.map +1 -0
  39. package/dist/next/index.d.ts +12 -0
  40. package/dist/next/index.d.ts.map +1 -0
  41. package/dist/next/index.js +11 -0
  42. package/dist/next/index.js.map +1 -0
  43. package/dist/next/runtime-env.d.ts +7 -0
  44. package/dist/next/runtime-env.d.ts.map +1 -0
  45. package/dist/next/runtime-env.js +13 -0
  46. package/dist/next/runtime-env.js.map +1 -0
  47. package/dist/next/server-external-packages.d.ts +10 -0
  48. package/dist/next/server-external-packages.d.ts.map +1 -0
  49. package/dist/next/server-external-packages.js +34 -0
  50. package/dist/next/server-external-packages.js.map +1 -0
  51. package/dist/next/target-url.d.ts +11 -0
  52. package/dist/next/target-url.d.ts.map +1 -0
  53. package/dist/next/target-url.js +36 -0
  54. package/dist/next/target-url.js.map +1 -0
  55. package/dist/next/turbopack-config.d.ts +9 -0
  56. package/dist/next/turbopack-config.d.ts.map +1 -0
  57. package/dist/next/turbopack-config.js +39 -0
  58. package/dist/next/turbopack-config.js.map +1 -0
  59. package/dist/next/types.d.ts +40 -0
  60. package/dist/next/types.d.ts.map +1 -0
  61. package/dist/next/types.js +5 -0
  62. package/dist/next/types.js.map +1 -0
  63. package/dist/next/webpack-config.d.ts +11 -0
  64. package/dist/next/webpack-config.d.ts.map +1 -0
  65. package/dist/next/webpack-config.js +51 -0
  66. package/dist/next/webpack-config.js.map +1 -0
  67. package/dist/next/with-pyric.d.ts +22 -0
  68. package/dist/next/with-pyric.d.ts.map +1 -0
  69. package/dist/next/with-pyric.js +49 -0
  70. package/dist/next/with-pyric.js.map +1 -0
  71. package/dist/register/app-bridge.d.ts +9 -0
  72. package/dist/register/app-bridge.d.ts.map +1 -0
  73. package/dist/register/app-bridge.js +56 -0
  74. package/dist/register/app-bridge.js.map +1 -0
  75. package/dist/register/hooks.d.ts.map +1 -1
  76. package/dist/register/hooks.js +6 -1
  77. package/dist/register/hooks.js.map +1 -1
  78. package/dist/register/index.js +1 -1
  79. package/dist/register/index.js.map +1 -1
  80. package/dist/register/mapping.d.ts +3 -1
  81. package/dist/register/mapping.d.ts.map +1 -1
  82. package/dist/register/mapping.js +41 -5
  83. package/dist/register/mapping.js.map +1 -1
  84. package/dist/rtdb/rules-json.d.ts +12 -0
  85. package/dist/rtdb/rules-json.d.ts.map +1 -1
  86. package/dist/rtdb/rules-json.js +98 -0
  87. package/dist/rtdb/rules-json.js.map +1 -1
  88. package/dist/serve/bundler.d.ts.map +1 -1
  89. package/dist/serve/bundler.js +2 -0
  90. package/dist/serve/bundler.js.map +1 -1
  91. package/dist/serve/discovery.d.ts +4 -4
  92. package/dist/serve/discovery.d.ts.map +1 -1
  93. package/dist/serve/discovery.js +59 -38
  94. package/dist/serve/discovery.js.map +1 -1
  95. package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
  96. package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
  97. package/dist/serve/entries/app-ai-passthrough.js +59 -0
  98. package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
  99. package/dist/serve/entries/auth-helper-core.js +9 -7
  100. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  101. package/dist/serve/entries/auth.d.ts +1 -0
  102. package/dist/serve/entries/auth.d.ts.map +1 -1
  103. package/dist/serve/entries/auth.js +1 -0
  104. package/dist/serve/entries/auth.js.map +1 -1
  105. package/dist/serve/entries/bridge-url.d.ts.map +1 -1
  106. package/dist/serve/entries/bridge-url.js +7 -2
  107. package/dist/serve/entries/bridge-url.js.map +1 -1
  108. package/dist/serve/entries/database.d.ts +1 -0
  109. package/dist/serve/entries/database.d.ts.map +1 -1
  110. package/dist/serve/entries/database.js +1 -0
  111. package/dist/serve/entries/database.js.map +1 -1
  112. package/dist/serve/entries/firestore.d.ts +1 -0
  113. package/dist/serve/entries/firestore.d.ts.map +1 -1
  114. package/dist/serve/entries/firestore.js +1 -0
  115. package/dist/serve/entries/firestore.js.map +1 -1
  116. package/dist/serve/entries/init.d.ts.map +1 -1
  117. package/dist/serve/entries/init.js +4 -2
  118. package/dist/serve/entries/init.js.map +1 -1
  119. package/dist/serve/entries/runtime.js +23 -0
  120. package/dist/serve/entries/runtime.js.map +1 -1
  121. package/dist/serve/entries/storage.d.ts +2 -0
  122. package/dist/serve/entries/storage.d.ts.map +1 -1
  123. package/dist/serve/entries/storage.js +9 -2
  124. package/dist/serve/entries/storage.js.map +1 -1
  125. package/dist/serve/html-injection.d.ts +3 -1
  126. package/dist/serve/html-injection.d.ts.map +1 -1
  127. package/dist/serve/html-injection.js +27 -1
  128. package/dist/serve/html-injection.js.map +1 -1
  129. package/dist/serve/rules.js +2 -2
  130. package/dist/serve/rules.js.map +1 -1
  131. package/dist/serve/runtime/chip-config.d.ts +1 -1
  132. package/dist/serve/runtime/chip-config.d.ts.map +1 -1
  133. package/dist/serve/runtime/chip-config.js +16 -8
  134. package/dist/serve/runtime/chip-config.js.map +1 -1
  135. package/dist/serve/sandbox-session.d.ts +1 -0
  136. package/dist/serve/sandbox-session.d.ts.map +1 -1
  137. package/dist/serve/sandbox-session.js +30 -2
  138. package/dist/serve/sandbox-session.js.map +1 -1
  139. package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
  140. package/dist/serve/site-ui/_astro/app.bnmVTkIY.js +11 -0
  141. package/dist/serve/site-ui/_astro/app.t6u-adB_.js +1 -0
  142. package/dist/serve/site-ui/_astro/{chess-showcase.CnoxIle5.js → chess-showcase.kC8dXLKY.js} +1 -1
  143. package/dist/serve/site-ui/_astro/{example-runtime.R1d96L6-.js → example-runtime.D79PnoSk.js} +1 -1
  144. package/dist/serve/site-ui/_astro/index.DzVde04M.js +1 -0
  145. package/dist/serve/site-ui/_astro/reads.BYBRLbsE.js +1 -0
  146. package/dist/serve/site-ui/_astro/sandbox-controls.C9Aaazt8.js +1252 -0
  147. package/dist/serve/site-ui/_astro/{seed.EyI3VYEu.js → seed.DANAIyRw.js} +1 -1
  148. package/dist/serve/site-ui/auth/index.html +2 -2
  149. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  150. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
  151. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  152. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  153. package/dist/serve/site-ui/docs/ai-compat/index.html +85 -85
  154. package/dist/serve/site-ui/docs/ai-compat.md +84 -84
  155. package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
  156. package/dist/serve/site-ui/docs/api-reference.md +2 -0
  157. package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
  158. package/dist/serve/site-ui/docs/app-compat.md +27 -27
  159. package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
  160. package/dist/serve/site-ui/docs/auth-compat.md +121 -121
  161. package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
  162. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  163. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
  164. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  165. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
  166. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  167. package/dist/serve/site-ui/docs/conformance-scores/index.html +4 -4
  168. package/dist/serve/site-ui/docs/conformance-scores.md +3 -3
  169. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
  170. package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
  171. package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
  172. package/dist/serve/site-ui/docs/database-compat.md +198 -461
  173. package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
  174. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  175. package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
  176. package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
  177. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
  178. package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
  179. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  180. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +57 -0
  181. package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
  182. package/dist/serve/site-ui/docs/get-started/start-building/index.html +25 -8
  183. package/dist/serve/site-ui/docs/get-started/start-building.md +34 -5
  184. package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
  185. package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
  186. package/dist/serve/site-ui/docs/index.json +668 -103
  187. package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
  188. package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
  189. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  190. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  191. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  192. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  193. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +39 -13
  194. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
  195. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  196. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +38 -6
  197. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
  198. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
  199. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
  200. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  201. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
  202. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
  203. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  204. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  205. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  206. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
  207. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  208. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  209. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  210. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  211. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  212. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  213. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  214. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  215. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  216. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +123 -0
  217. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
  218. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
  219. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
  220. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  221. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  222. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
  223. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
  224. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  225. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
  226. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  227. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
  228. package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
  229. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  230. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  231. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +43 -3
  232. package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
  233. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
  234. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
  235. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  236. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +77 -9
  237. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
  238. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
  239. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
  240. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  241. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  242. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  243. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  244. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  245. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  246. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  247. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  248. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  249. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  250. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  251. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  252. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +2 -1
  253. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
  254. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  255. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  256. package/dist/serve/site-ui/docs/rules-compat/index.html +87 -79
  257. package/dist/serve/site-ui/docs/rules-compat.md +86 -78
  258. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  259. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  260. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  261. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  262. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  263. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  264. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  265. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  266. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  267. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  268. package/dist/serve/site-ui/docs/storage-compat/index.html +119 -125
  269. package/dist/serve/site-ui/docs/storage-compat.md +118 -124
  270. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  271. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  272. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
  273. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  274. package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
  275. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  276. package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
  277. package/dist/serve/site-ui/firestore/index.html +2 -2
  278. package/dist/serve/site-ui/index.html +2 -2
  279. package/dist/serve/site-ui/llms.txt +6 -2
  280. package/dist/serve/site-ui/rtdb/index.html +2 -2
  281. package/dist/serve/site-ui/settings/index.html +2 -2
  282. package/dist/serve/site-ui/storage/index.html +2 -2
  283. package/dist/serve/site-ui/traffic/index.html +2 -2
  284. package/dist/serve/vite-ai-config.d.ts +4 -1
  285. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  286. package/dist/serve/vite-ai-config.js +83 -19
  287. package/dist/serve/vite-ai-config.js.map +1 -1
  288. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
  289. package/dist/serve/vite-generation-rules-watch.js +61 -14
  290. package/dist/serve/vite-generation-rules-watch.js.map +1 -1
  291. package/dist/serve/vite-module-swap.d.ts +4 -1
  292. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  293. package/dist/serve/vite-module-swap.js +106 -21
  294. package/dist/serve/vite-module-swap.js.map +1 -1
  295. package/dist/serve/vite-plugin.d.ts.map +1 -1
  296. package/dist/serve/vite-plugin.js +45 -5
  297. package/dist/serve/vite-plugin.js.map +1 -1
  298. package/dist/serve/vite-sandbox-generation.js +1 -1
  299. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  300. package/dist/serve/worker/client/resumable.d.ts +30 -0
  301. package/dist/serve/worker/client/resumable.d.ts.map +1 -0
  302. package/dist/serve/worker/client/resumable.js +416 -0
  303. package/dist/serve/worker/client/resumable.js.map +1 -0
  304. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
  305. package/dist/serve/worker/client/rtdb-references.js +4 -1
  306. package/dist/serve/worker/client/rtdb-references.js.map +1 -1
  307. package/dist/serve/worker/client/storage.d.ts +16 -2
  308. package/dist/serve/worker/client/storage.d.ts.map +1 -1
  309. package/dist/serve/worker/client/storage.js +57 -6
  310. package/dist/serve/worker/client/storage.js.map +1 -1
  311. package/dist/serve/worker/host/rules.d.ts.map +1 -1
  312. package/dist/serve/worker/host/rules.js +2 -1
  313. package/dist/serve/worker/host/rules.js.map +1 -1
  314. package/dist/serve/worker/index.d.ts +1 -1
  315. package/dist/serve/worker/index.d.ts.map +1 -1
  316. package/dist/serve/worker/index.js +1 -1
  317. package/dist/serve/worker/index.js.map +1 -1
  318. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  319. package/dist/serve/worker/serve-init.js +31 -0
  320. package/dist/serve/worker/serve-init.js.map +1 -1
  321. package/package.json +15 -4
  322. package/src/assurance/.generated/conformance-verdicts.ts +80 -72
  323. package/src/cli/cli.test.ts +14 -0
  324. package/src/cli/database-rules.ts +6 -4
  325. package/src/cli/dev-runner.ts +21 -0
  326. package/src/cli/serve.ts +62 -5
  327. package/src/cli/verify.ts +2 -2
  328. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  329. package/src/conformance/.generated/can-i-use.ts +1 -1
  330. package/src/conformance/.generated/conformance-docs.ts +1 -1
  331. package/src/next/client-aliases.ts +39 -0
  332. package/src/next/dev-rewrites.ts +77 -0
  333. package/src/next/guard.ts +61 -0
  334. package/src/next/index.ts +16 -0
  335. package/src/next/runtime-env.ts +18 -0
  336. package/src/next/server-external-packages.ts +43 -0
  337. package/src/next/target-url.ts +46 -0
  338. package/src/next/turbopack-config.ts +54 -0
  339. package/src/next/types.ts +47 -0
  340. package/src/next/webpack-config.ts +71 -0
  341. package/src/next/with-pyric.ts +58 -0
  342. package/src/register/app-bridge.ts +79 -0
  343. package/src/register/hooks.ts +6 -1
  344. package/src/register/index.ts +1 -1
  345. package/src/register/mapping.ts +50 -4
  346. package/src/rtdb/rules-json.ts +110 -0
  347. package/src/serve/bundler.ts +2 -0
  348. package/src/serve/discovery.ts +65 -44
  349. package/src/serve/entries/app-ai-passthrough.ts +83 -0
  350. package/src/serve/entries/auth-helper-core.ts +9 -7
  351. package/src/serve/entries/auth.ts +1 -0
  352. package/src/serve/entries/bridge-url.ts +9 -2
  353. package/src/serve/entries/database.ts +1 -0
  354. package/src/serve/entries/firestore.ts +1 -0
  355. package/src/serve/entries/init.ts +5 -2
  356. package/src/serve/entries/runtime.ts +25 -0
  357. package/src/serve/entries/storage.ts +12 -1
  358. package/src/serve/html-injection.ts +26 -1
  359. package/src/serve/rules.ts +2 -2
  360. package/src/serve/runtime/chip-config.ts +19 -6
  361. package/src/serve/sandbox-session.ts +31 -2
  362. package/src/serve/vite-ai-config.ts +86 -19
  363. package/src/serve/vite-generation-rules-watch.ts +67 -15
  364. package/src/serve/vite-module-swap.ts +121 -21
  365. package/src/serve/vite-plugin.ts +44 -6
  366. package/src/serve/vite-sandbox-generation.ts +1 -1
  367. package/src/serve/worker/client/resumable.ts +506 -0
  368. package/src/serve/worker/client/rtdb-references.ts +4 -1
  369. package/src/serve/worker/client/storage.ts +77 -7
  370. package/src/serve/worker/host/rules.ts +2 -1
  371. package/src/serve/worker/index.ts +4 -0
  372. package/src/serve/worker/serve-init.ts +30 -0
  373. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
  374. package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +0 -109
  375. package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +0 -1
  376. package/dist/serve/site-ui/_astro/index.BJiOemMX.js +0 -1
  377. package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +0 -1
  378. package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +0 -1153
@@ -289,7 +289,13 @@ export const CONFORMANCE_VERDICTS = {
289
289
  "firestore#149": "qualified",
290
290
  "firestore#15": "supported",
291
291
  "firestore#150": "supported",
292
+ "firestore#151": "supported",
292
293
  "firestore#152": "supported",
294
+ "firestore#153": "supported",
295
+ "firestore#154": "supported",
296
+ "firestore#155": "supported",
297
+ "firestore#156": "supported",
298
+ "firestore#157": "supported",
293
299
  "firestore#16": "supported",
294
300
  "firestore#17": "supported",
295
301
  "firestore#18": "supported",
@@ -421,6 +427,8 @@ export const CONFORMANCE_VERDICTS = {
421
427
  "firestore-rules#187": "supported",
422
428
  "firestore-rules#188": "supported",
423
429
  "firestore-rules#189": "supported",
430
+ "firestore-rules#190": "supported",
431
+ "firestore-rules#191": "supported",
424
432
  "firestore.binding.path-variable": "supported",
425
433
  "firestore.binding.request": "supported",
426
434
  "firestore.binding.request.auth": "supported",
@@ -437,7 +445,7 @@ export const CONFORMANCE_VERDICTS = {
437
445
  "firestore.binding.resource.__name__": "supported",
438
446
  "firestore.binding.resource.data": "supported",
439
447
  "firestore.binding.resource.id": "supported",
440
- "firestore.function.cast.bool": "unsupported",
448
+ "firestore.function.cast.bool": "supported",
441
449
  "firestore.function.cast.float": "supported",
442
450
  "firestore.function.cast.int": "supported",
443
451
  "firestore.function.cast.path": "supported",
@@ -458,7 +466,7 @@ export const CONFORMANCE_VERDICTS = {
458
466
  "firestore.function.math.abs": "supported",
459
467
  "firestore.function.math.ceil": "supported",
460
468
  "firestore.function.math.floor": "supported",
461
- "firestore.function.math.isInfinite": "unsupported",
469
+ "firestore.function.math.isInfinite": "supported",
462
470
  "firestore.function.math.isNaN": "supported",
463
471
  "firestore.function.math.pow": "supported",
464
472
  "firestore.function.math.round": "supported",
@@ -483,9 +491,9 @@ export const CONFORMANCE_VERDICTS = {
483
491
  "firestore.method.list.toSet": "supported",
484
492
  "firestore.method.map.diff": "supported",
485
493
  "firestore.method.map.get": "supported",
486
- "firestore.method.map.hasAll": "unsupported",
487
- "firestore.method.map.hasAny": "unsupported",
488
- "firestore.method.map.hasOnly": "unsupported",
494
+ "firestore.method.map.hasAll": "supported",
495
+ "firestore.method.map.hasAny": "supported",
496
+ "firestore.method.map.hasOnly": "supported",
489
497
  "firestore.method.map.keys": "supported",
490
498
  "firestore.method.map.size": "supported",
491
499
  "firestore.method.map.values": "supported",
@@ -875,62 +883,62 @@ export const CONFORMANCE_VERDICTS = {
875
883
  "rtdb-rules#7": "supported",
876
884
  "rtdb-rules#8": "supported",
877
885
  "rtdb-rules#9": "supported",
878
- "rtdb.binding.auth": "qualified",
879
- "rtdb.binding.auth.token": "qualified",
880
- "rtdb.binding.auth.uid": "qualified",
881
- "rtdb.binding.data": "qualified",
882
- "rtdb.binding.newData": "qualified",
883
- "rtdb.binding.now": "qualified",
884
- "rtdb.binding.path-variable": "qualified",
885
- "rtdb.binding.root": "qualified",
886
- "rtdb.method.snapshot.child": "qualified",
887
- "rtdb.method.snapshot.exists": "qualified",
888
- "rtdb.method.snapshot.getPriority": "qualified",
889
- "rtdb.method.snapshot.hasChild": "qualified",
890
- "rtdb.method.snapshot.hasChildren": "qualified",
891
- "rtdb.method.snapshot.isBoolean": "qualified",
892
- "rtdb.method.snapshot.isNumber": "qualified",
893
- "rtdb.method.snapshot.isString": "qualified",
894
- "rtdb.method.snapshot.parent": "qualified",
895
- "rtdb.method.snapshot.val": "qualified",
896
- "rtdb.method.string.beginsWith": "qualified",
897
- "rtdb.method.string.contains": "qualified",
898
- "rtdb.method.string.endsWith": "qualified",
899
- "rtdb.method.string.length": "qualified",
900
- "rtdb.method.string.matches": "qualified",
901
- "rtdb.method.string.replace": "qualified",
902
- "rtdb.method.string.toLowerCase": "qualified",
903
- "rtdb.method.string.toUpperCase": "qualified",
904
- "rtdb.operator.add": "qualified",
905
- "rtdb.operator.and": "qualified",
906
- "rtdb.operator.div": "qualified",
907
- "rtdb.operator.gt": "qualified",
908
- "rtdb.operator.gte": "qualified",
909
- "rtdb.operator.index": "qualified",
910
- "rtdb.operator.looseEq": "qualified",
911
- "rtdb.operator.looseNeq": "qualified",
912
- "rtdb.operator.lt": "qualified",
913
- "rtdb.operator.lte": "qualified",
914
- "rtdb.operator.member": "qualified",
915
- "rtdb.operator.mod": "qualified",
916
- "rtdb.operator.mul": "qualified",
917
- "rtdb.operator.neg": "qualified",
918
- "rtdb.operator.not": "qualified",
919
- "rtdb.operator.or": "qualified",
920
- "rtdb.operator.strictEq": "qualified",
921
- "rtdb.operator.strictNeq": "qualified",
922
- "rtdb.operator.sub": "qualified",
923
- "rtdb.operator.ternary": "qualified",
924
- "rtdb.rule-kind.indexOn": "qualified",
925
- "rtdb.rule-kind.location-wildcard": "qualified",
926
- "rtdb.rule-kind.read": "qualified",
927
- "rtdb.rule-kind.validate": "qualified",
928
- "rtdb.rule-kind.write": "qualified",
886
+ "rtdb.binding.auth": "supported",
887
+ "rtdb.binding.auth.token": "supported",
888
+ "rtdb.binding.auth.uid": "supported",
889
+ "rtdb.binding.data": "supported",
890
+ "rtdb.binding.newData": "supported",
891
+ "rtdb.binding.now": "supported",
892
+ "rtdb.binding.path-variable": "supported",
893
+ "rtdb.binding.root": "supported",
894
+ "rtdb.method.snapshot.child": "supported",
895
+ "rtdb.method.snapshot.exists": "supported",
896
+ "rtdb.method.snapshot.getPriority": "supported",
897
+ "rtdb.method.snapshot.hasChild": "supported",
898
+ "rtdb.method.snapshot.hasChildren": "supported",
899
+ "rtdb.method.snapshot.isBoolean": "supported",
900
+ "rtdb.method.snapshot.isNumber": "supported",
901
+ "rtdb.method.snapshot.isString": "supported",
902
+ "rtdb.method.snapshot.parent": "supported",
903
+ "rtdb.method.snapshot.val": "supported",
904
+ "rtdb.method.string.beginsWith": "supported",
905
+ "rtdb.method.string.contains": "supported",
906
+ "rtdb.method.string.endsWith": "supported",
907
+ "rtdb.method.string.length": "supported",
908
+ "rtdb.method.string.matches": "supported",
909
+ "rtdb.method.string.replace": "supported",
910
+ "rtdb.method.string.toLowerCase": "supported",
911
+ "rtdb.method.string.toUpperCase": "supported",
912
+ "rtdb.operator.add": "supported",
913
+ "rtdb.operator.and": "supported",
914
+ "rtdb.operator.div": "supported",
915
+ "rtdb.operator.gt": "supported",
916
+ "rtdb.operator.gte": "supported",
917
+ "rtdb.operator.index": "supported",
918
+ "rtdb.operator.looseEq": "supported",
919
+ "rtdb.operator.looseNeq": "supported",
920
+ "rtdb.operator.lt": "supported",
921
+ "rtdb.operator.lte": "supported",
922
+ "rtdb.operator.member": "supported",
923
+ "rtdb.operator.mod": "supported",
924
+ "rtdb.operator.mul": "supported",
925
+ "rtdb.operator.neg": "supported",
926
+ "rtdb.operator.not": "supported",
927
+ "rtdb.operator.or": "supported",
928
+ "rtdb.operator.strictEq": "supported",
929
+ "rtdb.operator.strictNeq": "supported",
930
+ "rtdb.operator.sub": "supported",
931
+ "rtdb.operator.ternary": "supported",
932
+ "rtdb.rule-kind.indexOn": "supported",
933
+ "rtdb.rule-kind.location-wildcard": "supported",
934
+ "rtdb.rule-kind.read": "supported",
935
+ "rtdb.rule-kind.validate": "supported",
936
+ "rtdb.rule-kind.write": "supported",
929
937
  "rtdb.semantic.deny-by-default": "qualified",
930
- "rtdb.semantic.read-cascade": "qualified",
931
- "rtdb.semantic.regex-literal": "qualified",
932
- "rtdb.semantic.validate-non-cascade": "qualified",
933
- "rtdb.semantic.write-cascade": "qualified",
938
+ "rtdb.semantic.read-cascade": "supported",
939
+ "rtdb.semantic.regex-literal": "supported",
940
+ "rtdb.semantic.validate-non-cascade": "supported",
941
+ "rtdb.semantic.write-cascade": "supported",
934
942
  "storage#1": "supported",
935
943
  "storage#10": "supported",
936
944
  "storage#105": "supported",
@@ -977,12 +985,12 @@ export const CONFORMANCE_VERDICTS = {
977
985
  "storage#44": "supported",
978
986
  "storage#45": "supported",
979
987
  "storage#46": "supported",
980
- "storage#47": "unsupported",
981
- "storage#48": "unsupported",
982
- "storage#49": "unsupported",
988
+ "storage#47": "qualified",
989
+ "storage#48": "qualified",
990
+ "storage#49": "qualified",
983
991
  "storage#4a": "supported",
984
992
  "storage#5": "supported",
985
- "storage#50": "unsupported",
993
+ "storage#50": "qualified",
986
994
  "storage#51": "qualified",
987
995
  "storage#52": "supported",
988
996
  "storage#53": "supported",
@@ -1093,30 +1101,30 @@ export const CONFORMANCE_VERDICTS = {
1093
1101
  "storage.method.map.get": "supported",
1094
1102
  "storage.method.map.keys": "supported",
1095
1103
  "storage.method.set.hasAll": "supported",
1096
- "storage.method.size": "qualified",
1104
+ "storage.method.size": "supported",
1097
1105
  "storage.method.string.matches": "supported",
1098
- "storage.method.string.split": "qualified",
1106
+ "storage.method.string.split": "supported",
1099
1107
  "storage.operator.add": "supported",
1100
1108
  "storage.operator.and": "supported",
1101
1109
  "storage.operator.div": "supported",
1102
1110
  "storage.operator.eq": "supported",
1103
1111
  "storage.operator.gt": "supported",
1104
1112
  "storage.operator.gte": "supported",
1105
- "storage.operator.in": "qualified",
1113
+ "storage.operator.in": "supported",
1106
1114
  "storage.operator.index": "supported",
1107
- "storage.operator.is": "qualified",
1115
+ "storage.operator.is": "supported",
1108
1116
  "storage.operator.lt": "supported",
1109
1117
  "storage.operator.lte": "supported",
1110
1118
  "storage.operator.member": "supported",
1111
- "storage.operator.mod": "qualified",
1119
+ "storage.operator.mod": "supported",
1112
1120
  "storage.operator.mul": "supported",
1113
1121
  "storage.operator.neq": "supported",
1114
1122
  "storage.operator.not": "supported",
1115
1123
  "storage.operator.or": "supported",
1116
- "storage.operator.slice": "qualified",
1124
+ "storage.operator.slice": "supported",
1117
1125
  "storage.operator.sub": "supported",
1118
- "storage.operator.ternary": "qualified",
1119
- "storage.operator.unary-minus": "qualified",
1126
+ "storage.operator.ternary": "supported",
1127
+ "storage.operator.unary-minus": "supported",
1120
1128
  "storage.rule-kind.allow-create": "supported",
1121
1129
  "storage.rule-kind.allow-delete": "supported",
1122
1130
  "storage.rule-kind.allow-get": "supported",
@@ -490,4 +490,18 @@ describe('scanForInlinedFirebase', () => {
490
490
  );
491
491
  expect(scanForInlinedFirebase(dir)).toEqual([]);
492
492
  });
493
+
494
+ it('ignores hidden frameworks and build cache directories like .next and .git', async () => {
495
+ const { scanForInlinedFirebase } = await import('./serve.js');
496
+ const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
497
+ const { tmpdir } = await import('node:os');
498
+ const { join } = await import('node:path');
499
+ const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-ignore-'));
500
+ mkdirSync(join(dir, '.next'));
501
+ writeFileSync(
502
+ join(dir, '.next', 'bundle.js'),
503
+ 'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
504
+ );
505
+ expect(scanForInlinedFirebase(dir)).toEqual([]);
506
+ });
493
507
  });
@@ -19,6 +19,7 @@ import {
19
19
  loadRtdbRulesDocument,
20
20
  type LoadRtdbRulesDocumentResult,
21
21
  } from '../rtdb/load-rules-document.js';
22
+ import { stripJsonComments } from '../rtdb/rules-json.js';
22
23
 
23
24
  export interface DatabaseRulesDeps {
24
25
  readFile?: typeof readFile;
@@ -53,7 +54,7 @@ function defaultReadStdin(): Promise<string> {
53
54
  }
54
55
 
55
56
  function parseRulesJson(raw: string): CompiledRtdbRules {
56
- return compileRtdbRules(JSON.parse(raw));
57
+ return compileRtdbRules(JSON.parse(stripJsonComments(raw)));
57
58
  }
58
59
 
59
60
  function collectFindings(node: RtdbNode, kind: 'errors' | 'warnings'): RuleFinding[] {
@@ -215,7 +216,8 @@ export async function runDatabaseRulesSimulate(
215
216
  rulesJson = payload.rulesJson ?? payload.rules;
216
217
  } else if (payload.rulesPath) {
217
218
  try {
218
- rulesJson = JSON.parse(await readFileFn(resolvePath(deps.cwd ?? process.cwd(), payload.rulesPath), 'utf-8'));
219
+ const rawContent = await readFileFn(resolvePath(deps.cwd ?? process.cwd(), payload.rulesPath), 'utf-8');
220
+ rulesJson = JSON.parse(stripJsonComments(rawContent));
219
221
  } catch (e) {
220
222
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
221
223
  return 1;
@@ -227,7 +229,7 @@ export async function runDatabaseRulesSimulate(
227
229
  return 1;
228
230
  }
229
231
  try {
230
- rulesJson = JSON.parse(file.raw);
232
+ rulesJson = JSON.parse(stripJsonComments(file.raw));
231
233
  } catch (e) {
232
234
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
233
235
  return 2;
@@ -247,7 +249,7 @@ export async function runDatabaseRulesSimulate(
247
249
  return 1;
248
250
  }
249
251
  try {
250
- rulesJson = JSON.parse(file.raw);
252
+ rulesJson = JSON.parse(stripJsonComments(file.raw));
251
253
  } catch (e) {
252
254
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
253
255
  return 2;
@@ -163,6 +163,27 @@ export function buildChildEnv(
163
163
  };
164
164
  }
165
165
 
166
+ /**
167
+ * Format copy-pasteable POSIX export statements for host-only startup.
168
+ * Grouped in a cleanly formatted console block for easy selection and copying
169
+ * into a separate terminal (for example, when running Next.js independently).
170
+ */
171
+ export function formatStartupEnvExport(opts: { serveUrl: string; registerUrl: string }): string {
172
+ const pyricSandbox = `remote:${opts.serveUrl}`;
173
+ const nodeOptions = `--import ${opts.registerUrl}`;
174
+ const line1 = `export PYRIC_SANDBOX="${pyricSandbox}"`;
175
+ const line2 = `export NODE_OPTIONS="${nodeOptions}"`;
176
+ const divider = '─'.repeat(Math.max(line1.length, line2.length) + 4);
177
+ return (
178
+ '\n' +
179
+ ' To run external commands against this sandbox, paste in another terminal:\n' +
180
+ ` ${divider}\n` +
181
+ ` ${line1}\n` +
182
+ ` ${line2}\n` +
183
+ ` ${divider}\n`
184
+ );
185
+ }
186
+
166
187
  // ─── Line prefixing (pure core) ────────────────────────────────────────────
167
188
 
168
189
  /**
package/src/cli/serve.ts CHANGED
@@ -31,6 +31,7 @@ import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
31
31
  import {
32
32
  buildChildEnv,
33
33
  detectPackageManager,
34
+ formatStartupEnvExport,
34
35
  readDevScript,
35
36
  registerModuleUrl,
36
37
  resolveDevChild,
@@ -404,6 +405,47 @@ export async function startServe(opts: {
404
405
  watcher.close();
405
406
  });
406
407
  }
408
+ const dbRulesSourcePath = session.summary.rules.database.sourcePath;
409
+ const isWatchEnabled = opts.watch !== false;
410
+ const hasDbRulesPath = dbRulesSourcePath !== null;
411
+ const watchingDb = isWatchEnabled && hasDbRulesPath;
412
+ if (watchingDb) {
413
+ let debounceDb: ReturnType<typeof setTimeout> | null = null;
414
+ const dbWatcher = watchFile(dbRulesSourcePath as string, () => {
415
+ const hasDebounceDb = debounceDb !== null;
416
+ if (hasDebounceDb) {
417
+ clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
418
+ }
419
+ debounceDb = setTimeout(() => {
420
+ void session.reloadDatabaseRules().then((result) => {
421
+ const isReloaded = result.kind === 'reloaded';
422
+ if (isReloaded) {
423
+ logger.note(` ↻ rtdb rules reloaded (hash ${result.rulesHash}) → ${result.clients} page(s)`);
424
+ } else {
425
+ const isRejected = result.kind === 'rejected';
426
+ if (isRejected) {
427
+ logger.note(` ⚠ rtdb rules NOT reloaded (last-good stays live): ${result.error.message}`);
428
+ }
429
+ }
430
+ });
431
+ }, 150);
432
+ });
433
+ dbWatcher.on('error', (error) => {
434
+ const isErrorInstance = error instanceof Error;
435
+ let errorMsg = String(error);
436
+ if (isErrorInstance) {
437
+ errorMsg = (error as Error).message;
438
+ }
439
+ logger.note(` ⚠ rtdb rules watcher failed (hot reload off): ${errorMsg}`);
440
+ });
441
+ handle.server.once('close', () => {
442
+ const hasDebounceDb = debounceDb !== null;
443
+ if (hasDebounceDb) {
444
+ clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
445
+ }
446
+ dbWatcher.close();
447
+ });
448
+ }
407
449
 
408
450
  logger.info(`=== Serving from '${opts.cwd}'...`);
409
451
  logger.info('');
@@ -476,7 +518,12 @@ export async function startServe(opts: {
476
518
  if (session.summary.capturePath) {
477
519
  logger.info(`✔ capture session → ${session.summary.capturePath} (run \`pyric verify\` to replay it)`);
478
520
  }
479
- if (watching) logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
521
+ if (watching) {
522
+ logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
523
+ }
524
+ if (watchingDb) {
525
+ logger.info(`✔ watch hot-reloading ${dbRulesSourcePath} over /__pyric/events`);
526
+ }
480
527
  // Browser-honesty: the sandbox is browser-resident — firestore/auth and
481
528
  // persistence run IN the served page. With no page open, data ops silently
482
529
  // no-op. This warning (paired with auto-open in runServe) is the fix for the
@@ -570,7 +617,8 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
570
617
 
571
618
  const json = Boolean(parsed.flags.get('json'));
572
619
 
573
- const uiOn = Boolean(parsed.flags.get('ui'));
620
+ const explicitUi = Boolean(parsed.flags.get('ui'));
621
+ const uiOn = !parsed.flags.get('no-ui');
574
622
 
575
623
  // Resolve the child plan BEFORE the server starts: a planned child implies
576
624
  // the bridge (see bridgeEnabledFor) — the child's injected PYRIC_SANDBOX
@@ -661,8 +709,9 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
661
709
  env: process.env,
662
710
  });
663
711
  if (opened) {
664
- // With --ui, open Studio directly; the served page is still available.
665
- void openBrowser(runtime.uiUrl ?? runtime.handle.url);
712
+ // When explicit --ui is passed, open Studio directly; otherwise open the served page.
713
+ const targetUrl = explicitUi && runtime.uiUrl !== null ? runtime.uiUrl : runtime.handle.url;
714
+ void openBrowser(targetUrl);
666
715
  }
667
716
 
668
717
  let devChild: DevChildHandle | null = null;
@@ -800,6 +849,13 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
800
849
  registerUrl: registerModuleUrl(),
801
850
  }),
802
851
  });
852
+ } else if (!json) {
853
+ process.stdout.write(
854
+ formatStartupEnvExport({
855
+ serveUrl: runtime.handle.url,
856
+ registerUrl: registerModuleUrl(),
857
+ }),
858
+ );
803
859
  }
804
860
 
805
861
  return await new Promise<number>((resolveExit) => {
@@ -886,7 +942,8 @@ export function scanForInlinedFirebase(dir: string): string[] {
886
942
  if (st.isDirectory()) {
887
943
  // The pyric namespace itself never lands in hosting.public, but a
888
944
  // node_modules inside a served dir would be a scan-cost trap.
889
- if (name === 'node_modules') continue;
945
+ // Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
946
+ if (name === 'node_modules' || name.startsWith('.')) continue;
890
947
  walk(p, r, depth + 1);
891
948
  } else if (/\.(js|mjs)$/.test(name)) {
892
949
  scanned++;
package/src/cli/verify.ts CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  import { readFirebaseJson, type FirebaseJson } from './firebase-json.js';
19
19
  import type { FlagValue, ParsedArgs } from './parse-args.js';
20
20
  import { resolveScope } from './scope.js';
21
- import { parseRtdbRulesJson } from '../rtdb/rules-json.js';
21
+ import { parseRtdbRulesJson, stripJsonComments } from '../rtdb/rules-json.js';
22
22
 
23
23
  export type Fixture = PyricVerifyFixture;
24
24
 
@@ -358,7 +358,7 @@ async function readFirebaseJsonOrNull(cwd: string): Promise<FirebaseJson | null>
358
358
  function parseRtdbRulesFile(path: string): { rules: Record<string, unknown> } {
359
359
  let parsed: unknown;
360
360
  try {
361
- parsed = JSON.parse(readFileSync(path, 'utf8'));
361
+ parsed = JSON.parse(stripJsonComments(readFileSync(path, 'utf8')));
362
362
  } catch (e) {
363
363
  throw new Error(`failed to parse RTDB rules JSON at ${path}: ${messageOf(e)}`);
364
364
  }