@xano/sdk 1.0.4 → 1.0.6

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 (280) hide show
  1. package/CHANGELOG.md +32 -5
  2. package/README.md +250 -342
  3. package/dist/.build-fingerprint +1 -1
  4. package/dist/agent-file-refresh-67QIX45H.js +39 -0
  5. package/dist/{answer-shape-LVV2SVBK.js → answer-shape-UCDUKPAN.js} +6 -6
  6. package/dist/{backend-dir-WZADOK3L.js → backend-dir-3LIL6SCT.js} +16 -15
  7. package/dist/{backend-slot-NSCTWCUX.js → backend-slot-JREP27UD.js} +4 -4
  8. package/dist/bin.js +59 -58
  9. package/dist/{branch-ONWPJ4V6.js → branch-2IPHOAYS.js} +10 -10
  10. package/dist/{branch-commands-ZT2MJIRS.js → branch-commands-KTKAXBAN.js} +31 -32
  11. package/dist/bundle.js +9 -39
  12. package/dist/{capture-3JNUA6C2.js → capture-GW5KNKMB.js} +4 -4
  13. package/dist/{chunk-FPBGAT5D.js → chunk-26MOFAJT.js} +3 -3
  14. package/dist/{chunk-O7QOWS6M.js → chunk-2FLIJGBZ.js} +12 -12
  15. package/dist/{chunk-QAEQGT5I.js → chunk-2WBH5HUY.js} +7 -7
  16. package/dist/{chunk-37AHZ7JX.js → chunk-3BBIDW3Y.js} +6 -6
  17. package/dist/{chunk-DGWHAVRG.js → chunk-3EDSPMXN.js} +12 -1
  18. package/dist/{chunk-2AUV6NXK.js → chunk-3II44CUJ.js} +36 -36
  19. package/dist/{chunk-7GX445AE.js → chunk-4XHAT7C5.js} +2 -2
  20. package/dist/{chunk-OOXWYAA4.js → chunk-57A5ZKPO.js} +1 -1
  21. package/dist/{chunk-OOGXZL7Z.js → chunk-5KJBWIDZ.js} +84 -6
  22. package/dist/{chunk-5YL5OC2G.js → chunk-5QMJOE2K.js} +6 -6
  23. package/dist/{chunk-3H3EPMFY.js → chunk-5TVFLG3C.js} +2 -2
  24. package/dist/{chunk-WFMVKY7I.js → chunk-5YQV35C2.js} +9 -9
  25. package/dist/{chunk-NA3PXMEF.js → chunk-64WWE3EF.js} +1 -1
  26. package/dist/{chunk-FMOEVAGT.js → chunk-6X3MY2JP.js} +3 -3
  27. package/dist/{chunk-2LVTBPW2.js → chunk-6X6BJN6Y.js} +3 -3
  28. package/dist/{chunk-DYG5D3FD.js → chunk-763M6LX3.js} +16 -2
  29. package/dist/{chunk-EESV6NU2.js → chunk-7FIMUFBP.js} +2 -2
  30. package/dist/{chunk-CFSFBKHP.js → chunk-7GAIJW62.js} +2 -2
  31. package/dist/{chunk-6R7S775T.js → chunk-7REDHC4N.js} +2 -2
  32. package/dist/chunk-7VR4IO5B.js +44 -0
  33. package/dist/chunk-A7MRZ4GF.js +78 -0
  34. package/dist/{chunk-D5ZEAF4G.js → chunk-ATJ2W7DC.js} +81 -58
  35. package/dist/{chunk-BUJRS7XB.js → chunk-AVS4WPPY.js} +2 -2
  36. package/dist/{chunk-MEE5RZ6G.js → chunk-BL3AZ3AP.js} +2 -2
  37. package/dist/chunk-BTVUYHWV.js +111 -0
  38. package/dist/{chunk-T4DUFQ2S.js → chunk-CCU5CCRX.js} +5 -5
  39. package/dist/{chunk-5T2CTWTB.js → chunk-CHINR7WD.js} +6 -6
  40. package/dist/{chunk-VD32O6KZ.js → chunk-CJDPSCMX.js} +45 -5
  41. package/dist/{chunk-3HOGFGKG.js → chunk-D3KEPRRN.js} +2 -2
  42. package/dist/{chunk-SBR2WZXG.js → chunk-D7BUMOKU.js} +60 -53
  43. package/dist/{chunk-WRBKLYSJ.js → chunk-DNBP4GJN.js} +4 -3
  44. package/dist/{chunk-JTUKLCXS.js → chunk-DXUICABI.js} +1 -1
  45. package/dist/{chunk-XMDDBEEM.js → chunk-E763QI3G.js} +2 -2
  46. package/dist/{chunk-KTGRGWZW.js → chunk-EADVVTDK.js} +7 -7
  47. package/dist/{chunk-FJWZ5OVV.js → chunk-ENMBEXOP.js} +3 -3
  48. package/dist/{chunk-OPHB5ORL.js → chunk-EQFYOOO6.js} +171 -92
  49. package/dist/{chunk-WOGJB2F6.js → chunk-FNLTFOUD.js} +4 -9
  50. package/dist/{chunk-II747OWE.js → chunk-FQ53GTII.js} +10 -10
  51. package/dist/{chunk-JP7M7OU7.js → chunk-FU3VCE5A.js} +46 -27
  52. package/dist/{chunk-OGBMUST4.js → chunk-GHQ4BVI4.js} +14 -14
  53. package/dist/{chunk-45YPFB7B.js → chunk-GLY552SI.js} +84 -57
  54. package/dist/{chunk-QV3GXQRE.js → chunk-GOLFAEUV.js} +2 -2
  55. package/dist/{chunk-L2GLOJAO.js → chunk-GW5RHGOB.js} +22 -22
  56. package/dist/{chunk-A6QTTJUI.js → chunk-GWTFI3GA.js} +2 -2
  57. package/dist/{chunk-MCTIKRMN.js → chunk-GZHLCUZ6.js} +8 -8
  58. package/dist/{chunk-664LSWE5.js → chunk-HCG7NDIL.js} +4 -4
  59. package/dist/{chunk-7PMVIHB3.js → chunk-I3H3HCPY.js} +50 -29
  60. package/dist/{chunk-LIVN53UV.js → chunk-I3VHW6XM.js} +31 -31
  61. package/dist/{chunk-C4FHQA7R.js → chunk-IF4PEGVD.js} +8 -8
  62. package/dist/{chunk-WFG67AYS.js → chunk-IMELQ2I6.js} +3 -3
  63. package/dist/{chunk-3P3HXN76.js → chunk-ITC2R2OT.js} +11 -11
  64. package/dist/{chunk-W5ONYLOP.js → chunk-IXFJORNH.js} +4 -4
  65. package/dist/{chunk-HMLGM2MW.js → chunk-IYXL5NYU.js} +260 -32
  66. package/dist/{chunk-2B22WWKL.js → chunk-JFBRXRJD.js} +59 -35
  67. package/dist/chunk-JI3BLXWQ.js +107 -0
  68. package/dist/{chunk-4DJTQ6W4.js → chunk-JIKGT7DO.js} +2 -1
  69. package/dist/{chunk-O5V3YH5P.js → chunk-JRVQ7M7W.js} +8 -8
  70. package/dist/{chunk-4APOHK7Y.js → chunk-JXVJGF3Y.js} +2 -2
  71. package/dist/chunk-KPFS3RGM.js +257 -0
  72. package/dist/{chunk-PML67X22.js → chunk-LAOMN6QQ.js} +3 -3
  73. package/dist/{chunk-TTVAHCWP.js → chunk-LBJA7IEM.js} +370 -45
  74. package/dist/{chunk-KUTFFHUM.js → chunk-LD6ARK3A.js} +2 -2
  75. package/dist/{chunk-HUSH7LRI.js → chunk-LL7SGTRC.js} +36 -33
  76. package/dist/{chunk-I2BGYNHD.js → chunk-M5CSVB23.js} +7 -7
  77. package/dist/{chunk-UCQ2VUTG.js → chunk-M6ZFSTIZ.js} +2 -2
  78. package/dist/{chunk-MNVDVR3M.js → chunk-MBDFH7XB.js} +4 -4
  79. package/dist/{chunk-QXTKSOFI.js → chunk-MF4W6FHU.js} +1 -1
  80. package/dist/{chunk-RX3EMQGN.js → chunk-MFWF2NZJ.js} +12 -5
  81. package/dist/{chunk-SEUCZZCP.js → chunk-N5I37JFB.js} +3 -3
  82. package/dist/{chunk-IJ3SXSZM.js → chunk-ND43ZOS3.js} +6 -6
  83. package/dist/chunk-NDWVJ2QZ.js +67 -0
  84. package/dist/{chunk-E65QIWOO.js → chunk-NPODGBVJ.js} +4 -4
  85. package/dist/{chunk-CYB7UQA2.js → chunk-OIKLDDYC.js} +5 -5
  86. package/dist/{chunk-MLGI2SRQ.js → chunk-PFBXSVZF.js} +4 -4
  87. package/dist/{chunk-AM4FKL4J.js → chunk-PL7AIAWS.js} +12 -12
  88. package/dist/{chunk-S7E2AHV3.js → chunk-PMMHSX4H.js} +26 -9
  89. package/dist/{chunk-WL2DSNJV.js → chunk-Q22BMRPF.js} +2 -2
  90. package/dist/{chunk-3FN2BIGB.js → chunk-QJM5XZ4K.js} +6 -6
  91. package/dist/{chunk-EWCDPFW5.js → chunk-QXYMDARD.js} +4 -4
  92. package/dist/{chunk-MLPDSGJQ.js → chunk-QZEAANWP.js} +5 -5
  93. package/dist/{chunk-ESZ2FF57.js → chunk-RIN4YY34.js} +88 -74
  94. package/dist/{chunk-37FBPMNE.js → chunk-S56YBYMN.js} +5 -2
  95. package/dist/{chunk-CBYQ2ZN3.js → chunk-SKEG3V2V.js} +2 -2
  96. package/dist/{chunk-4PQHO74B.js → chunk-SLGJIWCY.js} +4 -4
  97. package/dist/{chunk-IVKRT476.js → chunk-SPITRSOF.js} +2 -2
  98. package/dist/{chunk-BUECLQXK.js → chunk-SPKA2LV6.js} +4 -4
  99. package/dist/{chunk-HHW5AWVD.js → chunk-SSITMX7I.js} +30 -30
  100. package/dist/{chunk-OPG4DYX2.js → chunk-T4LJ5UR2.js} +29 -7
  101. package/dist/{chunk-LXNQWHZM.js → chunk-TECTL2NU.js} +4 -4
  102. package/dist/{chunk-E6H5ZEV3.js → chunk-TTEIDD5Q.js} +3 -3
  103. package/dist/{chunk-6VBTPV2Y.js → chunk-U35MTOXQ.js} +3 -3
  104. package/dist/{chunk-UKUIUS3E.js → chunk-U6MTGB46.js} +5 -5
  105. package/dist/{chunk-Y2ZLKBM6.js → chunk-UD2Z7K6W.js} +4 -4
  106. package/dist/{chunk-IXUPUFCG.js → chunk-UIVMR7UK.js} +2 -2
  107. package/dist/{chunk-UDE5C2XN.js → chunk-VDHA5SSQ.js} +3 -3
  108. package/dist/{chunk-5W7DOMIU.js → chunk-VJFMUJWZ.js} +4 -4
  109. package/dist/{chunk-XNCP4KYO.js → chunk-VQPDATQT.js} +1 -1
  110. package/dist/{chunk-KCAL4QYP.js → chunk-VW4CWVYX.js} +4 -4
  111. package/dist/chunk-WAVNUTMT.js +9 -0
  112. package/dist/{chunk-DIG3NITC.js → chunk-WBH4KJWM.js} +3 -3
  113. package/dist/{chunk-HSEQYBDO.js → chunk-WZHLMU6T.js} +3 -3
  114. package/dist/{chunk-WYEQFD6A.js → chunk-XFBGXB7X.js} +173 -105
  115. package/dist/{chunk-UI4OPTYR.js → chunk-Y453TW6J.js} +2 -2
  116. package/dist/{chunk-LUTMOHOW.js → chunk-YGLMRH5U.js} +9 -9
  117. package/dist/{chunk-GPI3OWRE.js → chunk-YHB34BN6.js} +2 -1
  118. package/dist/{chunk-5WGVIXMD.js → chunk-YKP4ZKVO.js} +14 -10
  119. package/dist/{chunk-MN2PB6WB.js → chunk-YR2I5HGE.js} +3 -3
  120. package/dist/{chunk-ZG7E72VI.js → chunk-YYC2DZMG.js} +7 -7
  121. package/dist/{chunk-D64XUF5Q.js → chunk-YYLUBYXM.js} +16 -16
  122. package/dist/{chunk-VRVKNY4A.js → chunk-Z4ZGTCCD.js} +8 -8
  123. package/dist/{chunk-44B4V2LR.js → chunk-ZDP6GDAB.js} +142 -142
  124. package/dist/{chunk-ET5DSBAC.js → chunk-ZJSTUD6D.js} +8 -8
  125. package/dist/cli.d.ts +36 -26
  126. package/dist/cli.js +57 -56
  127. package/dist/{codegen-command-HTWIW56U.js → codegen-command-R5IASBFC.js} +78 -72
  128. package/dist/codegen.d.ts +2 -2
  129. package/dist/codegen.js +2 -2
  130. package/dist/{commands-CVFYC4GK.js → commands-H7CPMMHH.js} +3 -3
  131. package/dist/{completion-AUEQC4XJ.js → completion-W5ZAI6TN.js} +12 -12
  132. package/dist/{config-JU6OQC77.js → config-MZ5KG4EP.js} +5 -5
  133. package/dist/{deploy-command-5WTFHMBT.js → deploy-command-34T2LKQ5.js} +64 -63
  134. package/dist/deploy-source-YLQ7WMYR.js +82 -0
  135. package/dist/{dev-env-sync-X636HLMK.js → dev-env-sync-TMJTNU3U.js} +58 -57
  136. package/dist/{diagnostics-LSMGB4TY.js → diagnostics-OMN5Y2AH.js} +2 -2
  137. package/dist/{display-name-hint-DMORHANO.js → display-name-hint-ZJGFNJKQ.js} +12 -12
  138. package/dist/{emit-hOFbgzde.d.ts → emit-D125xxty.d.ts} +67 -21
  139. package/dist/env-example-refresh-CQP3ZMKM.js +133 -0
  140. package/dist/{env-pull-command-WZZ7RL2E.js → env-pull-command-UTG6IC2K.js} +53 -53
  141. package/dist/{env-target-PO3MOLH5.js → env-target-FZROWYFS.js} +14 -14
  142. package/dist/{env-var-command-YKTJZFJN.js → env-var-command-VYDBQJJW.js} +51 -50
  143. package/dist/{ephemeral-BMFY55BQ.js → ephemeral-BIE6FMJV.js} +10 -10
  144. package/dist/{ephemeral-command-VDSQCOYL.js → ephemeral-command-OZ26RGXF.js} +54 -54
  145. package/dist/{ephemeral-state-6TY4JIPA.js → ephemeral-state-SNZOX2YK.js} +12 -12
  146. package/dist/{generate-command-3NTNRQRS.js → generate-command-4HR7MR36.js} +87 -79
  147. package/dist/{gitignore-FWPEDX6C.js → gitignore-EWQBXNX2.js} +20 -19
  148. package/dist/{guards-EJU2ONAX.js → guards-KYEOCVHN.js} +7 -7
  149. package/dist/{hosted-file-PSHJB3HX.js → hosted-file-S7YUQAH6.js} +2 -2
  150. package/dist/{impersonate-command-QEJA72Q2.js → impersonate-command-WC7OGKUM.js} +44 -43
  151. package/dist/{import-TBTOTU52.js → import-7Z4GCCPO.js} +6 -6
  152. package/dist/index.d.ts +14 -20
  153. package/dist/index.js +14 -14
  154. package/dist/init-command-HAO3WXH3.js +128 -0
  155. package/dist/{init-modules-HZRQFRLE.js → init-modules-NSKD4ASY.js} +12 -11
  156. package/dist/{init-web-Y2PBNJTQ.js → init-web-MKFFOQUU.js} +3 -3
  157. package/dist/internal.d.ts +5 -5
  158. package/dist/internal.js +61 -35
  159. package/dist/{io-ZUKAGFVE.js → io-PGTCBSIQ.js} +7 -5
  160. package/dist/{keep-data-merge-X5LDDCI3.js → keep-data-merge-QR2TMKEO.js} +33 -34
  161. package/dist/{lambda-config-reconcile-OUZ4OYAB.js → lambda-config-reconcile-7FJXXV6V.js} +4 -4
  162. package/dist/{landed-6VO7CX5P.js → landed-F7PCHGCK.js} +4 -4
  163. package/dist/{landing-record-QYECWLQ5.js → landing-record-MWXFIRCP.js} +26 -25
  164. package/dist/{live-diff-2S7E3SBZ.js → live-diff-5E2BQWQ7.js} +10 -9
  165. package/dist/local-engine-choice-VD5LNXJU.js +80 -0
  166. package/dist/{local-engine-command-HMTQK7MN.js → local-engine-command-RYLGMQ2O.js} +96 -95
  167. package/dist/{local-engine-config-5U3SC434.js → local-engine-config-W3KB7RWM.js} +2 -2
  168. package/dist/{local-engine-deploy-TXAOYRGF.js → local-engine-deploy-6O7NKZCA.js} +17 -17
  169. package/dist/{local-engine-process-6VZ7JJBP.js → local-engine-process-ZLLZEIRF.js} +12 -12
  170. package/dist/{local-engine-state-TJWPWCC4.js → local-engine-state-OCW5YDD7.js} +3 -3
  171. package/dist/{local-engine-update-check-R5SPDVEJ.js → local-engine-update-check-LVX4HBBI.js} +8 -8
  172. package/dist/{lock-TS465GVY.js → lock-HDCHD2ON.js} +5 -3
  173. package/dist/{lock-commands-4VT3L5W5.js → lock-commands-X2OECR4R.js} +62 -61
  174. package/dist/{login-command-O6WA4FYL.js → login-command-RLLKD565.js} +31 -30
  175. package/dist/{logout-command-6CPWGFY2.js → logout-command-XDMSXCDO.js} +17 -17
  176. package/dist/{loop-UFHKSOQ4.js → loop-SUB6C2LK.js} +9 -10
  177. package/dist/{marketplace-command-HKACSYKS.js → marketplace-command-2NHHY2X3.js} +89 -53
  178. package/dist/{marketplace-resolve-KLFYVRWS.js → marketplace-resolve-OTZYT4FG.js} +9 -8
  179. package/dist/{meta-client-73PX6UGJ.js → meta-client-TMHVBZFY.js} +15 -15
  180. package/dist/{module-manifest-GIKFNXPE.js → module-manifest-FNMW23IX.js} +7 -4
  181. package/dist/node.d.ts +5 -5
  182. package/dist/node.js +63 -63
  183. package/dist/operation-outcome-RN62735X.js +51 -0
  184. package/dist/{output-target-SZMBNYF4.js → output-target-MOLCTPBP.js} +21 -20
  185. package/dist/{package-manager-PRAHUSCN.js → package-manager-K762W7XT.js} +2 -2
  186. package/dist/{plan-disclosure-BHYG7TZ7.js → plan-disclosure-CY7AF6KP.js} +21 -22
  187. package/dist/{plugin-contributions-X4V22PJQ.js → plugin-contributions-WR26U7NT.js} +6 -6
  188. package/dist/{plugin-prompt-DKNQHW6Y.js → plugin-prompt-ZUYQQIX4.js} +5 -5
  189. package/dist/{plugin-questions-CQRVOWFK.js → plugin-questions-HAZOQ67R.js} +4 -4
  190. package/dist/plugin.d.ts +254 -10
  191. package/dist/{preflight-command-EBQ6XQF3.js → preflight-command-OHJXYND3.js} +70 -70
  192. package/dist/{profile-command-NPKBJYPM.js → profile-command-6JWT2BTL.js} +33 -32
  193. package/dist/{profile-pointer-UOO7JNFG.js → profile-pointer-PDA5XBIB.js} +5 -5
  194. package/dist/{profile-select-74TRDEPD.js → profile-select-45G5VPJK.js} +2 -2
  195. package/dist/{project-dependency-RRMTWOPC.js → project-dependency-GZWWGWEW.js} +13 -10
  196. package/dist/{project-sdk-FOR4IOXL.js → project-sdk-3W72H5QO.js} +4 -4
  197. package/dist/promote-command-UYAMUXKB.js +146 -0
  198. package/dist/{prompt-5GUQTCSP.js → prompt-U37K5RPQ.js} +4 -4
  199. package/dist/{publish-command-LGLZBOCB.js → publish-command-BUS27HGB.js} +138 -66
  200. package/dist/pull-command-ZGUNP27P.js +168 -0
  201. package/dist/{pull-superseded-GGURV5J3.js → pull-superseded-EZBGYRZF.js} +4 -4
  202. package/dist/{raw-where-EoWl5fqY.d.ts → raw-where-ZMLND6AG.d.ts} +20 -3
  203. package/dist/release-command-BQ6OHS3P.js +150 -0
  204. package/dist/{release-ns-command-EIBN3JVM.js → release-ns-command-ATGVBVIU.js} +94 -94
  205. package/dist/{retry-command-Y5YJGOH3.js → retry-command-QJ57WVW7.js} +9 -9
  206. package/dist/{routes-manifest-3BNZIVST.js → routes-manifest-YR4ZIMLM.js} +16 -8
  207. package/dist/routes-manifest-file-UALYSZLY.js +41 -0
  208. package/dist/scaffold.js +3 -3
  209. package/dist/{secrets-file-FUG7WCES.js → secrets-file-LMS7KX3E.js} +20 -19
  210. package/dist/{secrets-fill-command-QEOCUOAY.js → secrets-fill-command-QNBDGCGM.js} +61 -60
  211. package/dist/{seed-GJHJSEUE.js → seed-SZ6OS5DQ.js} +9 -9
  212. package/dist/{source-resolve-DMDZVPMM.js → source-resolve-MKLNYFWG.js} +24 -24
  213. package/dist/{static-host-WM24RG25.js → static-host-ONEHA4LI.js} +10 -10
  214. package/dist/{status-command-XUH5OGQX.js → status-command-XKIFKBGM.js} +57 -56
  215. package/dist/{store-CfgPaVPO.d.ts → store-Bg4Na6Sm.d.ts} +4 -4
  216. package/dist/{store-MR7IKXKK.js → store-X6ZH7EC3.js} +7 -7
  217. package/dist/sveltekit.d.ts +5 -5
  218. package/dist/sveltekit.js +1 -1
  219. package/dist/sync-baseline-DOV5AGIO.js +36 -0
  220. package/dist/{sync-contributions-DHP7XSTX.js → sync-contributions-HNVHDIQW.js} +21 -13
  221. package/dist/sync-record-PRXHLK4S.js +42 -0
  222. package/dist/{table-ZBDPKMNH.js → table-DC36QA4Y.js} +10 -10
  223. package/dist/{tables-command-X3JK7VSK.js → tables-command-UQLKTELN.js} +44 -43
  224. package/dist/{tenant-GKXMOYLK.js → tenant-EKNQGG5A.js} +11 -11
  225. package/dist/{tenant-command-P27EQHBU.js → tenant-command-2LWP2MPB.js} +105 -100
  226. package/dist/{test-command-A4G2FP7G.js → test-command-IU5MBBXY.js} +44 -43
  227. package/dist/{tests-C55M5EQS.js → tests-RG2Y5EQ4.js} +7 -7
  228. package/dist/{token-CMAB35GD.js → token-7AWSJLKO.js} +13 -13
  229. package/dist/toolchain-hooks-4ZMQLBPQ.js +46 -0
  230. package/dist/{toolchain-modules-3M7QDJBV.js → toolchain-modules-VU7SURVJ.js} +9 -6
  231. package/dist/toolchain-peers-CIDNEEQV.js +28 -0
  232. package/dist/tracked-backend-4BHSV7NC.js +81 -0
  233. package/dist/{update-check-LNNKIMML.js → update-check-A7FXIINW.js} +60 -59
  234. package/dist/{upgrade-command-7EUXML3P.js → upgrade-command-C5KBITFI.js} +64 -63
  235. package/dist/{whoami-command-KNWFWAX6.js → whoami-command-7WQII2H4.js} +16 -16
  236. package/dist/{workspace-TGPYOODG.js → workspace-Z46PUZNI.js} +6 -6
  237. package/dist/{workspace-binding-2TWZBHQY.js → workspace-binding-JE6YNDZJ.js} +15 -15
  238. package/dist/{workspace-command-T7Z2BDHD.js → workspace-command-FC4IMLAE.js} +119 -88
  239. package/dist/{workspace-env-VA7XN3UX.js → workspace-env-N4ZPFT6A.js} +17 -16
  240. package/dist/{workspace-export-AIGM6LC7.js → workspace-export-3A5BZTPS.js} +6 -6
  241. package/dist/{writable-FYJBTJOU.js → writable-D7KCZI5N.js} +4 -4
  242. package/dist/{xano-BSHYVFSE.js → xano-LCI7VWPS.js} +9 -9
  243. package/dist/{xanosdk-import-J6SRBZHW.js → xanosdk-import-P2A2KSXM.js} +10 -10
  244. package/dist/xanosdk-project-6AGMW2SL.js +42 -0
  245. package/guides/README.md +1 -0
  246. package/guides/authoring.md +3 -5
  247. package/guides/bundle.md +45 -0
  248. package/guides/cli.md +36 -34
  249. package/guides/codegen.md +5 -4
  250. package/guides/codes.md +16 -11
  251. package/guides/deploying.md +115 -58
  252. package/guides/environment.md +13 -13
  253. package/guides/marketplace.md +21 -0
  254. package/guides/module-contract.md +80 -4
  255. package/guides/project-structure.md +14 -0
  256. package/guides/typed-frontend.md +37 -0
  257. package/llms/client.md +14 -5
  258. package/llms/errors.md +1 -1
  259. package/llms/filters.md +4 -0
  260. package/llms/kinds-core.md +1 -1
  261. package/llms/statements-data.md +3 -2
  262. package/llms/tests.md +2 -2
  263. package/llms/toolchain.md +12 -0
  264. package/llms-full.txt +47 -21
  265. package/llms.txt +10 -10
  266. package/manifest.json +110 -107
  267. package/package.json +4 -4
  268. package/dist/agent-file-refresh-LB6KIMFY.js +0 -38
  269. package/dist/chunk-XXZZGXW2.js +0 -243
  270. package/dist/deploy-source-5CET3A5D.js +0 -81
  271. package/dist/env-example-refresh-ZO6XAV44.js +0 -127
  272. package/dist/init-command-27SFBW2F.js +0 -126
  273. package/dist/local-engine-choice-6BSPEG3E.js +0 -79
  274. package/dist/operation-outcome-2P4BVSEV.js +0 -51
  275. package/dist/promote-command-4F2NAE6P.js +0 -141
  276. package/dist/pull-command-WQFPLITW.js +0 -162
  277. package/dist/release-command-2OTNVMIL.js +0 -147
  278. package/dist/toolchain-hooks-BGZBDFAT.js +0 -96
  279. package/dist/tracked-backend-PZGUWD5J.js +0 -80
  280. package/dist/xanosdk-project-6KTCO47O.js +0 -41
