@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
package/README.md CHANGED
@@ -5,177 +5,194 @@
5
5
  ### The official TypeScript SDK for [Xano](https://xano.com).
6
6
 
7
7
  **Write your app in TypeScript — the database, the APIs, even AI agents. Or let an
8
- AI write it for you. Then run one command and it's live on Xano's cloud, with its own
9
- URL. No servers, no setup, no config. That's it.**
8
+ AI write it for you. Run it on your own machine on the Xano Engine, with no account and no
9
+ network. When it's ready, one command puts the same code live on Xano's cloud.**
10
10
 
11
- [![npm](https://img.shields.io/npm/v/@xano/sdk?color=%230055FF&label=%40xanosdk%2Fsdk)](https://www.npmjs.com/package/@xano/sdk)
11
+ [![npm](https://img.shields.io/npm/v/@xano/sdk?color=%230055FF&label=%40xano%2Fsdk)](https://www.npmjs.com/package/@xano/sdk)
12
12
  [![node](https://img.shields.io/node/v/@xano/sdk)](https://nodejs.org)
13
13
  [![license](https://img.shields.io/npm/l/@xano/sdk)](LICENSE)
14
14
 
15
+ [What is Xano](#what-is-xano) ·
16
+ [Why](#why-xano-sdk) ·
17
+ [Quickstart](#quickstart) ·
18
+ [Xano Engine](#xano-on-your-machine) ·
19
+ [The model](#the-model) ·
20
+ [Typed frontend](#a-type-safe-frontend-for-free) ·
21
+ [Already on Xano?](#already-have-a-xano-workspace) ·
22
+ [Deploying](#deploying) ·
23
+ [Reference](#reference)
24
+
15
25
  </div>
16
26
 
27
+ <!-- A short terminal recording of the three commands below belongs here. -->
28
+
17
29
  ```bash
18
- npx @xano/sdk login # 1. sign in (opens your browser)
19
- npx @xano/sdk init my-app && cd my-app # 2. scaffold your backend + frontend
20
- npm run build # 3. build your frontend → frontend/dist
21
- npx xanosdk deploy ./xano/index.ts --static ./frontend/dist # 4. deploy both → live URLs
22
- # Outside a project: npx @xano/sdk <cmd>. Inside one, npx xanosdk <cmd> runs its own install.
30
+ npx @xano/sdk init my-app && cd my-app # 1. scaffold your backend + frontend
31
+ npm run xano:deploy # 2. run the backend on the Xano Engine, on your machine
32
+ npm run dev # 3. start the frontend, already wired to it
23
33
  ```
24
34
 
25
35
  ```
26
- → Deploying ./xano/index.ts → new ephemeral "my-app"
27
- ✓ Ephemeral e4f2-9ab1 deployed
28
- ! New ephemeral URL:
29
- https://e4f2-9ab1.xano.io ← backend, live
30
- Expires in 1h 0m
31
- ✓ Static host deployed
32
- https://my-app.xano.io ← frontend, live
36
+ → Deploying ./xano/index.ts → Xano Engine
37
+ ✓ Xano Engine xanosdk-4f2a91 deployed
38
+ ! New Xano Engine URL:
39
+ http://127.0.0.1:53358 ← your backend, on your machine
40
+ Open the builder: http://127.0.0.1:53358/signin?key=… ← Xano's visual builder, local too
41
+ Pointed .env.local at this deploy (VITE_XANO_HOST) ← the frontend, wired in
33
42
  ```
34
43
 
35
44
  <div align="center">
36
45
 
37
- **From an empty folder to a live full-stack app.** `init` sets up your project — a
38
- TypeScript backend and a React or Svelte frontend. `npm run build` builds your frontend, then
39
- `deploy` puts both online and hands you a live URL. Change your code — yourself or with
40
- an AI — and deploy again; your app updates in seconds. No servers to set up, nothing to
41
- configure, no glue code between your backend and your frontend.
46
+ **From an empty folder to a running full-stack app, without signing up.** `init` writes a
47
+ TypeScript backend and a React or Svelte frontend. The **Xano Engine** runs that backend on
48
+ your laptop: no account, no network round-trip, and your data kept between redeploys. Change
49
+ your code — yourself or with an AI — and redeploy in seconds. When it's ready to share,
50
+ `npm run xano:deploy:ephemeral` puts the same code on a live URL on Xano's cloud.
42
51
 
43
- [Why](#why-xano-sdk) ·
44
- [Quickstart](#quickstart) ·
45
- [The model](#the-model) ·
46
- [Deploying](#deploying) ·
47
- [Type-safe frontend](#a-type-safe-frontend-for-free) ·
48
- [Reference](#reference)
52
+ Outside a project the command is `npx @xano/sdk <cmd>`; inside one, `npx xanosdk <cmd>`.
49
53
 
50
54
  </div>
51
55
 
52
56
  ---
53
57
 
54
- ## Why Xano SDK
58
+ ## What is Xano?
55
59
 
56
- Xano gives you a genuinely scalable backend — Postgres, serverless functions, background
57
- tasks, realtime, MCP servers (tools, prompts and resources), AI agents — without you
58
- running a single server. Xano SDK is Xano's **officially supported** TypeScript SDK, and it
59
- gives you that backend **as code you own**:
60
+ [Xano](https://xano.com) is a hosted backend platform for business-critical systems — the
61
+ kind that run in production, not as prototypes. Postgres, REST APIs, auth, background tasks,
62
+ realtime, file storage, MCP servers and AI agents, all run for you on Kubernetes, with
63
+ SOC 2 Type II, ISO 27001, HIPAA and GDPR coverage ([trust center](https://security.xano.com)).
60
64
 
61
- - **📦 TypeScript is the source of truth.** Your whole workspace — tables, indexes, API
62
- endpoints, functions, triggers, tasks, middleware, AI toolsets — is typed TS in your repo.
63
- Version it, review it in PRs, diff it, roll it back. No more clicking through a dashboard
64
- and hoping prod matches staging.
65
+ Xano's bet is simple: **AI builds software. Xano makes it trustworthy.** Everything an AI
66
+ writes — a schema, an endpoint, an agent — lands somewhere you can understand, govern and
67
+ run. This SDK is that idea as code in your repo: the backend is TypeScript you review, and
68
+ the platform is where it runs.
65
69
 
66
- - **🚀 Deploy is built in.** `xanosdk deploy` compiles your code and ships it to a live Xano
67
- environment over an authenticated connection, then prints its URL. Backend **and** static
68
- frontend in one command — no export/import dance, no upload script to maintain.
70
+ [Docs](https://docs.xano.com) ·
71
+ [Community](https://community.xano.com) ·
72
+ [YouTube](https://www.youtube.com/@XanoHQ) ·
73
+ [X](https://x.com/xanohq) ·
74
+ [Status](https://status.xano.com) ·
75
+ [Pricing](https://www.xano.com/pricing)
69
76
 
70
- - **⚡ Fast, safe iteration.** Ephemeral environments are disposable and auto-expiring, so
71
- you rebuild as often as you like. Deploys are identity-stable: re-running never duplicates
72
- objects, and every build writes a `xano.lock` you commit, so renames stay renames instead
73
- of delete-and-recreate and your public URLs stay yours.
77
+ ---
74
78
 
75
- - **🧩 The types flow to your frontend.** `import type` a `query()` def for its typed request
76
- and response, and read its path and verb from `xano/routes.gen.ts` — plain data the scaffold
77
- regenerates before every dev, build and typecheck. Rename a column and every consumer lights up red.
79
+ ## Why Xano SDK
78
80
 
79
- - **🤖 AI-first by design.** A deterministic, fully-typed authoring surface: an agent (or
80
- you) emits well-typed TS that always compiles to a valid, importable workspace. It ships
81
- with machine-readable grounding an agent reads instead of your source — see
82
- [Coverage & agent grounding](https://github.com/xanots/sdk/blob/main/guides/coverage.md).
81
+ - **💻 Xano runs on your machine.** New for Xano: the Xano Engine is the platform on your
82
+ laptop. It needs no account and no network. It downloads once,
83
+ keeps your rows across redeploys, and opens the same visual builder you'd use in the cloud.
84
+ The project pins its version in `package.json`, so everyone on the team runs the same engine.
85
+ See [Xano, on your machine](#xano-on-your-machine).
83
86
 
84
- ---
87
+ - **🤖 Built for AI-written code.** A deterministic, fully-typed authoring surface: an agent
88
+ (or you) emits well-typed TypeScript that always compiles to a valid, importable workspace.
89
+ The package ships machine-readable grounding — `llms.txt` and the topic files beside it — so
90
+ a coding agent writes against the real API instead of a guess, and `init` drops an
91
+ `AGENTS.md` brief into every project. See
92
+ [Coverage & agent grounding](https://github.com/xano-sdk/sdk/blob/main/guides/coverage.md).
85
93
 
86
- ## Quickstart
94
+ - **📦 TypeScript is the source of truth.** Tables, indexes, endpoints, functions, triggers,
95
+ tasks, middleware, AI toolsets — typed TS in your repo. Version it, review it in PRs, diff
96
+ it, roll it back. Prod matches staging because they are the same commit.
87
97
 
88
- The four commands at the top of this page are the whole loop. Here they are one at a time.
98
+ - **🚀 Deploy is built in, from laptop to production.** One `xanosdk deploy` command compiles
99
+ your code and ships it, first to the Xano Engine, then to an **ephemeral** on Xano's cloud,
100
+ then through a release to your **workspace**. It sends the backend **and** the static
101
+ frontend and prints their URLs. There's no export/import step and no upload script to maintain.
89
102
 
90
- **1. Sign in.** OAuth in your browser — no API keys to copy around. The CLI refreshes tokens
91
- for you, and the target instance comes from your token rather than a flag.
103
+ - **⚡ Disposable environments.** A Xano Engine and a cloud ephemeral are both yours to wipe
104
+ and rebuild as often as you like. Deploys are identity-stable: re-running never duplicates
105
+ objects, and the `xano.lock` every build writes keeps renames as renames, so your public
106
+ URLs stay yours.
92
107
 
93
- ```bash
94
- npx @xano/sdk login
95
- ```
108
+ - **🧩 The types flow to your frontend.** A generated route manifest gives it every path, verb
109
+ and request type; `import type` a `query()` def for its response. Rename a column and every
110
+ consumer lights up red.
96
111
 
97
- > On a remote shell, container, or Codespace — anywhere your browser can't reach this machine's `127.0.0.1` — add `--paste`. It prints the URL for you to open anywhere,
98
- > and you paste the redirect back. No browser at all (CI, a headless agent)? Create a token in your instance's settings under **Metadata API & MCP Server**, then pipe it
99
- > to `npx @xano/sdk profile add <name> --instance <url> --workspace-id <n>`. See [Signing in & deploying](https://github.com/xanots/sdk/blob/main/guides/deploying.md).
112
+ - **🔁 It works both ways.** Already have a workspace? `init --from workspace` reads it back
113
+ as real, readable TypeScript — then deploys.
100
114
 
101
- **2. Scaffold.** `init` writes a complete project: a Vite frontend under `frontend/` (React
102
- 19 + shadcn/ui by default, or SvelteKit with `--framework svelte`), a Xano SDK backend under
103
- `xano/`, and the `xano:export` / `xano:deploy` scripts already wired.
115
+ ---
104
116
 
105
- ```bash
106
- npx @xano/sdk init my-app && cd my-app
107
- npm run dev # the frontend runs immediately
108
- ```
117
+ ## Quickstart
118
+
119
+ The three commands at the top of this page are the whole local loop. Here it is one step at a
120
+ time, then out to the cloud.
109
121
 
110
- In a terminal it asks one question — the framework — with a default. `AGENTS.md`, the
111
- agent brief every coding agent reads, is written without asking; `--no-agents-md` skips it. The theme is a flag, not a question: it is shadcn's own, a base color plus an
112
- optional accent, rendered into the token stylesheet with a complete dark palette either way.
122
+ **1. Scaffold.** No sign-in needed. `init` writes a Vite frontend under `frontend/` (React 19 +
123
+ shadcn/ui by default, or SvelteKit with `--framework svelte`), a Xano SDK backend under
124
+ `xano/`, and the `xano:deploy*` scripts already wired.
113
125
 
114
126
  ```bash
115
- npx @xano/sdk init my-app --theme zinc-blue --dark toggle
116
- npx @xano/sdk init my-app --theme https://ui.shadcn.com/r/themes/slate.json # or any registry theme
127
+ npx @xano/sdk init my-app && cd my-app
117
128
  ```
118
129
 
119
- The starter backend is empty but already compiles and deploys — grow it from the walkthrough
120
- in `xano/EXAMPLE.md`. For the flags, the two presets, theming, and add-ons, see
121
- [The scaffolded project](https://github.com/xanots/sdk/blob/main/guides/scaffold.md).
130
+ Theme it with a flag (`--theme zinc-blue --dark toggle`) or pick everything in a browser with
131
+ `--web`. The starter backend is empty but already deploys — grow it from `xano/EXAMPLE.md`.
132
+ Flags, presets, theming and add-ons: [The scaffolded project](https://github.com/xano-sdk/sdk/blob/main/guides/scaffold.md).
122
133
 
123
- Prefer to see the theme before you commit to it? `--web` picks the framework, the palette,
124
- the typefaces and the add-ons in a browser, against a live preview, and hands the result
125
- back to `init` here in your terminal.
134
+ **2. Run it on the Xano Engine.** The first deploy downloads the engine for your platform and
135
+ pins its version in `package.json`; every one after starts in seconds, offline.
126
136
 
127
137
  ```bash
128
- npx @xano/sdk init my-app --web
138
+ npm run xano:deploy # typecheck, then deploy the backend to an engine on this machine
139
+ npm run dev # the frontend, pointed at it through .env.local
129
140
  ```
130
141
 
131
- It is a nicer way to arrive at the flags above, not a second scaffolder — it prints the
132
- equivalent `init` command when it is done, so the project stays reproducible from a script.
133
- The configurator is downloaded on demand, so `--web` needs the registry before it can
134
- start; `init` reaches out only to install the new project's dependencies, which
135
- `--no-install` skips.
142
+ The deploy prints the backend URL and a link that opens Xano's visual builder on the engine.
143
+ That's the dev loop: edit `xano/`, redeploy, and keep `npm run dev` running. Redeploys keep
144
+ your rows (`--keep-data`); `-- --reset` gives a clean, re-seeded slate.
136
145
 
137
- **3. Build the frontend.**
146
+ **3. Put it on Xano's cloud.** When you want a URL to share, sign in once and deploy to a
147
+ disposable **ephemeral** — a real Xano environment with its own address. The deploy prints
148
+ the backend and frontend URLs and bakes the backend one into your build as
149
+ `window.XANO_HOST`, so the frontend never needs to know it ahead of time.
138
150
 
139
151
  ```bash
140
- npm run build # → frontend/dist
152
+ npx xanosdk login # OAuth in your browser — no API keys to copy around
153
+ npm run xano:deploy:ephemeral # build the frontend, ship both → live URLs
141
154
  ```
142
155
 
143
- **4. Deploy both.** One authenticated call ships your database schema, your APIs, your
144
- functions and triggers, **and** your compiled web app.
156
+ > No browser on this machine — a container, a Codespace, CI? `npx @xano/sdk login --paste`
157
+ > prints the URL to open anywhere, and a token from your instance's settings works headless.
158
+ > See [Signing in & deploying](https://github.com/xano-sdk/sdk/blob/main/guides/deploying.md).
145
159
 
146
- ```bash
147
- npx xanosdk deploy ./xano/index.ts --static ./frontend/dist
148
- ```
160
+ **4. Release it to your workspace:** `deploy --ephemeral --test`, `release create v1`, `promote v1` ([Deploying](#deploying)).
149
161
 
150
- ```
151
- → Deploying ./xano/index.ts → new ephemeral "my-app"
152
- ✓ Ephemeral e4f2-9ab1 deployed
153
- ! New ephemeral URL:
154
- https://e4f2-9ab1.xano.io ← backend, live
155
- Expires in 1h 0m
156
- ✓ Config injected into 1 document: window.XANO_HOST ← backend URL, wired in
157
- ✓ Static host deployed
158
- https://my-app.xano.io ← frontend, live
159
- ✓ Frontend is live ← edge confirmed serving THIS build
160
- ```
162
+ **Prefer to wire it by hand?** Install `@xano/sdk` in an ESM project and deploy
163
+ `xano/index.ts` with `npx xanosdk deploy ./xano/index.ts`; [Project structure](https://github.com/xano-sdk/sdk/blob/main/guides/project-structure.md)
164
+ has the two-line setup and the one rule that bites.
161
165
 
162
- That's the dev loop. Change your code and run step 4 again; the environment refreshes in
163
- seconds. The deploy bakes the backend URL into your build as `window.XANO_HOST`, so the
164
- frontend never needs to know it ahead of time — read it with a build-time fallback:
166
+ ---
165
167
 
166
- ```ts
167
- const HOST = (typeof window !== "undefined" && window.XANO_HOST) || import.meta.env.VITE_XANO_HOST;
168
- ```
168
+ ## Xano, on your machine
169
+
170
+ Xano has always been a hosted platform. The **Xano Engine** is that backend packaged to run on
171
+ your laptop. `xanosdk deploy` brings one up and deploys into it — it is where a deploy goes by default.
172
+
173
+ - **No account, no network.** A Xano Engine needs no sign-in, a cached one deploys offline,
174
+ and every import runs on your machine. It's the fastest way to try Xano, and an AI agent
175
+ can iterate against a real backend without credentials.
176
+ - **Your data stays put.** `--keep-data` merges each deploy into what the last one left, so
177
+ rows you entered through the app survive the edit. `--reset` starts over and re-seeds.
178
+ - **The builder, locally.** Every deploy prints a sign-in link to Xano's visual builder
179
+ running on the engine, so you can browse your tables and see what your code compiled to.
180
+ - **The whole stack.** `--static ./frontend/dist` has the engine serve your built frontend
181
+ too, and a SvelteKit app built with `@xano/sdk/sveltekit` renders on the server there.
182
+ - **Pinned, like a dependency.** The first run pins the engine version in `package.json`;
183
+ commit it and every checkout runs the same engine. Newer ones are offered, never forced.
184
+ - **Every command reaches it.** After a local deploy, `test run-all`, `tables`, `env set`,
185
+ `impersonate` and `status` target the engine without a flag, and with no account.
169
186
 
170
- > Deploying again keeps the **backend** URL; the **frontend** one changes, because a deploy
171
- > is a full replace and clears the environment's static hosting along with its workspace.
172
- > Hand out the URL from the latest run. [Signing in & deploying](https://github.com/xanots/sdk/blob/main/guides/deploying.md) covers
173
- > the injection rules, serving stored files, and headless CI runs.
187
+ ```bash
188
+ npx xanosdk local list # the engines running on this machine
189
+ npx xanosdk local stop <name> # stop one
190
+ npx xanosdk local update # move the pin to the latest engine
191
+ npx xanosdk local cache clear # reclaim the disk space
192
+ ```
174
193
 
175
- **Prefer to wire it by hand?** Skip `init` — `npm init -y && npm pkg set type=module && npm install -D @xano/sdk`, then `npx xanosdk upgrade`
176
- (it rewrites npm's caret to the range `init` writes). Write your workspace in `xano/index.ts`; steps 1 and 4
177
- are unchanged. `type=module` matters: Xano SDK defs are ESM-only, and `npm init` writes `"type": "commonjs"`. A TypeScript entry wants
178
- [`tsx`](https://tsx.is) (`npm i -D tsx`), which the CLI picks up — Node's type stripping does not remap a workspace's `./x.js` imports.
194
+ Where it keeps its data, serving a frontend, trying an engine build without moving the pin:
195
+ [Deploying locally](https://github.com/xano-sdk/sdk/blob/main/guides/deploying.md#deploying-locally).
179
196
 
180
197
  ---
181
198
 
@@ -185,7 +202,7 @@ You author declarative def-objects, register them on one `Xano` instance, and Xa
185
202
  compiles the whole thing into Xano's importable bundle.
186
203
 
187
204
  ```ts
188
- import { workspace, table, query, apiGroup, f, s, ref, c, expr, col } from "@xano/sdk";
205
+ import { workspace, table, query, apiGroup, f, input, s, inp, ref, c, expr, col } from "@xano/sdk";
189
206
 
190
207
  // A database table — `id` + `created_at` auto-inject, so declare only your own columns.
191
208
  const user = table({
@@ -220,10 +237,17 @@ const listPosts = query({
220
237
  response: ref("rows"),
221
238
  });
222
239
 
240
+ const createPost = query({
241
+ verb: "POST", apiGroup: blog, name: "posts",
242
+ input: { title: input.text({ required: true }), body: input.text() },
243
+ stack: [s.db.add({ table: post, row: { title: inp("title"), body: inp("body") }, as: "row" })],
244
+ response: ref("row"),
245
+ });
246
+
223
247
  export default workspace("blog")
224
248
  .registerApiGroups([blog])
225
249
  .registerTables([user, post])
226
- .registerQueries([listPosts]);
250
+ .registerQueries([listPosts, createPost]);
227
251
  ```
228
252
 
229
253
  Tab-complete `s.` to discover the entire statement catalog — `s.db.*`, `s.math.*`,
@@ -231,7 +255,7 @@ Tab-complete `s.` to discover the entire statement catalog — `s.db.*`, `s.math
231
255
  and more. **All 218 engine statement surfaces are authorable** — every field name matches
232
256
  the Xano engine, and the emitted shape is checked against bytes a real engine stored. Where
233
257
  a surface has no stored instance behind it yet, it is built from the engine's own schema;
234
- [Coverage](https://github.com/xanots/sdk/blob/main/guides/coverage.md) says which is which.
258
+ [Coverage](https://github.com/xano-sdk/sdk/blob/main/guides/coverage.md) says which is which.
235
259
 
236
260
  Give a table a `seed` array and those rows ship into the database on deploy, so a fresh
237
261
  environment comes up with its lookup tables and fixtures already in place. A file column or an
@@ -253,289 +277,173 @@ knowledge({
253
277
  So the instructions your agents follow are reviewed in a diff, versioned with the code they
254
278
  describe, and redeployed with it — instead of living in a console where nothing tracks them.
255
279
 
256
- Tables, fields,
257
- statements, values, inputs, and middleware are all in the
258
- [Authoring reference](https://github.com/xanots/sdk/blob/main/guides/authoring.md); every kind you can author is in
259
- [Object kinds](https://github.com/xanots/sdk/blob/main/guides/object-kinds.md).
260
-
261
- ---
262
-
263
- ## Deploying
264
-
265
- A deploy targets a **disposable ephemeral**. Reaching anything real goes through a **release** — the stored record
266
- that this code came up and answered: `deploy --test`, then `release create v1`, then `promote v1`.
267
-
268
- | Command | Where it goes |
269
- |---|---|
270
- | `xanosdk deploy` | A disposable **ephemeral** — create-or-refreshed each run, auto-expiring, with its own URL. The default; needs no flag. |
271
- | `xanosdk deploy --local-engine` | A **local engine** on this machine — no network round-trip per deploy, nothing to configure, and no Xano account needed. The first run downloads the engine and pins its version in `package.json` so every checkout runs the same one; `xanosdk local-engine update` moves the pin ([details](guides/deploying.md#deploying-to-a-local-engine)). |
272
- | `xanosdk promote <release>` | Your **main Xano instance** workspace — the production target. Lands a release on a branch named for it, reads the branch back, and fails naming anything the release declared that did not arrive. `--set-live` serves it once that check passes. Tables are shared by every branch, so its table changes reach live as it lands — one that alters a table is refused without `--allow-shared-schema-changes`. |
273
- | `xanosdk tenant deploy <tenant> <release>` | A **customer tenant** — the same release, on someone else's deployment. It **replaces** what the tenant serves: anything the release does not carry is removed. Static hosting is kept. |
274
- | `xanosdk release transfer <release> --to-profile <profile>` | **Another workspace or instance** — copies the stored release, checked by content hash, to `promote` there. |
275
- | `xanosdk deploy --to <dest>` | The **escape hatch**: merges a local build straight into `workspace` or `tenant:<name>`, skipping the release record. |
276
- | `xanosdk publish <dir>` | **Just the frontend**: an already-built directory onto the ephemeral you last deployed to (default), `workspace`, or `tenant:<name>` static host — after a local-engine deploy, `--to ephemeral`, as a local engine has none. No compile, no backend import — the retry when a frontend fails after its backend landed, and `npm run xano:deploy:frontend` in a scaffold. |
277
-
278
- Every `deploy` is a **full replace** of the disposable environment unless [`--keep-data`](guides/deploying.md#keeping-your-data-between-deploys) merges, keeping its rows.
279
- Promoting is the opposite by design: it changes what your code defines and keeps every row — so an unchanged
280
- project is a no-op. But tables have no branch: a change that alters one reaches live as it lands, so it is refused without `--allow-shared-schema-changes`. A tenant deploy then serves
281
- exactly the release, and a `--seed` release REPLACES its seeded tables' rows, named with counts first ([details](guides/deploying.md#what-a-landing-does-to-tables)).
282
-
283
- Going the other way — from a backend you did not author — is `xanosdk pull release:v1`, which **rewrites** the decoded files in `xano/` — it keeps files you added, and lists and confirms first.
284
-
285
- **The alternative.** `deploy --to workspace` merges your local build straight in, skipping the release record. Reach
286
- for it to delete objects, or for the plan preview a release cannot run (`--dry-run`, `--prune`; `--yes` skips the
287
- prompt for CI, never the preview). It leaves nothing to re-land — prefer a release for anything you may repeat.
288
-
289
- A release name is **refused** rather than resolved when it already exists, and so is a public URL something else
290
- already holds. Nothing is written, the message names what holds it, and the exit code is `2`. `--yes` does not
291
- waive it: a taken identity is not a question about whether you meant it.
292
-
293
- **Scripting a landing:** `release create`, `promote` and `tenant deploy --json` print one result, failures included; `completed: unknown` exits `9` —
294
- run its `resolveWith` before retrying ([details](guides/deploying.md#reading-the-result---json-and-exit-codes)).
295
-
296
- > ⚠️ A deploy is a full replace of the target environment, **including its table records**, before importing. The
297
- > blast radius is your own disposable ephemeral — but anything you only ever created by hand in it is gone. That
298
- > is exactly why reaching production goes through a release.
299
-
300
- **Deploying to a branch.** With one workspace, a deploy and production are the same thing.
301
- `--branch <label>` lands it on a non-live branch instead, `--set-live` promotes it, and
302
- `--backup-branch` snapshots live's logic, not its shared tables, for a one-`set-live` rollback — see
303
- [the deploying guide](guides/deploying.md). The flag reads too: `init --from workspace --branch
304
- <label>` pulls that branch rather than live, so reviewing one as TypeScript costs no cutover.
305
-
306
- > ⚠️ **A branch stages your logic, not your database.** Tables and microservices are shared by
307
- > every branch, so a schema change reaches production whichever branch you target. A branch
308
- > release carrying one is refused unless you pass `--allow-shared-schema-changes`. Seeded
309
- > **rows** are shared too, so reference data has an order: rows first (`workspace
310
- > reset-tables`), then the logic reading them — the guide has the recipe.
311
-
312
- > ⚠️ **`--replace` clears by workspace, not by branch.** It deletes every non-live branch and
313
- > the saved versions that would restore one — not recoverable. Refused unless you pass
314
- > `--allow-branch-deletion`, which `--yes` does not cover; the guide has the recipe.
315
-
316
- `xanosdk status` answers where you stand in one read — who you are signed in as, which
317
- credential profile that came from, which instance and workspace it is bound to, and the
318
- backend this project last deployed to — an ephemeral or a local engine — including whether it is still alive and when it
319
- expires. More than one account or instance is `xanosdk login --profile <name>`, then
320
- `--profile <name>` on any command. `xanosdk init` commits a `xano.profile.json` pinning the
321
- repository to one credential (`xanosdk profile use <name>` repoints it), and nothing ambient
322
- outranks that pin: a `$XANO_PROFILE` in a shell rc cannot retarget a pinned project, only
323
- `--profile` can. The tracked environment is per profile, so a redeploy under another credential
324
- cannot refresh the wrong tenant, and every writing command names its target before writing.
325
-
326
- **Your dev server follows the deploy.** In a scaffolded project, a deploy that publishes no static site writes the backend
327
- URL into the project's gitignored `.env.local` as `VITE_XANO_HOST`, in a marked block that leaves your own values alone and
328
- is replaced rather than repeated next time. **Restart the dev server to pick it up.** `--no-dev-env` turns it off, and so
329
- 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
330
- reported, never written.
331
-
332
- Every flag, the `--prune` rules, the identity model, and headless CI runs are in
333
- [Signing in & deploying](https://github.com/xanots/sdk/blob/main/guides/deploying.md). Every operation names a backend one way — `workspace`, `ephemeral[:<name>]`, `local-engine[:<name>]`, `tenant:<name>`, `release:<name>` — and a bare one follows the ephemeral or local engine you last deployed to, never your workspace ([the grammar](guides/cli.md#naming-a-backend)).
334
- Environment management is `xanosdk ephemeral <list|get|delete|export>`; `xanosdk tables [backend]` lists guids and `xanosdk impersonate [backend]` opens one in the builder.
335
-
336
- ### Testing
337
-
338
- The tests you author — a `tests` entry on a query, function, or middleware, or a standalone
339
- `workflowTest()` — run against a deployed environment:
340
-
341
- ```bash
342
- npx xanosdk test run-all # the ephemeral or local engine you last deployed to
343
- npx xanosdk test run-all --on ephemeral:e4f2-9ab1 # or one by its name, not its display name (also local-engine, tenant:<name>)
344
- npx xanosdk test run-all --on workspace # or your real workspace
345
- ```
346
-
347
- A test's `datasource` defaults to `""` — an empty database, so `table({ seed })` rows are
348
- not visible. On an ephemeral, set `datasource: "live"` to read them: there it holds only
349
- your seed fixtures (plus any rows a `--keep-data` deploy kept). That value is **stored on the test**, so clear it before you release —
350
- a non-empty datasource is cloned before every run, and against your real workspace that is
351
- the production database.
352
-
353
- `xanosdk test list` shows what is there without running it, and `xanosdk test run "<name>"`
354
- runs one. A failing suite exits **5**, distinct from a crash, so CI can tell the two apart.
355
- To deploy and prove it in one step, `xanosdk deploy ./xano/index.ts --test` — a failing test
356
- exits 5 **without** retracting the deploy, so the environment is live either way.
280
+ Tables, fields, statements, values, inputs, and middleware are all in the
281
+ [Authoring reference](https://github.com/xano-sdk/sdk/blob/main/guides/authoring.md); every
282
+ kind you can author is in [Object kinds](https://github.com/xano-sdk/sdk/blob/main/guides/object-kinds.md).
357
283
 
358
284
  ---
359
285
 
360
286
  ## A type-safe frontend, for free
361
287
 
362
- Because your API is a typed def, the code that *calls* it reuses that def instead of
363
- re-typing URLs and request bodies. Paths come from a generated route manifest, types
364
- straight from the defs:
288
+ Because your API is a typed def, the code that *calls* it never re-types a URL or a request
289
+ body: paths and request types come from a generated route manifest, responses from the defs:
365
290
 
366
291
  ```bash
367
292
  npx xanosdk routes ./xano/index.ts --emit xano/routes.gen.ts # scaffolds run this before dev/build/typecheck
368
293
  ```
369
294
 
370
295
  ```ts
371
- import { ROUTES, routePath } from "../xano/routes.gen.js"; // plain data, imports nothing
296
+ import { ROUTES, routePath, type RouteInputs } from "../xano/routes.gen.js"; // plain data, imports nothing
372
297
  import type { post } from "../xano/index.js"; // the model above
373
298
  import type { InferRow } from "@xano/sdk";
374
299
 
375
300
  const BASE = window.XANO_HOST ?? import.meta.env.VITE_XANO_HOST; // deploy injects it; .env.local in dev
376
301
 
302
+ type NewPost = RouteInputs["POST posts"]; // { title: string; body?: string }
377
303
  type Post = InferRow<typeof post>; // { id: number; created_at: number; title: string; … }
378
304
 
379
- async function fetchPosts(): Promise<Post[]> {
380
- const res = await fetch(BASE + routePath("GET list_posts"), { method: ROUTES["GET list_posts"].verb });
305
+ async function createPost(body: NewPost): Promise<Post> {
306
+ const res = await fetch(BASE + routePath("POST posts"), {
307
+ method: ROUTES["POST posts"].verb, headers: { "content-type": "application/json" }, body: JSON.stringify(body),
308
+ });
381
309
  return res.json(); // typed end to end
382
310
  }
383
311
  ```
384
312
 
385
313
  - **`routePath("GET blog/{slug}", { slug })`** → the endpoint path, resolved from your code
386
- (or the frozen `xano.lock`). Keys are `"<VERB> <name>"`, so verb-differentiated siblings
387
- coexist (a pair two api groups share is keyed `"<group>:<VERB> <name>"`), and the keys and their `{param}` names are checked at compile time: a backend
388
- rename is a compile error rather than a 404.
389
- - **`ROUTES[key].verb`** → the HTTP method, as a literal.
390
- - **`InferInput<typeof someQuery>`** → the request-payload type, derived from a query's
391
- `input` map at compile time. Required inputs are required keys, enums literal unions, and
392
- a nullable field (explicit or by type default) adds `| null`. **No codegen, always in sync.**
393
- - **`InferRow<typeof post>`** → the table's row type. Rename or retype a column and every
394
- consumer breaks at compile time — exactly where you want it.
395
- - **`InferResponse<typeof someQuery>`** → the endpoint's **response** type, closing the round
396
- trip. It auto-derives the common shapes with no codegen, mirroring the static walk the
397
- engine itself does, and degrades to `unknown` in exactly the cases the engine cannot
398
- resolve either — declare `responseShape` there. A `db.get` row types as `Row | null`
399
- until `guard.found("row")` asserts it exists (404 otherwise), which narrows it to `Row`.
400
-
401
- Import defs into a frontend with `import type` only. A def imported as a value, for its
402
- `getPath()`/`verb`, runs its factory calls at module load and carries the SDK runtime and
403
- the backend graph it references into the bundle. The measured bundle
404
- numbers, the full response-inference rules, endpoint-name constraints, and the realtime
405
- helpers are in
406
- [The typed frontend surface](https://github.com/xanots/sdk/blob/main/guides/typed-frontend.md).
314
+ (or the frozen `xano.lock`). Keys are `"<VERB> <name>"` and are checked at compile time,
315
+ `{param}` names included: a backend rename is a compile error rather than a 404.
316
+ - **`RouteInputs["POST posts"]`** → the request-payload type, under the same keys
317
+ (`ChannelInputs`/`MessageInputs` for realtime); `InferInput<typeof q>` is the def-side twin.
318
+ - **`InferRow<typeof post>`** / **`InferResponse<typeof someQuery>`** → the table's row type
319
+ and the endpoint's response type, closing the round trip. Rename or retype a column and
320
+ every consumer breaks at compile time — exactly where you want it.
321
+ - **Runtime validation:** `npx xanosdk marketplace install zod` adds zod schemas to the file,
322
+ keyed alike (`ROUTE_SCHEMAS["POST posts"].parse(body)`) and typechecked against the types.
323
+
324
+ Import defs with `import type` only: a def imported as a value carries the SDK runtime into
325
+ your bundle. Bundle numbers, inference rules, and the realtime helpers are in
326
+ [The typed frontend surface](https://github.com/xano-sdk/sdk/blob/main/guides/typed-frontend.md).
407
327
 
408
328
  ---
409
329
 
410
330
  ## Already have a Xano workspace?
411
331
 
412
332
  `--from` runs the loop the other way: it reads a workspace and writes it back out as
413
- readable Xano SDK source — real `s.db.query(...)`, `f.email()`, typed defs — not a JSON dump.
414
- And not a loose pile of files either: it is the same runnable project `xanosdk init`
415
- scaffolds, with the pulled workspace filling `xano/` instead of the starter. So a pull
416
- deploys:
333
+ readable Xano SDK source — real `s.db.query(...)`, `f.email()`, typed defs — not a JSON dump,
334
+ and inside the same runnable project `init` scaffolds. So a pull deploys:
417
335
 
418
336
  ```bash
419
337
  npx @xano/sdk init my-app --from workspace # your real workspace (the one your login is scoped to)
420
338
  cd my-app
421
- npm run build
422
- npm run xano:deploy # → a live ephemeral URL
339
+ npm run xano:deploy # → your workspace, running on your machine
423
340
  ```
424
341
 
425
- The other sources are the same flag with a different value — `--from ephemeral:<name>`, `--from local-engine:<name>`,
426
- and `--from ./ws.json` for a bundle already on disk (offline, no login). Everything else about the project is unchanged, so `--theme`, `--no-agents-md` and `--web`
427
- compose with a pull exactly as they do with a starter. For just the `xano/` tree with no project around it, `xanosdk generate <source> [--out <dir>]` also reads `release:<name>` and `tenant:<name>`.
428
-
429
342
  Object identities are preserved, so cross-references stay intact, and a statement this SDK
430
343
  does not model yet round-trips verbatim rather than breaking the pull. Then it checks its own
431
344
  work: the tree it just wrote is loaded, exported, and diffed against the workspace it came
432
345
  from, so "it compiled" and "it means the same thing" are separate claims and you get both.
433
346
 
434
- > ⚠️ **After a pull, `xano/` is your source** — edit it and commit it. A later `pull` replaces
435
- > only what a decode wrote: it refuses a dirty tree, asks before discarding your edits, and keeps
436
- > files no decode wrote. It carries schema only — no table rows or stored files — and deploying
437
- > it is a *full replace* of the target, so try a change on a disposable ephemeral first.
438
-
439
- A pull carries env var **names**, never values: the config declares each name with an empty
440
- placeholder and the values stay in the workspace (`init --from ./ws.json` on a bundle that
441
- carries values writes them to `xano/.env` for you). They belong in `xano/.env` — gitignored,
442
- preserved across a pull, and read with no flag by every command that compiles a bundle. Copy
443
- `xano/.env.example` and fill it in, or run `npx xanosdk env pull` to fetch them from a running
444
- backend; `npx xanosdk env set NAME` / `env unset NAME` change one live value without a deploy.
445
- Because a deploy *replaces* the backend's env set, a declared name with no value refuses the
446
- deploy rather than clearing the live one; CI mounts its own file and passes `--backend-env-file <path>`. The token gating a **hosted doc site** is a secret too, and goes in a second
447
- ignored file. The source declares only the gate — `documentation: { require_token: true }` on the
448
- workspace config or an `apiGroup`, and a literal `token` fails the export. `npx xanosdk pull` writes
449
- the value to `xano/.secrets.json` and every build reads it back; `npx xanosdk secrets fill` mints one
450
- for a gate you declared yourself, which has none to pull. Omitting the workspace's block leaves the
451
- target's alone, but an API group's is always sent, so omitting *that* one clears its gate — the
452
- export fails when a group publishes docs and declares a gate with no token. A merge (`deploy --to
453
- workspace`) never writes the workspace's block and says so; `--replace` does.
454
-
455
- What the generated tree looks like, how faithful the pull is, and how to read its report are
456
- in [Pulling an existing workspace](https://github.com/xanots/sdk/blob/main/guides/codegen.md).
347
+ > ⚠️ **After a pull, `xano/` is your source** — edit it and commit it. A pull carries schema
348
+ > only — no table rows or stored files — and deploying it is a *full replace* of the target,
349
+ > so try a change on the Xano Engine or a disposable ephemeral first.
350
+
351
+ The other sources (`--from ephemeral:<name>`, `--from ./ws.json`), how env var names and
352
+ values travel, the doc-site token, and how to read the decode report are in
353
+ [Pulling an existing workspace](https://github.com/xano-sdk/sdk/blob/main/guides/codegen.md).
457
354
 
458
355
  ---
459
356
 
460
- ## Reference
357
+ ## Deploying
461
358
 
462
- Every kind, statement, filter, and field type is typed, so your editor's autocomplete is
463
- the fastest lookup — tab-complete `s.`, `f.`, `c.`, `fl.`, `input.`. For the written
464
- reference, the guides carry the shape of a project and the behavior that will bite you:
359
+ Code moves through three places: the **Xano Engine** on your machine, a disposable
360
+ **ephemeral** on Xano's cloud, and your **workspace**. `deploy` reaches the first two.
361
+ Reaching anything real goes through a **release** — the stored record that this code came up
362
+ and answered: `deploy --ephemeral --test`, then `release create v1`, then `promote v1`.
465
363
 
466
- | Guide | What's in it |
364
+ | Command | Where it goes |
467
365
  |---|---|
468
- | [Project structure](https://github.com/xanots/sdk/blob/main/guides/project-structure.md) | How a `xano/` project is laid out, and why registration is explicit |
469
- | [The scaffolded project](https://github.com/xanots/sdk/blob/main/guides/scaffold.md) | What `xanosdk init` writes, the two frontend presets, theming, add-ons, SvelteKit rules |
470
- | [The marketplace](https://github.com/xanots/sdk/blob/main/guides/marketplace.md) | Finding add-ons, the two kinds of module, and the install/reinstall/remove lifecycle |
471
- | [The module contract](https://github.com/xanots/sdk/blob/main/guides/module-contract.md) | Building an add-on: the manifest fields, the plugin types, every hook, and what is refused |
472
- | [Object kinds](https://github.com/xanots/sdk/blob/main/guides/object-kinds.md) | Every authorable kind, and splitting a workspace across microservices |
473
- | [Authoring reference](https://github.com/xanots/sdk/blob/main/guides/authoring.md) | Tables and fields, statements, values, inputs, middleware, seed data |
474
- | [CLI](https://github.com/xanots/sdk/blob/main/guides/cli.md) | Every command, shell completion, and what failures look like |
475
- | [Warning and error codes](https://github.com/xanots/sdk/blob/main/guides/codes.md) | Every code the CLI and the build emit, with what it means |
476
- | [Signing in & deploying](https://github.com/xanots/sdk/blob/main/guides/deploying.md) | Auth, ephemerals, `--static`, releasing to production, `xanosdk preflight` |
477
- | [Environment & identity](https://github.com/xanots/sdk/blob/main/guides/environment.md) | Every environment variable, and how `xano.lock` pins identity |
478
- | [The typed frontend surface](https://github.com/xanots/sdk/blob/main/guides/typed-frontend.md) | Path resolution, input/response inference, bundle cost, the route manifest |
479
- | [Pulling an existing workspace](https://github.com/xanots/sdk/blob/main/guides/codegen.md) | What `xanosdk init --from` writes, how faithful it is, and how to read its report |
480
- | [Coverage & agent grounding](https://github.com/xanots/sdk/blob/main/guides/coverage.md) | What is covered, what is out of scope, and the files agents read |
481
-
482
- ### Reading a compiled bundle
483
-
484
- `@xano/sdk` writes a bundle; `@xano/sdk/bundle` reads one back. It is the surface for
485
- tools that take compiled JSON as input — a graph view, a diff, a linter, a docs generator —
486
- so none of them has to reverse-engineer the storage shape and then go quietly wrong when the
487
- engine grows a new one.
366
+ | `xanosdk deploy` | The **Xano Engine** on this machine — the default. No network round-trip per deploy, and no Xano account needed. The first run downloads the engine and pins its version in `package.json` ([details](#xano-on-your-machine)). |
367
+ | `xanosdk deploy --ephemeral` | A disposable **ephemeral** on Xano's cloud — create-or-refreshed each run, auto-expiring, with its own URL. |
368
+ | `xanosdk promote <release>` | Your **main Xano instance** workspace — the production target. Lands a release on a branch named for it, reads the branch back, and fails naming anything the release declared that did not arrive. `--set-live` serves it once that check passes. |
369
+ | `xanosdk tenant deploy <tenant> <release>` | A **customer tenant** — the same release, on someone else's deployment. It **replaces** what the tenant serves; static hosting is kept. |
370
+ | `xanosdk release transfer <release> --to-profile <profile>` | **Another workspace or instance** — copies the stored release, checked by content hash, to `promote` there. |
371
+ | `xanosdk deploy --to <dest>` | The **escape hatch**: merges a local build straight into `workspace` or `tenant:<name>`, skipping the release record. |
372
+ | `xanosdk publish <dir>` | **Just the frontend**: an already-built directory onto the Xano Engine or ephemeral you last deployed to, `workspace`, or `tenant:<name>` — the retry when a frontend fails after its backend landed. |
488
373
 
489
- ```ts
490
- import { readFile } from "node:fs/promises";
491
- import { statementCatalog, walk } from "@xano/sdk/bundle";
374
+ Every `deploy` is a **full replace** of the disposable environment, table records included,
375
+ unless `--keep-data` merges. Promoting is the opposite by design: it changes what your code
376
+ defines and keeps every row. Tables are shared by every branch, so a release that alters one
377
+ is refused without `--allow-shared-schema-changes`. `--branch <label>` lands on a non-live
378
+ branch and `--set-live` promotes it, while `--backup-branch` snapshots live's logic, not its shared tables,
379
+ for a one-`set-live` rollback. A release name is refused rather than resolved when it already exists.
492
380
 
493
- const bundle = JSON.parse(await readFile("bundle.json", "utf8"));
494
- const catalog = statementCatalog();
381
+ `xanosdk status` answers where you stand in one read — who you are signed in as, which
382
+ instance and workspace, and the backend this project last deployed to. Every flag, the
383
+ identity model, `--json` and exit codes, and headless CI runs are in
384
+ [Signing in & deploying](https://github.com/xano-sdk/sdk/blob/main/guides/deploying.md).
495
385
 
496
- for (const { raw, path, depth } of walk(bundle.payload.query[0].run)) {
497
- console.log(`${" ".repeat(depth)}${path} ${catalog.get(raw.name)?.sPath ?? raw.name}`);
498
- }
499
- // 0 db.query
500
- // 1 conditional
501
- // 1.if.0 db.add
386
+ ### Testing
387
+
388
+ The tests you author — a `tests` entry on a query, function, or middleware, or a standalone
389
+ `workflowTest()` — run against a deployed environment:
390
+
391
+ ```bash
392
+ npx xanosdk test run-all # the Xano Engine or ephemeral you last deployed to
393
+ npx xanosdk test run-all --on workspace # or your real workspace
502
394
  ```
503
395
 
504
- - **`walk(run)`** → every statement in the tree, each with a `path` and a `depth`. The path
505
- format (`2.if.0`) is the shared address: a lint finding, a review comment and a runtime
506
- error written by three different tools all name the same node.
507
- - **`subStacks(raw)`** → the nested stacks a statement carries, keyed by where they are
508
- stored and labelled by what they mean — a try/catch and a conditional share the same three
509
- storage keys. Found by shape, so a nesting form added later is still walked.
510
- - **`statementCatalog()`** → the stored `mvp:*` name to its authoring path, minus the
511
- namespace (`mvp:dbo_view` → `db.query`, the `sPath` you write after `s.`) — which is
512
- the point: the stored name is often not the one you'd guess.
513
- - **`structuralHash(raw)`** → a diff key for a statement and everything under it, with
514
- engine-filled operands excluded — so adding a column to a table leaves `db.edit` /
515
- `db.add_or_edit` unchanged. A `db.add` writes every column, so its hash does change.
516
- - **`tableRefOf(column)` / `linkedTableOf(column)`** → the table a column points at.
517
- - **`normalize(value)`** → the normalizer `xanosdk preflight` compares with, for diffing a
518
- stored workspace against a compiled one.
519
-
520
- Everything on the entry is pure — no filesystem, network, or Node built-ins — so it runs anywhere.
521
-
522
- The package also ships two machine-readable descriptions of the same surface, generated from the SDK's
523
- own sources so they cannot drift from it: `llms.txt` (the router — the mental model and the gotchas, plus a
524
- map of the `llms/*.md` topic files) and `manifest.json` (per-entry detail: field schemas, filter arguments,
525
- stored names; its `cli` array plus `version` is the [compatibility contract](https://github.com/xanots/sdk/blob/main/guides/cli.md#checking-what-an-installed-sdk-can-do) for tools that drive the CLI).
396
+ A failing suite exits **5**, distinct from a crash, so CI can tell the two apart. To deploy
397
+ and prove it in one step, `xanosdk deploy ./xano/index.ts --test`. A test's `datasource` is
398
+ stored on the test and cloned before every run, so read
399
+ [Object kinds](https://github.com/xano-sdk/sdk/blob/main/guides/object-kinds.md) before
400
+ pointing one at your real workspace.
401
+
402
+ ---
403
+
404
+ ## Reference
405
+
406
+ Every kind, statement, filter, and field type is typed, so your editor's autocomplete is
407
+ the fastest lookup — tab-complete `s.`, `f.`, `c.`, `fl.`, `input.`. For the written
408
+ reference, the guides carry the shape of a project and the behavior that will bite you:
409
+
410
+ | Guide | What's in it |
411
+ |---|---|
412
+ | [Project structure](https://github.com/xano-sdk/sdk/blob/main/guides/project-structure.md) | How a `xano/` project is laid out, why registration is explicit, wiring one by hand |
413
+ | [The scaffolded project](https://github.com/xano-sdk/sdk/blob/main/guides/scaffold.md) | What `xanosdk init` writes, the two frontend presets, theming, add-ons, SvelteKit rules |
414
+ | [The marketplace](https://github.com/xano-sdk/sdk/blob/main/guides/marketplace.md) | Finding add-ons, the two kinds of module, and the install/reinstall/remove lifecycle |
415
+ | [The module contract](https://github.com/xano-sdk/sdk/blob/main/guides/module-contract.md) | Building an add-on: the manifest fields, the plugin types, every hook, and what is refused |
416
+ | [Object kinds](https://github.com/xano-sdk/sdk/blob/main/guides/object-kinds.md) | Every authorable kind, and splitting a workspace across microservices |
417
+ | [Authoring reference](https://github.com/xano-sdk/sdk/blob/main/guides/authoring.md) | Tables and fields, statements, values, inputs, middleware, seed data |
418
+ | [CLI](https://github.com/xano-sdk/sdk/blob/main/guides/cli.md) | Every command, shell completion, and what failures look like |
419
+ | [Warning and error codes](https://github.com/xano-sdk/sdk/blob/main/guides/codes.md) | Every code the CLI and the build emit, with what it means |
420
+ | [Signing in & deploying](https://github.com/xano-sdk/sdk/blob/main/guides/deploying.md) | Auth, ephemerals, `--static`, releasing to production, `xanosdk preflight` |
421
+ | [Environment & identity](https://github.com/xano-sdk/sdk/blob/main/guides/environment.md) | Every environment variable, and how `xano.lock` pins identity |
422
+ | [The typed frontend surface](https://github.com/xano-sdk/sdk/blob/main/guides/typed-frontend.md) | Path resolution, input/response inference, bundle cost, the route manifest |
423
+ | [Pulling an existing workspace](https://github.com/xano-sdk/sdk/blob/main/guides/codegen.md) | What `xanosdk init --from` writes, how faithful it is, and how to read its report |
424
+ | [Reading a compiled bundle](https://github.com/xano-sdk/sdk/blob/main/guides/bundle.md) | `@xano/sdk/bundle`: walking, hashing and diffing compiled JSON from your own tools |
425
+ | [Coverage & agent grounding](https://github.com/xano-sdk/sdk/blob/main/guides/coverage.md) | What is covered, what is out of scope, and the files agents read |
426
+
427
+ The package also ships two machine-readable descriptions of the same surface, generated from
428
+ the SDK's own sources so they cannot drift from it: `llms.txt` (the router — the mental model
429
+ and the gotchas, plus a map of the `llms/*.md` topic files) and `manifest.json` (per-entry
430
+ detail: field schemas, filter arguments, stored names; its `cli` array plus `version` is the
431
+ [compatibility contract](https://github.com/xano-sdk/sdk/blob/main/guides/cli.md#checking-what-an-installed-sdk-can-do)
432
+ for tools that drive the CLI).
526
433
 
527
434
  ---
528
435
 
529
436
  <div align="center">
530
437
 
531
- **Write TypeScript. Run `xanosdk deploy`. See it live.**
438
+ **Write TypeScript. Run it on the Xano Engine. Ship it to Xano's cloud.**
532
439
 
533
440
  [npm](https://www.npmjs.com/package/@xano/sdk) ·
534
- [GitHub](https://github.com/xanots/sdk) ·
535
- [Issues](https://github.com/xanots/sdk/issues) ·
441
+ [GitHub](https://github.com/xano-sdk/sdk) ·
442
+ [Issues](https://github.com/xano-sdk/sdk/issues) ·
536
443
  [Changelog](CHANGELOG.md) ·
537
444
  [`llms.txt`](llms.txt) — the agent-facing router, mapping the `llms/` topic files
538
445
 
539
- Xano SDK is the official TypeScript SDK for [Xano](https://xano.com). MIT licensed.
446
+ Xano SDK is the official TypeScript SDK for [Xano](https://xano.com) —
447
+ [docs](https://docs.xano.com) · [community](https://community.xano.com). MIT licensed.
540
448
 
541
449
  </div>