@@ -89,15 +89,15 @@ processes at once.
89
89
  > **Upgrading:** a file written before profiles is read as the `default` profile with no
90
90
  > action needed. It is rewritten in the new shape the next time something writes to it.
91
91
 
92
- **Project-local credentials** — pass `--local` to `login` to cache tokens in a
92
+ **Project-local credentials** — pass `--local-auth` to `login` to cache tokens in a
93
93
  **project-local** `./.xano/auth.json` instead (which `login` **auto-adds to `.gitignore`**),
94
94
  scoping the sign-in to that directory. Every command that **reads** credentials
95
95
  (`deploy`/`details`, `whoami`, token refresh) resolves them **project-local first, global
96
96
  as a fallback**: it uses `./.xano/auth.json` when present, otherwise `~/.xanosdk/auth.json` —
97
- so a `--local` project keeps working without repeating the flag. `login` and `logout` do
98
- **not** fall back: they target the shared global cache unless you pass `--local`. A `logout`
97
+ so a `--local-auth` project keeps working without repeating the flag. `login` and `logout` do
98
+ **not** fall back: they target the shared global cache unless you pass `--local-auth`. A `logout`
99
99
  naming a profile that only `./.xano/auth.json` holds exits 8 (not found in the shared file)
100
- and names `xanosdk logout --local -p <name>` — it does not report the session as gone. A
100
+ and names `xanosdk logout --local-auth -p <name>` — it does not report the session as gone. A
101
101
  logout clears stored profiles only: with the `XANO_*` credential variables still set, it
102
102
  says so, and commands keep authenticating with them. An explicit
103
103
  `--config`/`$XANO_CONFIG` wins over both default file locations; only the three-variable
@@ -113,7 +113,7 @@ as JSON, while the human-readable progress (and the live URLs) echoes to stderr:
113
113
 
114
114
  ```jsonc
115
115
  {
116
- "kind": "ephemeral", // or "local-engine"
116
+ "kind": "ephemeral", // or "local"
117
117
  "destination": { // the PARENT it was created under, then the environment itself
118
118
  "instance": "https://x.xano.io", "workspaceId": 1, "kind": "ephemeral",
119
119
  "label": "ezm0-xkdq-6564", "url": "https://x.xano.io/tenant/ezm0-xkdq-6564",
@@ -144,7 +144,7 @@ again, when the suite could not be run — exit 6 — and `unreachable`, the tes
144
144
  (as `test run` takes them), when it stopped answering part-way; the same `N passed, M failed,
145
145
  K not run` line `test run-all` prints closes the run), `landingRecord` (`{ destination, file,
146
146
  recorded, changed, cleared }`: what this deploy recorded as landed, the scope of a later
147
- `--prune`; `null` for a local engine), `staticRemoved` (`{ urls, verified }`: the frontends a replace took down, below),
147
+ `--prune`; `null` for a Xano Engine), `staticRemoved` (`{ urls, verified }`: the frontends a replace took down, below),
148
148
  `notApplied` (flags accepted and not acted on — `--expires-hours` on an ephemeral that already
149
149
  exists), `unconfigured`, and `passwordHashesUnverifiable` (below). The raw
150
150
  workspace blob is deliberately never dumped: it carries per-tenant secrets that must not land
@@ -152,8 +152,8 @@ in shell history or CI logs.
152
152
 
153
153
  `xanosdk test run-all --json` (and `test run`, `test list`) writes the same per-test entries at
154
154
  the top level, beside the backend they ran on: `kind`, `env` (the ephemeral's or tenant's handle;
155
- `null` for a local engine or a workspace), `name` (the backend's own name whatever its kind — the
156
- same handle on an ephemeral or tenant, the engine's name on a local engine) and `display` (its display
155
+ `null` for a Xano Engine or a workspace), `name` (the backend's own name whatever its kind — the
156
+ same handle on an ephemeral or tenant, the engine's name on a Xano Engine) and `display` (its display
157
157
  name), each always present, `null` where the backend has none. When the suite stops answering
158
158
  part-way, the rest are not started and the run exits 6 with a failure document whose
159
159
  `details.results` is that document — `total` the whole suite, `notRun` and `unreachable` the tests
@@ -169,8 +169,8 @@ out and named (`--env-var GREETING`) — pass them again, or keep them in `xano/
169
169
  `xano/.secrets.json`, which a deploy reads. The same text is the `--json` error's `message`.
170
170
 
171
171
  **Where it goes** — the instance your **token is bound to** (the token's `aud`), never a
172
- flag. `xanosdk deploy` create-or-refreshes an **ephemeral**, which is the only environment it
173
- writes to. Reaching your real workspace is the separate release flow: cut a release from
172
+ flag. `xanosdk deploy --ephemeral` create-or-refreshes an **ephemeral**; a bare `xanosdk deploy`
173
+ runs the code on the Xano Engine on this machine instead ([below](#deploying-locally)). Reaching your real workspace is the separate release flow: cut a release from
174
174
  what ran, then `xanosdk promote <release>` lands it there as a new branch, leaving live
175
175
  untouched until you say otherwise.
176
176
 
@@ -250,10 +250,10 @@ step, without re-importing the backend.
250
250
  directory and nothing else: no compile, no backend import. `--to` picks the destination —
251
251
  `ephemeral[:<name>]`, `workspace`, or `tenant:<name>`; left off, the backend this project last
252
252
  deployed to — and a workspace or tenant asks before replacing what its users are served
253
- (`--yes` in CI). `publish` does not reach a local engine, so after a local-engine deploy it
254
- refuses the tracked engine and names `--to ephemeral`; the engine takes a frontend through
255
- `xanosdk deploy --local-engine --static <dir>` instead (below). Scaffolded projects carry it as `npm run xano:deploy:frontend`,
256
- which rebuilds first.
253
+ (`--yes` in CI). After a local deploy it publishes to that engine (`--to local`
254
+ names it), server half included — the upload `xanosdk deploy --local --static <dir>`
255
+ makes, without re-importing the backend (below). Scaffolded projects carry it as
256
+ `npm run xano:deploy:frontend`, which rebuilds first.
257
257
 
258
258
  ```bash
259
259
  xanosdk promote v2 --set-live # the backend, landed and live
@@ -402,6 +402,12 @@ Add your own public config (base URLs, *publishable* keys) with `--static-env KE
402
402
  verbatim to the browser, so everything injected is **public** — never put secrets here;
403
403
  those belong in backend env, read server-side via `env(name)`.
404
404
 
405
+ **Your dev server follows the deploy.** In a scaffolded project, a deploy that publishes no static site writes the backend
406
+ URL into the project's gitignored `.env.local` as `VITE_XANO_HOST`, in a marked block that leaves your own values alone and
407
+ is replaced rather than repeated next time. **Restart the dev server to pick it up.** `--no-dev-env` turns it off, and so
408
+ do `--static <dir>` and a site an earlier deploy published there that still serves — a frontend reads the URL at runtime. A `.env.local` your repo does not ignore is
409
+ reported, never written.
410
+
405
411
  **Showing a stored file.** A file column comes back as `{ path, name, type, size, meta,
406
412
  access, url }`. Don't use its `url`: on a tenant-scoped environment that field addresses the
407
413
  instance host *without* the `/tenant/<name>` segment and 404s — as a broken `<img>`, while
@@ -425,20 +431,20 @@ retrying the bare URL.
425
431
 
426
432
  ## Deploy targets, and what a release changes
427
433
 
428
- **Two targets**, so the dev loop and the production step stay distinct:
434
+ **Disposable targets and real ones**, so the dev loop and the production step stay distinct:
429
435
 
430
436
  | Command | Where it goes |
431
437
  |---|---|
432
- | `xanosdk deploy` | A disposable **ephemeral** environment — create-or-refreshed each run, auto-expiring, with its own URL. This is the default and needs no flag. |
438
+ | `xanosdk deploy` | The **Xano Engine** on this machine — the default, with no flag and no Xano account needed ([below](#deploying-locally)). `--local` spells it out. |
439
+ | `xanosdk deploy --ephemeral` | A disposable **ephemeral** environment on Xano's cloud — create-or-refreshed each run, auto-expiring, with its own URL. |
433
440
  | `xanosdk promote <release>` | Your **main Xano instance** workspace — the production target. Lands a release on a branch named for it (`--set-live` serves it). Its table changes reach live as it lands — see [what a landing does to tables](#what-a-landing-does-to-tables). |
434
441
  | `xanosdk tenant deploy <tenant> <release>` | A **customer tenant** — the same release, landed on someone else's deployment. It **replaces** what the tenant serves: anything the release does not carry is removed. Static hosting is kept. |
435
442
  | `xanosdk deploy --to <dest>` | The **escape hatch**: merges a local build straight into `workspace` or `tenant:<name>`, skipping the release record. |
436
- | `xanosdk deploy --local-engine` | A **local engine** on this machine — no Xano account needed ([below](#deploying-to-a-local-engine)). |
437
- | `xanosdk test` | Nothing — it only reads. Runs the tests an already-deployed backend carries; `--on` picks which one, `local-engine` and `workspace` included. |
443
+ | `xanosdk test` | Nothing — it only reads. Runs the tests an already-deployed backend carries; `--on` picks which one, `local` and `workspace` included. |
438
444
 
439
- Not every instance has ephemeral environments enabled. Where they are off, `deploy` says so
440
- and names who can turn them on — there is no second destination to fall back to. `xanosdk
441
- export` and `xanosdk preflight` still work meanwhile.
445
+ Not every instance has ephemeral environments enabled. Where they are off, `deploy --ephemeral`
446
+ says so and names who can turn them on. A bare `deploy` (the Xano Engine), `xanosdk export` and
447
+ `xanosdk preflight` still work meanwhile.
442
448
 
443
449
  Every `deploy` is a **full replace** of the disposable environment — always fresh — unless
444
450
  you pass `--keep-data`. Landing somewhere real is the opposite by design: it changes what
@@ -454,7 +460,7 @@ object in `details.outOfScope`, and the rerun with `--yes` printed).
454
460
 
455
461
  ### Keeping your data between deploys
456
462
 
457
- `xanosdk deploy --keep-data` redeploys to your ephemeral or local engine by **merging** into
463
+ `xanosdk deploy --keep-data` redeploys to your ephemeral or Xano Engine by **merging** into
458
464
  what an earlier deploy put there, instead of replacing it. Code and schema changes land,
459
465
  objects removed from the project are deleted, and the rows already in the tables stay. Seed
460
466
  rows are not written again.
@@ -469,7 +475,7 @@ and exits 0, as any declined confirmation does). Without one the
469
475
  merge is refused before it writes, as `--prune` refuses the same deletion:
470
476
  `SDK_PRUNE_OUT_OF_SCOPE`, exit 2, each object in `details.outOfScope` as `{ type, name, label }`
471
477
  (the shape `deploy --to --prune` uses), and the rerun with `--yes` printed. A merge that goes ahead names them in `--json`'s `notLanded`. The scaffolded
472
- `npm run xano:deploy:local-engine` passes it, so the rows you enter through your app survive
478
+ `npm run xano:deploy` passes it, so the rows you enter through your app survive
473
479
  every code change.
474
480
 
475
481
  It merges only into an environment an earlier deploy **finished** filling. Otherwise it
@@ -535,7 +541,7 @@ the name back restores them. Columns are named
535
541
  The limits, in one place: rows survive only in tables and columns that keep their identity
536
542
  (a table renamed through `xanosdk lock rename` keeps its rows; an unrecorded rename is refused,
537
543
  below); changed env values and a new table's seeds need `--reset`;
538
- a local engine's rows last as long as its process (an engine update restarts it empty, and the
544
+ a Xano Engine's rows last as long as its process (an engine update restarts it empty, and the
539
545
  next run seeds); and a test whose `datasource` is `"live"`
540
546
  sees the kept rows, not only the seed fixtures.
541
547
 
@@ -602,24 +608,24 @@ Another import already running on the instance is not a refusal of the project:
602
608
  `--to` already merges, so `--keep-data --to` is refused; the flags that only mean something
603
609
  with `--to` (`--seed`, `--prune`, `--dry-run`, …) stay refused alongside it.
604
610
 
605
- ### Deploying to a local engine
611
+ ### Deploying locally
606
612
 
607
- `xanosdk deploy --local-engine` deploys to an engine running on this machine instead of an
613
+ `xanosdk deploy --local` deploys to an engine running on this machine instead of an
608
614
  ephemeral — no network round-trip per deploy. It needs nothing configured:
609
615
 
610
616
  - **The first run** resolves the latest published engine for this machine's platform,
611
617
  downloads it, checks it against the sha256 its release recorded, and **pins** that version in
612
- your `package.json` under `"xanosdk": { "@xano/sdk": { "localEngine": "vX.Y.Z" } }` —
618
+ your `package.json` under `"xanosdk": { "@xano/sdk": { "engine": "vX.Y.Z" } }` —
613
619
  creating a `package.json` holding only that pin when the project has none. Commit that change —
614
620
  every checkout of the project then runs the same engine.
615
621
  - **Every later run** uses the pinned version, whatever is newest. Each version downloads once
616
622
  per machine and is shared by every project on it (`~/.xanosdk/local-engine`, or
617
- `XANOSDK_LOCAL_ENGINE_HOME`); a cached pin deploys with no network access.
623
+ `XANOSDK_ENGINE_HOME`); a cached pin deploys with no network access.
618
624
  - **A newer engine** is announced on each deploy (checked at most once an hour; opt out with
619
625
  `XANOSDK_NO_UPDATE_CHECK=1`). In an interactive terminal the deploy asks whether to update,
620
626
  defaulting to no — a version you declined is only noted afterwards, not asked again. In CI,
621
627
  piped output or `--json` it prints a one-line notice and keeps the pin. The pin never moves
622
- without a yes or an explicit `xanosdk local-engine update`.
628
+ without a yes or an explicit `xanosdk local update`.
623
629
  - **A running engine on a different version** than the one the project now resolves to — after
624
630
  an update, or after a teammate moved the pin — is stopped and replaced, and the deploy says
625
631
  so.
@@ -629,33 +635,32 @@ ephemeral — no network round-trip per deploy. It needs nothing configured:
629
635
  keeps the one-hour default; its `--ttl <duration>` flag changes it.
630
636
 
631
637
  An engine update restarts the engine, and a restarted engine starts **empty**: the next
632
- `--keep-data` run (which the scaffolded `npm run xano:deploy:local-engine` passes) seeds it
638
+ `--keep-data` run (which the scaffolded `npm run xano:deploy` passes) seeds it
633
639
  rather than merging, so rows entered through your app do not survive the upgrade.
634
640
 
635
- **Operating on it.** After a local-engine deploy, the engine is the backend this project
641
+ **Operating on it.** After a local deploy, the engine is the backend this project
636
642
  tracks, so bare `xanosdk test run-all`, `env set`, `env pull`, `tables`, `impersonate` and
637
- `status` reach it — none of them needs a Xano account. Name it explicitly as `local-engine`,
638
- or `local-engine:<name>` for another one from `xanosdk local-engine list` (the full grammar is in
639
- [the CLI guide](cli.md#naming-a-backend)). Two commands cannot serve it and refuse it by name:
640
- `publish` (a local engine takes its frontend from `deploy --local-engine --static`; or pass
641
- `--to ephemeral`) and `release create`
643
+ `status` reach it — none of them needs a Xano account. Name it explicitly as `local`,
644
+ or `local:<name>` for another one from `xanosdk local list` (the full grammar is in
645
+ [the CLI guide](cli.md#naming-a-backend)). `publish` puts a built frontend on it without
646
+ re-importing the backend. One command cannot serve it and refuses it by name: `release create`
642
647
  (the cut runs on the instance — pass `--from ephemeral`).
643
648
 
644
649
  | Command | What it does |
645
650
  |---|---|
646
- | `xanosdk local-engine update` | Moves the pin to the latest engine (`--version <v>`: that one, downgrades included), downloads it, and restarts the project's running engine on it. Commit `package.json`. |
647
- | `xanosdk local-engine cache list` | Each cached engine version, its size on disk, and the engines running on it. |
648
- | `xanosdk local-engine cache clear` | Removes every cached engine (`--version <v>`: just that one). An engine running on a removed version is stopped first; the next deploy fetches it again. |
651
+ | `xanosdk local update` | Moves the pin to the latest engine (`--version <v>`: that one, downgrades included), downloads it, and restarts the project's running engine on it. Commit `package.json`. |
652
+ | `xanosdk local cache list` | Each cached engine version, its size on disk, and the engines running on it. |
653
+ | `xanosdk local cache clear` | Removes every cached engine (`--version <v>`: just that one). An engine running on a removed version is stopped first; the next deploy fetches it again. |
649
654
 
650
- #### A frontend on the local engine, and server rendering
655
+ #### A frontend on the Xano Engine, and server rendering
651
656
 
652
- `xanosdk deploy <entry> --local-engine --static <dir>` publishes a built frontend to the
657
+ `xanosdk deploy <entry> --local --static <dir>` publishes a built frontend to the
653
658
  engine's own static host after the import, as on an ephemeral, and reports it as `static.url`:
654
659
  `http://<prefix>.localhost:<port>`. Chrome, Firefox and Safari 26 resolve `*.localhost` to this
655
660
  machine by themselves (Safari on macOS 15 and earlier does not); a tool that does not resolve it
656
661
  can call the engine's own URL with a `Host: <prefix>.localhost:<port>` header. The engine needs a release
657
662
  that hosts static sites: an older one answers the upload with a 501, which the deploy reports
658
- without failing the backend (exit `3`), and `xanosdk local-engine update` moves the pin on.
663
+ without failing the backend (exit `3`), and `xanosdk local update` moves the pin on.
659
664
 
660
665
  The engine hosts built output only, and refuses a build of more than 20,000 files or 256 MB unpacked.
661
666
  The deploy checks both before the import, so an oversize directory stops the run with nothing
@@ -681,7 +686,7 @@ that keeps a `svelte.config.js`.
681
686
 
682
687
  `vite build` then writes the client assets and prerendered pages at the output's root, a
683
688
  `404.html` fallback shell, and the server half in `.xano-ssr/`. Deployed with
684
- `--local-engine --static <that directory>`, the engine serves the files as files and renders every other
689
+ `--local --static <that directory>`, the engine serves the files as files and renders every other
685
690
  path (a dynamic route, `__data.json`, a form action) through the server half, so a crawler that
686
691
  fetches `/products/lamp` gets that product's own `<title>` and meta tags. A server `load` reads
687
692
  the engine's own URL as `XANO_HOST` from `$env/dynamic/private`:
@@ -718,20 +723,20 @@ there instead (and says so in the build log), so that route boots — an unknown
718
723
 
719
724
  The cache above holds the engine **binaries**. A running engine keeps its own **runtime data** —
720
725
  its unpacked runtime files, its logs, and the records of running engines — beside them, under
721
- `engine/` in the same directory (`~/.xanosdk/local-engine`, or `XANOSDK_LOCAL_ENGINE_HOME`): in
726
+ `engine/` in the same directory (`~/.xanosdk/local-engine`, or `XANOSDK_ENGINE_HOME`): in
722
727
  `engine/Library/Caches` on macOS and `engine/.cache` on Linux, the directory holding `dist`,
723
728
  `instances` and `logs` folders. Its `logs` folder holds one file per engine start; a start that
724
729
  fails names it.
725
730
 
726
731
  Expect it to reach roughly 600 MB after the first deploy, and to grow by a similar amount for
727
- each engine version you run, since every version unpacks its own copy. `xanosdk local-engine cache
728
- list` shows its size, and `xanosdk local-engine cache clear` (with no `--version`) removes it with the
732
+ each engine version you run, since every version unpacks its own copy. `xanosdk local cache
733
+ list` shows its size, and `xanosdk local cache clear` (with no `--version`) removes it with the
729
734
  engines once none is running — it names any engine still up; stop it and clear again. The next
730
735
  deploy recreates what it needs.
731
736
 
732
737
  Versions before this layout unpacked the same runtime into your own per-user cache directory.
733
738
  Nothing runs from that copy now; `cache list` shows it when it is there, and
734
- `xanosdk local-engine cache clear --legacy-runtime` removes it after asking (`--yes` without a
739
+ `xanosdk local cache clear --legacy-runtime` removes it after asking (`--yes` without a
735
740
  terminal).
736
741
 
737
742
  #### Running a different engine without moving the pin
@@ -739,9 +744,9 @@ terminal).
739
744
  To try an experimental build, or a published version the project hasn't moved to, override the
740
745
  pin for your own runs instead of editing `package.json`:
741
746
 
742
- - `--local-engine=<value>` for one deploy;
743
- - `XANOSDK_LOCAL_ENGINE_OVERRIDE=<value>` for every deploy in this shell, including
744
- `npm run xano:deploy:local-engine`, which passes a bare flag.
747
+ - `--local=<value>` for one deploy;
748
+ - `XANOSDK_ENGINE_OVERRIDE=<value>` for every deploy in this shell, including
749
+ `npm run xano:deploy`, which passes a bare flag.
745
750
 
746
751
  Both take a **version** (`v0.1.8`, or `0.1.8`: that release from the release manager), an
747
752
  **`https` URL** to an engine archive, or the **path** to an engine archive on this machine. A
@@ -758,24 +763,24 @@ next `--keep-data` run seeds it); unset the variable and the next deploy goes ba
758
763
  engine the same way.
759
764
 
760
765
  ```bash
761
- export XANOSDK_LOCAL_ENGINE_OVERRIDE=~/Downloads/engine-experimental.tar.gz
762
- npm run xano:deploy:local-engine # runs the experimental build; package.json untouched
763
- unset XANOSDK_LOCAL_ENGINE_OVERRIDE # next deploy is back on the pinned version
766
+ export XANOSDK_ENGINE_OVERRIDE=~/Downloads/engine-experimental.tar.gz
767
+ npm run xano:deploy # runs the experimental build; package.json untouched
768
+ unset XANOSDK_ENGINE_OVERRIDE # next deploy is back on the pinned version
764
769
  ```
765
770
 
766
- `XANOSDK_LOCAL_ENGINE_TOKEN`, when set, is sent only to an override URL's host.
771
+ `XANOSDK_ENGINE_TOKEN`, when set, is sent only to an override URL's host.
767
772
  `XANOSDK_ENGINE_RELEASES_URL` points version lookups at a different engine release service. Its
768
773
  engines are downloaded fresh on every deploy and kept apart from the version cache, and the
769
774
  deploy runs its latest without reading or writing the pin or checking for updates;
770
- `xanosdk local-engine update` refuses while it is set.
775
+ `xanosdk local update` refuses while it is set.
771
776
 
772
777
  ### The release flow
773
778
 
774
779
  This is the path to a real destination. Each step leaves something the next one can name:
775
780
 
776
781
  ```bash
777
- xanosdk deploy ./xano/index.ts --test # 1. stand it up on an ephemeral, run its tests
778
- xanosdk release create v1 # 2. cut a release from what just ran (after a local-engine deploy: --from ephemeral)
782
+ xanosdk deploy ./xano/index.ts --ephemeral --test # 1. stand it up on an ephemeral, run its tests
783
+ xanosdk release create v1 # 2. cut a release from what just ran (after a local deploy: --from ephemeral)
779
784
  xanosdk promote v1 # 3. land it in your workspace, on a branch named for it
780
785
  xanosdk tenant deploy acme v1 # …or on a customer tenant
781
786
  ```
@@ -982,7 +987,7 @@ instead, so stdout is never empty. Branch on `code`, not on the message:
982
987
  | `SDK_EXPORT_INVALID` | The workspace failed an export check, or `--strict` promoted a warning. | `details.diagnostics`: `{ severity, code, message }` per failed check; under `--strict`, every warning that fails it; `code` names the check, e.g. `seed.public-seed`; `details.warnings` beside it, empty when the run printed none |
983
988
  | `SDK_CREDENTIAL_REJECTED` | The instance, or its sign-in server, refused the credential this run used: exit 1. The message names the sign-in that fixes it. | `details`: `{ profile, credentialType, instance, workspaceId, signIn }` (`profile` is `null` for an environment credential; `instance` and `workspaceId` are `null` for a refused `XANO_REFRESH_TOKEN`; `signIn` is `null` when the fix is a variable or an upgrade rather than a command) |
984
989
  | `SDK_USAGE` | The command line was mistyped or incomplete — an unknown flag, a value on a flag that takes none, a flag without the one it needs (`--dry-run` without `--to`), a missing argument, a confirmation with no terminal to ask on, a local file or directory it names that does not exist: exit 1. | `suggestion`: the closest match, when one is close enough |
985
- | `SDK_ERROR` | Any failure without a code of its own yet — including a NAMED thing that cannot be found (a backend, release, branch, static host, test, profile or local-engine version: exit 8). A network failure or a server error (5xx) is exit 8 before anything is written — the backend's lookup, a read-only command's read (`tables`, `test list`, `env pull`, `status`, `whoami`, `workspace details`, `workspace branch`'s list), a local engine's release lookup or download, and `--keep-data`'s reads ahead of its merge (whether the environment can merge, its live read, the merge preview) got no answer or a 5xx; rerun as printed — and exit 1 at a later step that never reached it (an import that was not sent: nothing was written — retry). A `501` on `--keep-data`'s check is an answer, not an outage: that backend cannot merge, so it is exit 1 with the deploy that replaces instead. | `suggestion`: the near name a not-found one is one slip from, when there is one (`suggestions`: every one, when a command missed several) |
990
+ | `SDK_ERROR` | Any failure without a code of its own yet — including a NAMED thing that cannot be found (a backend, release, branch, static host, test, profile or Xano Engine version: exit 8). A network failure or a server error (5xx) is exit 8 before anything is written — the backend's lookup, a read-only command's read (`tables`, `test list`, `env pull`, `status`, `whoami`, `workspace details`, `workspace branch`'s list), a Xano Engine's release lookup or download, and `--keep-data`'s reads ahead of its merge (whether the environment can merge, its live read, the merge preview) got no answer or a 5xx; rerun as printed — and exit 1 at a later step that never reached it (an import that was not sent: nothing was written — retry). A `501` on `--keep-data`'s check is an answer, not an outage: that backend cannot merge, so it is exit 1 with the deploy that replaces instead. | `suggestion`: the near name a not-found one is one slip from, when there is one (`suggestions`: every one, when a command missed several) |
986
991
 
987
992
  A piped stdout gets the document too, without `--json`, so a script reading the pipe never gets
988
993
  an empty stdout. The exception is a command whose stdout is the data itself (`export` to stdout,
@@ -1238,6 +1243,58 @@ object with the same key *and* the same identity, so a lock cannot pin a guid th
1238
1243
  never had. If none of the lock's identities appear in the source, that is what pointing a
1239
1244
  project at an unrelated backend looks like, and the pull is refused unless you pass `--yes`.
1240
1245
 
1246
+ ### Which side changed: the sync baseline
1247
+
1248
+ When a workspace and this project differ, `workspace diff` also says **which side moved** since
1249
+ they last matched. Every command that makes them match records a baseline in `xano.lock`, under
1250
+ `synced`. A baseline is one content digest per object, kept per workspace and per branch. The
1251
+ commands that record one are `deploy --to workspace`, a verified `promote`, `pull workspace`
1252
+ and `init --from workspace`. Commit it with the rest of the lock.
1253
+
1254
+ ```bash
1255
+ xanosdk workspace diff ./xano/index.ts --json
1256
+ ```
1257
+
1258
+ ```jsonc
1259
+ {
1260
+ "matched": false,
1261
+ "differing": ["query:GET list (apiGroup orders)", "table:order"],
1262
+ "baseline": { "at": "2026-10-05T13:36:31.000Z", "by": "pull" },
1263
+ "changedThere": ["query:GET list (apiGroup orders)"], // edited in Xano since the baseline
1264
+ "changedHere": ["table:order"], // edited in this project since
1265
+ "changedBoth": [], // edited on both sides: a conflict
1266
+ "unclassified": [] // differs, direction unknown
1267
+ }
1268
+ ```
1269
+
1270
+ - `changedThere`: pull before you deploy, or the deploy overwrites that edit.
1271
+ - `changedHere`: deploy it.
1272
+ - `changedBoth`: reconcile by hand.
1273
+ - `unclassified`: the baseline cannot tell. The object has no baseline entry, both sides
1274
+ already differed when it was taken, or it is the workspace's own settings row, which is
1275
+ never digested. A changed slug also shows only here, because digests leave slugs out.
1276
+
1277
+ Additions and deletions are classified as well. The baseline keeps this project's objects apart
1278
+ from the rest of the branch, so an object the project never held (another source's, or a section
1279
+ a pull does not write into `xano/`) is never reported as deleted here; it shows up only when it
1280
+ changes in Xano. An object that is new in Xano counts as `changedThere` only when the baseline is
1281
+ **complete**: a pull, an `init --from`, a verified
1282
+ `promote` and a `--replace` record every object on the branch, and so does a merge deploy
1283
+ that read the branch first. With no baseline for the branch, `baseline` is `null` and the
1284
+ four lists are empty. A run that finds the branch exactly as recorded leaves the lock alone.
1285
+
1286
+ A few things to know about the baseline:
1287
+
1288
+ - It records what the branch holds after the sync, read back from the branch where the command
1289
+ can do so, so an object stored differently from how it compiles is not reported as changed in
1290
+ Xano. It is recorded whoever's objects landed (a `--bundle` from elsewhere, a release another
1291
+ project cut), because it describes the branch, not ownership.
1292
+ - A baseline taken by a different SDK version under an older digest scheme is set aside
1293
+ (`baseline: null`) and replaced by the next sync, rather than read as every object changed.
1294
+ - An SDK older than this feature drops `synced` when it rewrites `xano.lock`. Nothing breaks: the
1295
+ next sync records a new baseline.
1296
+ - On a merge conflict in `xano.lock`, keep either side's baseline for a branch, or delete it.
1297
+
1241
1298
  ### Deploying to a branch
1242
1299
 
1243
1300
  `--branch <label>` stages on a Xano branch instead of the live one, which is the safer shape
@@ -16,7 +16,7 @@ are what you get when the variable is unset.
16
16
  | `XANO_META_TOKEN` | Meta API bearer token. With the two above it forms a complete credential that outranks every other source, reads no file, and never rotates. |
17
17
  | `XANO_REFRESH_TOKEN` | OAuth refresh token for non-interactive runs (CI, agents). Paired with `XANO_CLIENT_ID`; the target instance comes from the token's own `aud` claim. Rotates on use — prefer the meta credential above. |
18
18
  | `XANO_CLIENT_ID` | OAuth client id that goes with `XANO_REFRESH_TOKEN`. Both are copied once out of the profile in `auth.json` after a local `xanosdk login`. |
19
- | `XANO_CONFIG` | Explicit path to the credential file. Wins over both default locations — the same thing `--config <path>` does. Refused beside `--local`, which names a different file. |
19
+ | `XANO_CONFIG` | Explicit path to the credential file. Wins over both default locations — the same thing `--config <path>` does. Refused beside `--local-auth`, which names a different file. |
20
20
  | `XANO_PROFILE` | Which stored credential profile to act as, when no `--profile` names one. Outranked by the flag, by the project's `xano.profile.json` pin, and by an environment credential (which displaces it with a note on stderr). |
21
21
  | `XANO_GLOBAL_CONFIG` | Moves the **shared** credential cache off `~/.xanosdk/auth.json`. Only changes where the global cache lives; the project-local `./.xano/auth.json` and the `XANO_CONFIG`/`--config` override are unaffected. |
22
22
  | `XANO_CLIENT_FILE` | Moves the OAuth **client-registration** cache off `~/.xano/xanosdk-clients.json`. That file holds the `client_id` minted per auth host + redirect URI, not a credential. |
@@ -49,14 +49,14 @@ are what you get when the variable is unset.
49
49
  | `XANOSDK_UPDATE_REGISTRY` | Registry URL the check reads, instead of the npm endpoint for `@xano/sdk`. |
50
50
  | `XANOSDK_UPDATE_CACHE` | Moves the check's cache file off `~/.xanosdk/update-check.json`. |
51
51
 
52
- **Local engine** (see [Deploying to a local engine](deploying.md#deploying-to-a-local-engine))
52
+ **Xano Engine** (see [Deploying locally](deploying.md#deploying-locally))
53
53
 
54
54
  | Variable | What it does |
55
55
  |---|---|
56
- | `XANOSDK_LOCAL_ENGINE_OVERRIDE` | An engine to run instead of the project's pinned one, for every `deploy --local-engine` in this shell: a version (`v0.1.8`), an `https://` URL to an engine archive (plain `http://` only from this machine), or an archive path. A value on `--local-engine=` beats it; it never reads or moves the pin. |
57
- | `XANOSDK_LOCAL_ENGINE_TOKEN` | Bearer credential sent with an override URL's download — only to that URL's own origin, never to another host a redirect leads to. |
58
- | `XANOSDK_LOCAL_ENGINE_HOME` | Moves everything the local engine writes off `~/.xanosdk/local-engine`: the engine cache, the running-engine records, and the engine's own logs and runtime data — see [where the engine keeps its data](deploying.md#where-the-engine-keeps-its-data). |
59
- | `XANOSDK_ENGINE_RELEASES_URL` | A different engine release service for version lookups. Its engines are fetched fresh each deploy, the pin is not read or written, and `xanosdk local-engine update` refuses while it is set. |
56
+ | `XANOSDK_ENGINE_OVERRIDE` | An engine to run instead of the project's pinned one, for every `deploy --local` in this shell: a version (`v0.1.8`), an `https://` URL to an engine archive (plain `http://` only from this machine), or an archive path. A value on `--local=` beats it; it never reads or moves the pin. |
57
+ | `XANOSDK_ENGINE_TOKEN` | Bearer credential sent with an override URL's download — only to that URL's own origin, never to another host a redirect leads to. |
58
+ | `XANOSDK_ENGINE_HOME` | Moves everything the Xano Engine writes off `~/.xanosdk/local-engine`: the engine cache, the running-engine records, and the engine's own logs and runtime data — see [where the engine keeps its data](deploying.md#where-the-engine-keeps-its-data). |
59
+ | `XANOSDK_ENGINE_RELEASES_URL` | A different engine release service for version lookups. Its engines are fetched fresh each deploy, the pin is not read or written, and `xanosdk local update` refuses while it is set. |
60
60
 
61
61
  **Escape hatches**
62
62
 
@@ -113,8 +113,8 @@ xanosdk env pull --from workspace --yes # and skip the confirmation
113
113
  ```
114
114
 
115
115
  The source is a backend that is running: `workspace`, `ephemeral[:<name>]`,
116
- `local-engine[:<name>]`, or `tenant:<name>` — the [backend grammar](cli.md#naming-a-backend)
117
- every command shares. Left off, it is the ephemeral or local engine this project last
116
+ `local[:<name>]`, or `tenant:<name>` — the [backend grammar](cli.md#naming-a-backend)
117
+ every command shares. Left off, it is the ephemeral or Xano Engine this project last
118
118
  deployed to. A bundle path is refused, because its env is whatever it was built with,
119
119
  which is the stale set this command exists to replace.
120
120
 
@@ -132,7 +132,7 @@ resolved env values in cleartext (see the `--bundle` note below).
132
132
 
133
133
  ```bash
134
134
  printf %s "$STRIPE_KEY" | xanosdk env set STRIPE_KEY --to workspace --yes # value on stdin
135
- xanosdk env set FEATURE_FLAG on --to local-engine # or as the second argument
135
+ xanosdk env set FEATURE_FLAG on --to local # or as the second argument
136
136
  xanosdk env unset STRIPE_KEY --to tenant:prod-eu # remove it
137
137
  ```
138
138
 
@@ -142,12 +142,12 @@ a deploy can't do that job. A merge deploy only adds names that aren't there yet
142
142
  `--replace` rewrites the whole workspace.
143
143
 
144
144
  The destination is `--to workspace`, `--to ephemeral[:<name>]`, `--to tenant:<name>`, or
145
- `--to local-engine[:<name>]` for a local engine. With none of these, the command writes to
146
- the ephemeral or local engine this project last deployed to. It never falls back to your
147
- workspace or a tenant, and a local engine needs no Xano account. A write to
145
+ `--to local[:<name>]` for a Xano Engine. With none of these, the command writes to
146
+ the ephemeral or Xano Engine this project last deployed to. It never falls back to your
147
+ workspace or a tenant, and a Xano Engine needs no Xano account. A write to
148
148
  the workspace or a tenant asks for confirmation first, and `--yes` skips it; that flag is
149
149
  required when there is no terminal, including when the value is piped in. Ephemerals and the
150
- local engine are throwaway, so the command doesn't ask.
150
+ Xano Engine are throwaway, so the command doesn't ask.
151
151
 
152
152
  The value is never printed. Pipe it on stdin to keep it out of shell history. One trailing
153
153
  newline is dropped, so `echo` works too. An empty value is refused unless
@@ -169,6 +169,23 @@ that arrived some other way is configured by this run too: a plain `npm install`
169
169
  pull request, a `git pull` that changed `package.json`. It also means nothing has to recover
170
170
  a package name out of a `file:` or tarball specifier in order to configure it.
171
171
 
172
+ A **toolchain module** gets two more steps, and `reinstall` runs both as well. Its peers other
173
+ than `@xano/sdk` (`zod`, say) are added as direct dependencies through the project's package
174
+ manager: yarn never installs peers, and pnpm does not link them where `routes.gen.ts` can import
175
+ them. Then, when the project keeps a `routes.gen.ts` beside its entry, the file is regenerated,
176
+ so the module's section lands with the module rather than at the next `xano:routes`. Under
177
+ `--json`, `peers` lists the specs that were added (`["zod@^4.0.0"]`, or `[]`), and `routes` says
178
+ what happened to the file:
179
+
180
+ | `routes` | Meaning |
181
+ |---|---|
182
+ | `written` | Regenerated. |
183
+ | `unchanged` | Already up to date. |
184
+ | `absent` | The project has no `routes.gen.ts` to refresh. |
185
+ | `skipped` | It could not be regenerated here. The warning says why; run `npm run xano:routes`. |
186
+
187
+ `remove` reports `routes` the same way, for the file it regenerates without the removed module.
188
+
172
189
  `init` takes the same names and resolves them the same way — `--marketplace auth` is
173
190
  `@xano-sdk/auth`, and an unlisted name exits 8 before anything is written — so a project can be
174
191
  scaffolded with its add-ons already installed and registered:
@@ -207,6 +224,10 @@ What happens then depends on whether the module predates the command:
207
224
  | `install` re-run over a module already in `dependencies`, or `reinstall` | Refused and **left alone**, settings included, because deleting a module you already had over a version mismatch is not a repair. Upgrade the SDK, or `marketplace remove` it. |
208
225
  | `init --marketplace` | Reported as a module that was not added and taken back off disk. The scaffold itself completes and works. |
209
226
 
227
+ A *different* installed module that is out of range does not stop the verb. `install`, `reinstall`
228
+ and `remove` skip it with a warning naming its range and the fix, and leave its settings and its
229
+ `routes.gen.ts` block exactly as they were. `export`, `deploy` and `preflight` still refuse it.
230
+
210
231
  The point of undoing the install is that the alternative is worse: a module whose hooks were
211
232
  built against a contract this SDK does not have registers and applies **nothing**, so
212
233
  `Installed` would be followed by a project where every command that loads modules refuses it.
@@ -163,6 +163,7 @@ const plugin: ToolchainPlugin = {
163
163
  answersFromConfig: (config) => ({ ... }),
164
164
  onBundle: async (ctx) => ({ ... }),
165
165
  onPreflight: async (ctx) => ({ ... }),
166
+ routesManifest: (ctx) => ({ imports: [...], source: "..." }),
166
167
  };
167
168
 
168
169
  export default plugin;
@@ -175,10 +176,11 @@ guessing which would run code the manifest did not describe.
175
176
  Every hook is optional. A module that only adds a `.gitattributes` line declares
176
177
  `contributes` alone.
177
178
 
178
- Five hooks, and deliberately no more. This contract was designed from one example, and a
179
- contract designed from one example generalizes badly, so it covers exactly what that first
180
- module needed and stops. The second toolchain module is the one that should widen it, with a
181
- real second set of requirements in hand.
179
+ Six hooks, and deliberately no more. The first five were designed from one example (a module
180
+ that renders the workspace to a committed tree) and cover exactly what it needed. The sixth,
181
+ `routesManifest`, was added when a second module, `@xano-sdk/zod`, brought a second real set
182
+ of requirements: writing into a file the SDK generates rather than a tree of its own. A hook
183
+ is added when a module needs it, not in anticipation.
182
184
 
183
185
  ## Questions
184
186
 
@@ -452,6 +454,78 @@ reason to blank.
452
454
  A project whose plugins declare no `onPreflight` never pays for the engine's rendering at all,
453
455
  so declaring the hook is what turns that fetch on.
454
456
 
457
+ ## `routesManifest`
458
+
459
+ ```ts
460
+ import type { ToolchainPlugin } from "@xano/sdk/plugin";
461
+
462
+ const plugin: ToolchainPlugin = {
463
+ kind: "toolchain",
464
+ routesManifest: (ctx) => ({
465
+ imports: [{ from: "zod", names: ["z"] }],
466
+ source: `export const ROUTE_SCHEMAS = ...;`,
467
+ }),
468
+ };
469
+ ```
470
+
471
+ Your module's section of the route manifest, `xano/routes.gen.ts`. It runs wherever that file
472
+ is written: `xanosdk routes ./xano/index.ts --emit xano/routes.gen.ts` (the scaffold's
473
+ `xano:routes`), `pull`, `generate`, and the refresh `marketplace install`, `reinstall` and
474
+ `remove` make, so your block lands with your module.
475
+
476
+ | `RoutesManifestContext` | What it carries |
477
+ |---|---|
478
+ | `inputs` | Every endpoint's, channel's and message's request inputs, under the manifest's final keys (`routes`, `channels`, `messages`), in a fixed order. |
479
+ | `config` | Your block from the project's `package.json` `"xanosdk"` object. |
480
+ | `sdkVersion` | The running `@xano/sdk` version. |
481
+
482
+ `inputs` is a validator-neutral description (type `RouteInputs` in `@xano/sdk/plugin`, not
483
+ the generated map of the same name): each input's name, type, `required`, `nullable`, list
484
+ bounds, enum values, methods, and children. A database link is one `dbLink` entry carrying the
485
+ linked table's expanded `columns`, to spread into the surrounding object; `columns` is
486
+ `undefined` when the payload does not carry that table, which is not "no columns". Walk this
487
+ rather than the payload: it is the same description the SDK renders its own `RouteInputs`,
488
+ `ChannelInputs` and `MessageInputs` types from, so a validator built from it cannot disagree
489
+ with them.
490
+
491
+ **Where the section lands.** The SDK composes the file: the merged imports of every module at
492
+ the top, then the core sections, then each module's `source` in a marked block, blocks ordered
493
+ by package name:
494
+
495
+ ```ts
496
+ // xanosdk:begin @xano-sdk/zod
497
+ // xanosdk:version 1.0.3 - generated; edits inside this block are overwritten
498
+ ...
499
+ // xanosdk:end @xano-sdk/zod
500
+ ```
501
+
502
+ Your source is in the same file as the core sections, so it names `RouteInputs`,
503
+ `ChannelInputs`, `MessageInputs` and `MessageName` directly, without importing them; all four
504
+ are always emitted, as `{}` when empty. Anything you export is exported from `routes.gen.ts`.
505
+ Your names share one scope with the core sections and every other module's, so a collision
506
+ fails the user's typecheck rather than being renamed. A blank `source` writes no block, and its
507
+ imports are dropped with it: that is how a config that turns the section off removes it.
508
+
509
+ **Imports are declared, never written.** The core sections import nothing, which is what keeps
510
+ the file free of the SDK runtime in a frontend bundle. Declare yours in `imports`; never put an
511
+ `import` line in `source`. Each `from` must be a bare package name: `@xano/sdk` and its
512
+ subpaths, a relative or absolute path, and a protocol (`node:`) are all refused, naming your
513
+ module. Each name must be a plain identifier, with no `as` rename. A package you import must
514
+ resolve from the user's project, so declare it in your `peerDependencies`:
515
+ `xanosdk marketplace install` adds each peer other than `@xano/sdk` that the project does not
516
+ already declare as a direct dependency, with your range, through the project's package manager.
517
+
518
+ **Synchronous and pure.** No filesystem, network, clock or randomness: the same context must
519
+ return the same section every time. Every writer of the file must produce the same bytes for
520
+ the same workspace and installed modules, or `routes --emit --strict` passes or fails depending
521
+ on which command last wrote it. A Promise, or any value that is not `{ imports?, source }`, is
522
+ refused, and `source` must not spell a block marker (`// xanosdk:begin`, `// xanosdk:end`).
523
+
524
+ **A throw is your module failing, not the manifest.** The core sections are still refreshed,
525
+ your previous block is kept exactly as it was, and a warning names your module. On
526
+ `routes --emit --strict` it is fatal instead, because a check that did not run must not read
527
+ as one that passed.
528
+
455
529
  ## `HookResult`: `failed` is not a throw
456
530
 
457
531
  ```ts
@@ -544,6 +618,8 @@ Things worth proving about your own module:
544
618
  - Your `onBundle` writes nothing when `ctx.frozen` is true.
545
619
  - Your `onBundle` handles `ctx.entry === undefined`.
546
620
  - Your hooks never read `payload.env` values, because they are blanked.
621
+ - `routesManifest` returns the same section for the same context, called twice, and what it
622
+ writes typechecks beside the core sections of a real `routes.gen.ts`.
547
623
 
548
624
  ## Publishing
549
625
 
@@ -41,3 +41,17 @@ free to use any other layout; only `index.ts` registering the objects matters.
41
41
  Authoring is **declarative def-objects** passed to factories; there is no callback/chaining
42
42
  builder. `xano.export()` returns the importable `packageExport` bundle, and
43
43
  `xanosdk export`/`deploy` read the module's default export.
44
+
45
+ ## Wiring a project by hand
46
+
47
+ `xanosdk init` writes all of this for you. Without it, two lines set a project up:
48
+
49
+ ```bash
50
+ npm init -y && npm pkg set type=module && npm install -D @xano/sdk
51
+ npx xanosdk upgrade # rewrites npm's caret to the range init writes
52
+ ```
53
+
54
+ Write your workspace in `xano/index.ts`; `login` and `deploy` are unchanged. `type=module`
55
+ matters: Xano SDK defs are ESM-only, and `npm init` writes `"type": "commonjs"`. A TypeScript
56
+ entry wants [`tsx`](https://tsx.is) (`npm i -D tsx`), which the CLI picks up — Node's type
57
+ stripping does not remap a workspace's `./x.js` imports.