@xano/sdk 1.0.0

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 (336) hide show
  1. package/CHANGELOG.md +788 -0
  2. package/LICENSE +21 -0
  3. package/README.md +541 -0
  4. package/dist/.build-fingerprint +1 -0
  5. package/dist/agent-file-refresh-ZEMK33AX.js +38 -0
  6. package/dist/answer-shape-K67TAAPY.js +33 -0
  7. package/dist/backend-dir-2U53CIAL.js +39 -0
  8. package/dist/backend-slot-7QXW2QYC.js +28 -0
  9. package/dist/bin.d.ts +1 -0
  10. package/dist/bin.js +255 -0
  11. package/dist/branch-NCRNWQBQ.js +61 -0
  12. package/dist/branch-commands-ACIRCEQJ.js +79 -0
  13. package/dist/bundle.d.ts +223 -0
  14. package/dist/bundle.js +153 -0
  15. package/dist/capture-WAXPD7DR.js +41 -0
  16. package/dist/chunk-27GWNP2I.js +23 -0
  17. package/dist/chunk-2CMJZDCL.js +177 -0
  18. package/dist/chunk-2EZ3ZJZZ.js +302 -0
  19. package/dist/chunk-2GNFDZA2.js +390 -0
  20. package/dist/chunk-2MNLRIOX.js +11 -0
  21. package/dist/chunk-2TFRR6JV.js +104 -0
  22. package/dist/chunk-2ZUEE4EK.js +408 -0
  23. package/dist/chunk-36JUQZVQ.js +22 -0
  24. package/dist/chunk-3DRXWLJ5.js +83 -0
  25. package/dist/chunk-3JDU4VRL.js +137 -0
  26. package/dist/chunk-3KZCLN4Z.js +241 -0
  27. package/dist/chunk-3LDULPRE.js +168 -0
  28. package/dist/chunk-3M4LFYNQ.js +111 -0
  29. package/dist/chunk-3XI5CTUE.js +22 -0
  30. package/dist/chunk-3YW23UFH.js +50 -0
  31. package/dist/chunk-45UIT5T2.js +862 -0
  32. package/dist/chunk-4BW2SG2N.js +46 -0
  33. package/dist/chunk-4KHEMC32.js +79 -0
  34. package/dist/chunk-4POWHT2K.js +321 -0
  35. package/dist/chunk-4Q2GN7NW.js +192 -0
  36. package/dist/chunk-5A2PLKZB.js +70 -0
  37. package/dist/chunk-5FBYXK5P.js +159 -0
  38. package/dist/chunk-5HVXPTU4.js +323 -0
  39. package/dist/chunk-5QU2P5CA.js +304 -0
  40. package/dist/chunk-5V5XU32D.js +191 -0
  41. package/dist/chunk-5ZSO4T2G.js +10 -0
  42. package/dist/chunk-622HUCZT.js +10 -0
  43. package/dist/chunk-65HWOMGV.js +177 -0
  44. package/dist/chunk-6ELFRN3P.js +365 -0
  45. package/dist/chunk-6HO3NCSJ.js +1055 -0
  46. package/dist/chunk-6IUMKYWI.js +457 -0
  47. package/dist/chunk-6KEB3C3U.js +65 -0
  48. package/dist/chunk-6MR5TI5V.js +987 -0
  49. package/dist/chunk-6NNTNXN7.js +157 -0
  50. package/dist/chunk-6PBR37LN.js +97 -0
  51. package/dist/chunk-6QXLMMT3.js +155 -0
  52. package/dist/chunk-6ZGJCBZS.js +224 -0
  53. package/dist/chunk-73IVBKMA.js +250 -0
  54. package/dist/chunk-7G3CTU7I.js +286 -0
  55. package/dist/chunk-A3UDOZB6.js +222 -0
  56. package/dist/chunk-A6E77GDW.js +85 -0
  57. package/dist/chunk-AHJWCYQO.js +660 -0
  58. package/dist/chunk-AKNCFVKZ.js +36 -0
  59. package/dist/chunk-AM4FKL4J.js +237 -0
  60. package/dist/chunk-AN6BL47T.js +26 -0
  61. package/dist/chunk-AOSYVMUS.js +147 -0
  62. package/dist/chunk-APWXY5SL.js +182 -0
  63. package/dist/chunk-AWEIIR2U.js +218 -0
  64. package/dist/chunk-AWQ7BQTQ.js +73 -0
  65. package/dist/chunk-BAUZOWGX.js +393 -0
  66. package/dist/chunk-BHACRS6R.js +940 -0
  67. package/dist/chunk-BWPNT55T.js +680 -0
  68. package/dist/chunk-C6RIMRU4.js +187 -0
  69. package/dist/chunk-CGVQZXYG.js +263 -0
  70. package/dist/chunk-CIMQZRRE.js +162 -0
  71. package/dist/chunk-CJHQKJU4.js +113 -0
  72. package/dist/chunk-CTMO46PK.js +1897 -0
  73. package/dist/chunk-D53J55C5.js +106 -0
  74. package/dist/chunk-D7VGG3WS.js +90 -0
  75. package/dist/chunk-DAD3ONIS.js +245 -0
  76. package/dist/chunk-DGWHAVRG.js +162 -0
  77. package/dist/chunk-DX4QR4B2.js +483 -0
  78. package/dist/chunk-EHP3WPEG.js +21 -0
  79. package/dist/chunk-ELP2HMXC.js +432 -0
  80. package/dist/chunk-ERVIASGL.js +21 -0
  81. package/dist/chunk-ET4Y4XCB.js +865 -0
  82. package/dist/chunk-ETO6LGLD.js +4750 -0
  83. package/dist/chunk-EUUUMY7J.js +24 -0
  84. package/dist/chunk-FQJ2TTHP.js +218 -0
  85. package/dist/chunk-FQOF7E2E.js +133 -0
  86. package/dist/chunk-FWD7AL6N.js +21 -0
  87. package/dist/chunk-FXFV3KU6.js +138 -0
  88. package/dist/chunk-FXRQOWTE.js +171 -0
  89. package/dist/chunk-G554NZNI.js +210 -0
  90. package/dist/chunk-GSGDWJB5.js +13 -0
  91. package/dist/chunk-H2V3N23D.js +66 -0
  92. package/dist/chunk-H5C7MBCR.js +159 -0
  93. package/dist/chunk-HHN734BU.js +371 -0
  94. package/dist/chunk-HRVBLCVJ.js +243 -0
  95. package/dist/chunk-HVRUQXGD.js +1264 -0
  96. package/dist/chunk-I4F5TCJH.js +130 -0
  97. package/dist/chunk-IDOTCMDV.js +57 -0
  98. package/dist/chunk-IGOLHKWF.js +427 -0
  99. package/dist/chunk-JGE7CAWB.js +148 -0
  100. package/dist/chunk-JTUKLCXS.js +92 -0
  101. package/dist/chunk-JZGVVJSI.js +66 -0
  102. package/dist/chunk-K4WX6UUU.js +923 -0
  103. package/dist/chunk-K5BBGTYZ.js +217 -0
  104. package/dist/chunk-K6RXBGUB.js +427 -0
  105. package/dist/chunk-KTSDSD36.js +165 -0
  106. package/dist/chunk-L5JYN3NM.js +1038 -0
  107. package/dist/chunk-LIEOKXKD.js +354 -0
  108. package/dist/chunk-LLNZGEFK.js +51 -0
  109. package/dist/chunk-LPECSJ2J.js +55 -0
  110. package/dist/chunk-LQCMKAJ7.js +413 -0
  111. package/dist/chunk-LRN4ZJCQ.js +1145 -0
  112. package/dist/chunk-MJ4ZVHKN.js +17 -0
  113. package/dist/chunk-MXHSQOC4.js +3061 -0
  114. package/dist/chunk-N5GKCWE5.js +367 -0
  115. package/dist/chunk-NA3PXMEF.js +10 -0
  116. package/dist/chunk-NAQDMEHV.js +76 -0
  117. package/dist/chunk-NWKXM5RD.js +109 -0
  118. package/dist/chunk-NZOWWHU5.js +196 -0
  119. package/dist/chunk-OHX6MIUZ.js +184 -0
  120. package/dist/chunk-OOXWYAA4.js +15 -0
  121. package/dist/chunk-OPHB5ORL.js +1990 -0
  122. package/dist/chunk-OXA6PSZT.js +1725 -0
  123. package/dist/chunk-P2HAGF6H.js +73 -0
  124. package/dist/chunk-PTHVMXZI.js +3036 -0
  125. package/dist/chunk-PZ5AY32C.js +10 -0
  126. package/dist/chunk-Q325JKYB.js +189 -0
  127. package/dist/chunk-Q7DGTQ5G.js +255 -0
  128. package/dist/chunk-QCNYHBL7.js +601 -0
  129. package/dist/chunk-QO6BVGS5.js +145 -0
  130. package/dist/chunk-QXTKSOFI.js +76 -0
  131. package/dist/chunk-ROY4YAEQ.js +66 -0
  132. package/dist/chunk-RTJRZFFY.js +447 -0
  133. package/dist/chunk-SAVJUS2X.js +128 -0
  134. package/dist/chunk-SFLHVCKX.js +173 -0
  135. package/dist/chunk-STSFNCY4.js +127 -0
  136. package/dist/chunk-SWBF2LTK.js +170 -0
  137. package/dist/chunk-T5KELPAR.js +109 -0
  138. package/dist/chunk-TFFGOFVZ.js +1481 -0
  139. package/dist/chunk-TLHIFK4M.js +256 -0
  140. package/dist/chunk-TLQE7ZN3.js +156 -0
  141. package/dist/chunk-TPHWJ7UG.js +1981 -0
  142. package/dist/chunk-TRJCALW3.js +291 -0
  143. package/dist/chunk-TTEIYD5P.js +133 -0
  144. package/dist/chunk-U64O2MXY.js +407 -0
  145. package/dist/chunk-UCQ2VUTG.js +630 -0
  146. package/dist/chunk-UTI5G6OJ.js +44 -0
  147. package/dist/chunk-UVHDMMIP.js +188 -0
  148. package/dist/chunk-UZ6QQWJT.js +120 -0
  149. package/dist/chunk-VAX3UZOY.js +686 -0
  150. package/dist/chunk-W3HBUKFO.js +57 -0
  151. package/dist/chunk-WKQLGKCL.js +2823 -0
  152. package/dist/chunk-WQFNASK4.js +560 -0
  153. package/dist/chunk-WRBKLYSJ.js +224 -0
  154. package/dist/chunk-WTPZRR4I.js +17 -0
  155. package/dist/chunk-WZDJ2LLX.js +2385 -0
  156. package/dist/chunk-X2NL4KUO.js +14 -0
  157. package/dist/chunk-X4DVXBFY.js +38 -0
  158. package/dist/chunk-X677DMZM.js +7050 -0
  159. package/dist/chunk-XBKMWY7F.js +612 -0
  160. package/dist/chunk-XNCP4KYO.js +78 -0
  161. package/dist/chunk-XVBGLISP.js +35 -0
  162. package/dist/chunk-XW6KISBB.js +1192 -0
  163. package/dist/chunk-YGZHHAAB.js +8156 -0
  164. package/dist/chunk-YHEFQUQB.js +186 -0
  165. package/dist/chunk-YLDALTWZ.js +653 -0
  166. package/dist/chunk-YU4HSQW7.js +229 -0
  167. package/dist/chunk-ZDPP6RKB.js +27 -0
  168. package/dist/chunk-ZFDZKNGG.js +194 -0
  169. package/dist/chunk-ZIY7RNUT.js +49 -0
  170. package/dist/chunk-ZYJP6BOO.js +30 -0
  171. package/dist/cli.d.ts +1111 -0
  172. package/dist/cli.js +165 -0
  173. package/dist/codegen-command-VR2GWR6C.js +173 -0
  174. package/dist/codegen.d.ts +115 -0
  175. package/dist/codegen.js +19 -0
  176. package/dist/commands-GJMJ4XYZ.js +76 -0
  177. package/dist/completion-ZQLO6PB6.js +738 -0
  178. package/dist/config-MBYGCAFK.js +136 -0
  179. package/dist/deploy-command-JVZPWHMK.js +180 -0
  180. package/dist/deploy-source-3W45CXMP.js +81 -0
  181. package/dist/dev-env-sync-HN44K4D5.js +188 -0
  182. package/dist/diagnostics-UEAAHWVF.js +30 -0
  183. package/dist/display-name-hint-ABBPVQIR.js +46 -0
  184. package/dist/emit-CyhBDxli.d.ts +7007 -0
  185. package/dist/env-example-refresh-ET5HMMDW.js +126 -0
  186. package/dist/env-pull-command-TNMNB3CV.js +323 -0
  187. package/dist/env-target-O4HRKTGZ.js +40 -0
  188. package/dist/env-var-command-ZIRDCAZA.js +427 -0
  189. package/dist/ephemeral-P7F3PMAD.js +54 -0
  190. package/dist/ephemeral-command-CLJJKOFT.js +592 -0
  191. package/dist/ephemeral-state-PYCBSOGX.js +61 -0
  192. package/dist/file-lock-PT74GWYW.js +10 -0
  193. package/dist/generate-command-AYEOLA26.js +510 -0
  194. package/dist/gitignore-3SJ3WNRG.js +51 -0
  195. package/dist/guards-4EBNCZDC.js +162 -0
  196. package/dist/hosted-file-PSHJB3HX.js +28 -0
  197. package/dist/impersonate-command-5JAS3WSV.js +152 -0
  198. package/dist/import-EQSFU6JC.js +19 -0
  199. package/dist/index.d.ts +5470 -0
  200. package/dist/index.js +371 -0
  201. package/dist/init-command-X2FR4UAK.js +125 -0
  202. package/dist/init-modules-RY7UHAOL.js +50 -0
  203. package/dist/init-web-M4YZSZK6.js +42 -0
  204. package/dist/internal.d.ts +179 -0
  205. package/dist/internal.js +2634 -0
  206. package/dist/io-RC56QSN5.js +26 -0
  207. package/dist/keep-data-merge-7MPLVAVI.js +1119 -0
  208. package/dist/lambda-config-reconcile-OUZ4OYAB.js +116 -0
  209. package/dist/landed-753YLJ5H.js +40 -0
  210. package/dist/landing-record-SU52SKXU.js +61 -0
  211. package/dist/live-diff-YONW2VI3.js +65 -0
  212. package/dist/local-engine-choice-CH5X3W7E.js +79 -0
  213. package/dist/local-engine-command-Z3OL7VOD.js +766 -0
  214. package/dist/local-engine-config-5U3SC434.js +39 -0
  215. package/dist/local-engine-deploy-PCQ4SNPB.js +39 -0
  216. package/dist/local-engine-process-EHTE5LLU.js +63 -0
  217. package/dist/local-engine-state-A4FTRFAF.js +32 -0
  218. package/dist/local-engine-update-check-6L645VBL.js +162 -0
  219. package/dist/lock-MRRHW5GS.js +87 -0
  220. package/dist/lock-commands-2QG25HL7.js +963 -0
  221. package/dist/login-command-QPYRWOXZ.js +538 -0
  222. package/dist/logout-command-WOIQLDP6.js +56 -0
  223. package/dist/loop-ALIZLOSX.js +191 -0
  224. package/dist/marketplace-command-K5YL42NO.js +977 -0
  225. package/dist/marketplace-resolve-LY32JES5.js +40 -0
  226. package/dist/meta-client-YXGPW53C.js +244 -0
  227. package/dist/module-manifest-JFGHU2TC.js +38 -0
  228. package/dist/near-key.d.ts +13 -0
  229. package/dist/near-key.js +8 -0
  230. package/dist/node.d.ts +95 -0
  231. package/dist/node.js +969 -0
  232. package/dist/operation-outcome-TZSESNC7.js +51 -0
  233. package/dist/output-target-AL3I44GG.js +47 -0
  234. package/dist/package-manager-PRAHUSCN.js +34 -0
  235. package/dist/plan-disclosure-6G4MLZKD.js +114 -0
  236. package/dist/plugin-contributions-WRNY5ABG.js +28 -0
  237. package/dist/plugin-prompt-4VA3B4FF.js +20 -0
  238. package/dist/plugin-questions-JTSYA74Q.js +24 -0
  239. package/dist/plugin.d.ts +396 -0
  240. package/dist/plugin.js +1 -0
  241. package/dist/preflight-command-2T5Z36MI.js +321 -0
  242. package/dist/profile-command-AH3PIM4X.js +800 -0
  243. package/dist/profile-pointer-GRWJU3YD.js +31 -0
  244. package/dist/profile-select-74TRDEPD.js +23 -0
  245. package/dist/project-dependency-KSH63ODT.js +35 -0
  246. package/dist/project-sdk-REPPOIBD.js +24 -0
  247. package/dist/promote-command-PCWT5N6S.js +140 -0
  248. package/dist/prompt-II3F3LND.js +27 -0
  249. package/dist/publish-command-TTDUUJI5.js +414 -0
  250. package/dist/pull-command-VBO7C4S3.js +161 -0
  251. package/dist/pull-superseded-GJWLG7XO.js +20 -0
  252. package/dist/release-command-N4ZPKMHR.js +146 -0
  253. package/dist/release-ns-command-3KFDMZ6G.js +1745 -0
  254. package/dist/response-HlXahv4K.d.ts +925 -0
  255. package/dist/retry-command-AS5EVREX.js +34 -0
  256. package/dist/routes-manifest-SNWUVBT6.js +43 -0
  257. package/dist/runtime-XETHVF33.js +14 -0
  258. package/dist/scaffold.d.ts +1911 -0
  259. package/dist/scaffold.js +107 -0
  260. package/dist/secrets-file-LVZD6IIM.js +56 -0
  261. package/dist/secrets-fill-command-TTCPSVXN.js +218 -0
  262. package/dist/seed-VU7C3QYS.js +46 -0
  263. package/dist/sent-writes-N7X4OVXT.js +22 -0
  264. package/dist/source-resolve-S2XA3XZF.js +83 -0
  265. package/dist/static-host-B2Y6AG3W.js +352 -0
  266. package/dist/status-command-RUDXTF7I.js +554 -0
  267. package/dist/store-6VNCD4D7.js +20 -0
  268. package/dist/store-ARM6VMO5.js +98 -0
  269. package/dist/store-DuYfzKlW.d.ts +3144 -0
  270. package/dist/suggest-6FOOYKHG.js +12 -0
  271. package/dist/sveltekit.d.ts +154 -0
  272. package/dist/sveltekit.js +109 -0
  273. package/dist/sync-contributions-UCEROO26.js +415 -0
  274. package/dist/table-ENAVMITR.js +42 -0
  275. package/dist/tables-command-GUPXXSB5.js +156 -0
  276. package/dist/tenant-IIHPOHGP.js +42 -0
  277. package/dist/tenant-command-D5HGI2X4.js +965 -0
  278. package/dist/test-command-TIKZMDPZ.js +476 -0
  279. package/dist/tests-BGGIOK3L.js +26 -0
  280. package/dist/token-NICJUTMT.js +72 -0
  281. package/dist/toolchain-hooks-GHKLUJOH.js +96 -0
  282. package/dist/toolchain-modules-5EAZUONB.js +24 -0
  283. package/dist/tracked-backend-EIBUMDZA.js +80 -0
  284. package/dist/update-check-2W2NLDTC.js +136 -0
  285. package/dist/upgrade-command-QHNFWM7O.js +531 -0
  286. package/dist/verify-rollout-DRCK5TDD.js +61 -0
  287. package/dist/whoami-command-STGINTXH.js +51 -0
  288. package/dist/workspace-2CLHU2LK.js +93 -0
  289. package/dist/workspace-binding-56PIIPCP.js +54 -0
  290. package/dist/workspace-command-JEXQETJD.js +535 -0
  291. package/dist/workspace-env-F2RFMSC5.js +70 -0
  292. package/dist/workspace-export-OJSH2HIW.js +21 -0
  293. package/dist/writable-VA7OISSK.js +25 -0
  294. package/dist/xano-ICFUSPFR.js +42 -0
  295. package/dist/xanosdk-import-GN42TO2B.js +56 -0
  296. package/dist/xanosdk-project-S6DXJONQ.js +41 -0
  297. package/dist/xdo-CxDr2Q1C.d.ts +1371 -0
  298. package/guides/README.md +33 -0
  299. package/guides/authoring.md +921 -0
  300. package/guides/cli.md +401 -0
  301. package/guides/codegen.md +177 -0
  302. package/guides/codes.md +404 -0
  303. package/guides/coverage.md +74 -0
  304. package/guides/deploying.md +1525 -0
  305. package/guides/environment.md +400 -0
  306. package/guides/marketplace.md +415 -0
  307. package/guides/module-contract.md +558 -0
  308. package/guides/object-kinds.md +433 -0
  309. package/guides/project-structure.md +43 -0
  310. package/guides/scaffold.md +351 -0
  311. package/guides/typed-frontend.md +242 -0
  312. package/llms/client.md +63 -0
  313. package/llms/errors.md +56 -0
  314. package/llms/fields.md +176 -0
  315. package/llms/filters.md +183 -0
  316. package/llms/kinds-agent-mcp.md +30 -0
  317. package/llms/kinds-core.md +100 -0
  318. package/llms/kinds-knowledge.md +20 -0
  319. package/llms/kinds-realtime.md +76 -0
  320. package/llms/lambda.md +94 -0
  321. package/llms/legacy.md +44 -0
  322. package/llms/lock.md +40 -0
  323. package/llms/object-kinds.md +34 -0
  324. package/llms/statements-calls.md +62 -0
  325. package/llms/statements-catalog.md +320 -0
  326. package/llms/statements-data.md +66 -0
  327. package/llms/statements-runtime.md +68 -0
  328. package/llms/tests.md +59 -0
  329. package/llms/toolchain.md +16 -0
  330. package/llms/triggers.md +36 -0
  331. package/llms/values.md +29 -0
  332. package/llms-full.txt +2085 -0
  333. package/llms.txt +493 -0
  334. package/manifest.json +11224 -0
  335. package/package.json +162 -0
  336. package/types/lambda-globals.d.ts +129 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,788 @@
1
+ # Changelog
2
+
3
+ All notable changes to [`@xanosdk/sdk`](https://www.npmjs.com/package/@xanosdk/sdk).
4
+
5
+ This file is **generated** from the [GitHub releases](https://github.com/xanots/sdk/releases)
6
+ by `npm run changelog` — edit the release, not this file. Each entry summarizes
7
+ one release and links to its full notes.
8
+
9
+ Versions before 0.0.1 belong to the retired `@xanosdk/core` line and are not
10
+ listed here.
11
+
12
+ ---
13
+
14
+ ## 0.0.52 — Static frontends and server rendering on a local engine
15
+
16
+ _2026-09-30_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.52)
17
+
18
+ `xanosdk deploy --local-engine` can now publish a frontend with `--static`, and a new SvelteKit adapter builds sites whose server routes a local engine renders.
19
+
20
+ - `deploy --local-engine --static` publishes the frontend
21
+ - `@xanosdk/sdk/sveltekit`: server rendering on a local engine
22
+
23
+ ---
24
+
25
+ ## 0.0.51 — Prompts and resources for MCP triggers
26
+
27
+ _2026-09-30_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.51)
28
+
29
+ MCP server triggers can now see and narrow the prompts and resources their server lists. `export()` also warns when a function call leaves out an input the function declares, and `xanosdk upgrade` installs the version it reports.
30
+
31
+ - ⚠️ MCP server triggers receive `prompts` and `resources`
32
+ - `s.function.run` warns when it leaves out a declared input
33
+ - `xanosdk upgrade` installs the version it reports
34
+
35
+ ---
36
+
37
+ ## 0.0.50 — Full test and marketplace detail in --json
38
+
39
+ _2026-09-30_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.50)
40
+
41
+ This release puts the full detail into three `--json` outputs that used to trim it. `test run` reports every expectation of a failed unit test, and `marketplace list` and `search` return each module's whole record. A warning that `diagnostics.allow` accepts is now still reported, and an allow that no longer accepts anything warns.
42
+
43
+ - `test run --json` reports every expectation of a unit test
44
+ - `marketplace list` and `search` return each module's whole record
45
+ - A warning that `diagnostics.allow` accepts is still reported
46
+ - An allow that accepts nothing warns `diagnostics.allow-unused`
47
+
48
+ ---
49
+
50
+ ## 0.0.49 — Repo-hosted files for MCP and seeds
51
+
52
+ _2026-09-30_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.49)
53
+
54
+ This release adds `hostedFile()`, which points an MCP icon or a seeded file column at a file in your repo. The file ships with every deploy and is served by each backend at its own address. It also widens per-def `diagnostics.allow` to accept any warning raised about that def, and gives a refused credential its own `--json` error code.
55
+
56
+ - `hostedFile()` ships repo files for MCP icons and seeded file columns
57
+ - `diagnostics.allow` accepts any warning raised about the def
58
+ - Attached middleware with `input` warns again when it is also called
59
+ - A refused credential is `SDK_CREDENTIAL_REJECTED` in `--json`
60
+
61
+ ---
62
+
63
+ ## 0.0.48 — MCP prompts and resources
64
+
65
+ _2026-09-29_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.48)
66
+
67
+ This release adds MCP prompts and resources as first-class kinds, alongside tool metadata and two MCP-only statements. It also fixes two CLI papercuts: one bad local engine no longer breaks every other engine's commands, and a nested backend now reads its own env and secrets files.
68
+
69
+ - MCP servers can author prompts and resources
70
+ - Tools carry MCP metadata
71
+ - `s.mcp.elicit` and `s.mcp.progress` statements
72
+ - One foreign local engine no longer breaks `--local-engine`
73
+ - A nested backend reads its own env and secrets
74
+
75
+ ---
76
+
77
+ ## 0.0.47 — A CLI hardened end to end
78
+
79
+ _2026-09-29_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.47)
80
+
81
+ This release hardens the `xanosdk` CLI end to end. Every deploy, release, tenant, lock and account command was driven by repeated live E2E passes against real instances until each printed remedy ran as printed. Exit codes, `--json` documents and warnings now follow one contract. Scripts that read exit codes or `--json` output should check the ⚠️ items below.
82
+
83
+ - ⚠️ Exit codes follow one table: usage 1, not found or unanswered 8, unknown outcome 9
84
+ - ⚠️ `--json` failures and warnings have one shape
85
+ - `xano.lock` records where each deploy landed
86
+ - Deploys refuse instead of landing blind
87
+ - `export --strict` reports every finding in one numbered list
88
+ - Declaration builds and typed responses reach further
89
+ - Documentation corrections you may have copied
90
+ - Local engine, marketplace and account polish
91
+
92
+ ---
93
+
94
+ ## 0.0.46 — Declarations for guard defs, clearer deploy help
95
+
96
+ _2026-09-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.46)
97
+
98
+ A package that publishes defs using `guard.found` or `guard.owner` can now emit its own `.d.ts`. `xanosdk deploy --help` now says which flags only work with `--to`, and a refusal that already names its fix prints that line alone instead of above the full help page.
99
+
100
+ - Defs using `guard.found` or `guard.owner` can emit declarations
101
+ - `deploy --help` marks the ten flags that need `--to`
102
+ - Refusals that name their fix no longer print the help page after them
103
+
104
+ ---
105
+
106
+ ## 0.0.45 — Race-free counters with db.increment
107
+
108
+ _2026-09-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.45)
109
+
110
+ `s.db.increment` adds a number to a numeric column on every row a `where` matches, in one atomic UPDATE, so counters, stock levels, balances and tallies no longer lose updates when two requests overlap. `db.bulk.delete` now also catches a filter that is OR-ed with an empty `and()`, which deletes every row. The CLI guide lists the commands and flags it was missing.
111
+
112
+ - `s.db.increment` updates counters without losing concurrent writes
113
+ - ⚠️ `db.bulk.delete` requires `allRows` for a filter OR-ed with an empty `and()`
114
+ - The CLI guide lists its missing commands and flags
115
+
116
+ ---
117
+
118
+ ## 0.0.44 — Found rows narrow to non-null
119
+
120
+ _2026-09-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.44)
121
+
122
+ `guard.found` proves a row exists and narrows its type, so an endpoint that returns a fetched row no longer types as `Row | null` or needs a hand-written `responseShape`. `export()` also warns on a realtime channel trigger that reads a path param with `inp()`, which used to pass `--strict` and then deny every client at runtime. Five doc gaps from a field report are fixed too.
123
+
124
+ - `guard.found` narrows a fetched row to non-null
125
+ - `inp()` of a channel path param in a channel trigger now warns
126
+ - Five doc corrections from a field report
127
+
128
+ ---
129
+
130
+ ## 0.0.43 — Scaffolds that stay lean
131
+
132
+ _2026-09-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.43)
133
+
134
+ New projects now match what shadcn's CLI writes and take every endpoint path from the generated route manifest, so an agent working in a fresh scaffold stops rewriting correct CLI output and stops pulling the backend definition into the browser bundle. `query()` also keeps the verb you declare, so a check that a def matches its route now catches a swapped verb.
135
+
136
+ - Frontends take endpoint paths from the generated route manifest
137
+ - React scaffolds use shadcn's `cn` package
138
+ - A query's `verb` is typed as the literal you declared
139
+
140
+ ---
141
+
142
+ ## 0.0.42 — One way to name a backend
143
+
144
+ _2026-09-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.42)
145
+
146
+ This release gives every CLI command one way to name a backend, and makes a local engine a backend like any other. It also adds `xanosdk generate` and `xanosdk env set` / `env unset`, and fixes two export checks and a stall when reading back large workspaces. Some flags were renamed with no alias. The first section lists them, and each old spelling fails with a message that names the new one.
147
+
148
+ - ⚠️ Every command names a backend the same way, local engine included
149
+ - `xanosdk env set` / `env unset` change one env var without a deploy
150
+ - `xanosdk generate` writes just the `xano/` tree from any source
151
+ - Export refuses two routes that one request path can reach
152
+ - An input named `run` filled by a call is flagged
153
+ - Reading a workspace back skips stored file bytes
154
+ - Every deploy imports the same way
155
+
156
+ ---
157
+
158
+ ## 0.0.41 — Public seeds and nullable inputs
159
+
160
+ _2026-09-24_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.41)
161
+
162
+ This release fixes three problems found in real deploys: seed values in a `--static` deploy, optional date and file inputs, and preflight on queries that share a name. There is one behavior change: `--allow-seed-in-static` is gone, and you now list public seed columns on the table with `publicSeed`.
163
+
164
+ - ⚠️ `table({ publicSeed })` replaces `--allow-seed-in-static`
165
+ - Every `--json` failure has its own code and data
166
+ - An omitted optional date, timestamp or file input is null
167
+ - Inferred types include `| null` for fields that are nullable by default
168
+ - Preflight tells apart queries with the same name
169
+
170
+ ---
171
+
172
+ ## 0.0.40 — A pinned local engine, no setup
173
+
174
+ _2026-09-24_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.40)
175
+
176
+ This release makes `xanosdk deploy --local-engine` work on a fresh machine with nothing configured, and makes every checkout of a project run the same engine version. The version is pinned in the project's `package.json`, newer engines are offered rather than forced, and new `local-engine update` and `local-engine cache` commands manage the pin and the downloads. There is one behavior change: `XANOSDK_LOCAL_ENGINE_PATH` is gone, replaced by `XANOSDK_LOCAL_ENGINE_OVERRIDE`.
177
+
178
+ - `deploy --local-engine` needs no setup and pins the engine version
179
+ - Newer engines are offered, never forced
180
+ - A running engine on the wrong version is replaced
181
+ - New `local-engine update` and `local-engine cache list|clear` commands
182
+ - ⚠️ `XANOSDK_LOCAL_ENGINE_OVERRIDE` replaces `XANOSDK_LOCAL_ENGINE_PATH`
183
+
184
+ ---
185
+
186
+ ## 0.0.39 — Addons that hold up after a merge
187
+
188
+ _2026-09-23_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.39)
189
+
190
+ This release fixes addons, `obj()` records, workflow-test headers and one CLI flag. Addon output columns and sorts now behave the same after a merge deploy as after a replace. A filtered record member no longer drops the member after it. There is one behavior change: `addon({ sort })` with `cardinality: "count"` or `"exists"` now throws.
191
+
192
+ - Addon output columns survive a merge deploy
193
+ - `addon({ sort })` now sorts the grafted rows
194
+ - ⚠️ `addon({ sort })` with `cardinality: "count"` or `"exists"` throws
195
+ - A filtered `obj()` member no longer swallows the next one
196
+ - `s.api.call` sends header names Title-Cased, as real requests do
197
+ - `--out` is refused on commands that don't write to it
198
+ - An empty file column doesn't match a null check in `where`
199
+
200
+ ---
201
+
202
+ ## 0.0.38 — Move what you already built
203
+
204
+ _2026-09-23_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.38)
205
+
206
+ You can now move work you already built without rebuilding it. Publish a built frontend on its own, copy a release to another workspace or instance, and redeploy without losing your table rows. Release writes also report one result shape, and an outcome that can't be known exits with its own code. One breaking removal: `s.db.get_by_id` is gone, and `s.db.get` does the same fetch.
207
+
208
+ - `xanosdk publish <dir>` publishes a built frontend without touching the backend
209
+ - `xanosdk release transfer` copies a release to another workspace or instance
210
+ - `deploy --keep-data` keeps your table rows across redeploys
211
+ - Every release write reports one result, and exit 9 means "unknown"
212
+ - A release cut is confirmed under the name the server actually stored
213
+ - `xanosdk local-engine token` prints a local engine's meta API token
214
+ - Middleware in the `post` phase: `get_all_input` holds the response, not the request
215
+ - ⚠️ `s.db.get_by_id` and retired CLI flags are removed
216
+
217
+ ---
218
+
219
+ ## 0.0.37 — Your backend, on your machine
220
+
221
+ _2026-09-22_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.37)
222
+
223
+ A second deploy destination: your compiled workspace running on a real backend on your own machine, in one command, with no sign-in and no network round-trip per iteration. It ships behind a flag as a prototype. One change is not a prototype and reaches everyone — a deploy that publishes no static site now points a scaffolded project's dev server at the backend it just made, for the hosted destination as well as the new one.
224
+
225
+ - Your dev server follows the deploy, on every destination
226
+ - `xanosdk deploy --local-engine` deploys to an engine on this machine
227
+ - Point the flag at a file, not only a URL
228
+ - `XANOSDK_LOCAL_ENGINE_PATH` makes a bare flag work anywhere
229
+ - `xanosdk local-engine list`, `stop` and `impersonate`
230
+ - New projects get a one-command local redeploy
231
+ - The deploy summary gained a destination, and kept its old shape
232
+ - Two test guards that fired on correct code
233
+
234
+ ---
235
+
236
+ ## 0.0.36 — What a replace takes with it
237
+
238
+ _2026-09-22_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.36)
239
+
240
+ `xanosdk deploy --to workspace --replace` destroyed every branch in the target workspace and said nothing about it — not in the plan, not in the warning, and `--yes` skipped the confirmation entirely. The branches are gone permanently, along with the saved versions that would restore one. It is now refused unless you acknowledge the loss, and the branches at risk are named before anything is written. **If you run `--replace --yes` in CI against a workspace that has other branches, that command now fails until you add `--allow-branch-deletion`.**
241
+
242
+ - ⚠️ `--replace` deleted every branch in the workspace, silently
243
+ - The plan names the branches, and splits them by who made them
244
+ - The same scope is in `--json`, for tools that ask before acting
245
+ - A release could name code you never deployed, and said nothing
246
+
247
+ ---
248
+
249
+ ## 0.0.35 — Know where it went
250
+
251
+ _2026-09-18_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.35)
252
+
253
+ This release makes the CLI say where it is writing before it writes, and prove that what it wrote arrived. Two sessions had deployed a backend to the wrong workspace and reported green; a promote had landed a branch carrying none of its functions and reported success. Both are now errors rather than checkmarks. One behavior change to know about: `promote` can exit non-zero where it used to exit 0, which means the landing was incomplete.
254
+
255
+ - `promote` reads back what it landed and fails on anything missing
256
+ - ⚠️ `--set-live` is two steps now, and serves only a verified landing
257
+ - ⚠️ A project's profile pin now outranks `$XANO_PROFILE`
258
+ - Every writing command names its destination before it writes
259
+ - `workspace diff` compares a staged branch against your compile
260
+ - `workspace reset-tables` puts named tables back to their seed rows
261
+ - Reference data has a written ordering rule
262
+ - `promote --json` gains `ok` and `verification`
263
+
264
+ ---
265
+
266
+ ## 0.0.34 — CLI paths that shipped broken
267
+
268
+ _2026-09-17_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.34)
269
+
270
+ Two CLI paths that shipped broken now work. If your backend lives anywhere other than `xano/`, every command that reads or writes env and secrets was pointed at the wrong directory — and `xanosdk preflight` was unusable unless you had the maintainer environment variables set, despite the public help offering it. Both are fixed, with one behavior worth knowing about even on a standard layout: a stray `.env` in your working directory can no longer decide which instance your backend uploads to.
271
+
272
+ - A backend outside `xano/` now reads its own env and secrets
273
+ - `xanosdk preflight` works after `xanosdk login`
274
+ - A `.env` in your working directory can no longer redirect a deploy
275
+
276
+ ---
277
+
278
+ ## 0.0.33 — A pulled tree deploys as pulled
279
+
280
+ _2026-09-17_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.33)
281
+
282
+ `init --from` could not verify a workspace that stores a documentation token with the gate switched off, and a tree deployed past that check turned the gate on — closing a doc site the workspace had deliberately left open. Both are fixed and verified against a live backend. A round trip that fails for any other reason now also names version skew between the CLI and the SDK the tree resolved, instead of sending you to fix a workspace that was never wrong.
283
+
284
+ - A stored documentation token no longer invents a gate
285
+ - A failed round trip names version skew instead of blaming your workspace
286
+ - `xanosdk routes` and `paths` work on a project whose doc site is gated
287
+
288
+ ---
289
+
290
+ ## 0.0.32 — The doc token leaves your repo
291
+
292
+ _2026-09-17_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.32)
293
+
294
+ The token gating a hosted API doc site is a secret, and until now a pull wrote it straight into committed source — every API group's, plus the workspace's. Deleting the block to get rid of it was worse: an absent `documentation` key was sent as the engine default, which cleared a Private doc site's gate while leaving the docs published. Both are closed. The token now lives in a gitignored `xano/.secrets.json`, keyed by the object that owns it, and source declares only that a gate exists.
295
+
296
+ - ⚠️ A pulled doc-site token no longer lands in committed source
297
+ - ⚠️ Omitting `documentation` no longer clears a live doc-site gate
298
+ - `xanosdk secrets fill` mints a token for a gate you declared yourself
299
+ - CI supplies doc tokens without the sidecar
300
+ - ⚠️ A release name that is really a path is refused
301
+
302
+ ---
303
+
304
+ ## 0.0.31 — Modules refuse the wrong SDK
305
+
306
+ _2026-09-16_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.31)
307
+
308
+ A toolchain module built for a newer SDK than the one running it used to fail by succeeding: every hook on the contract is optional, so it loaded, registered, and contributed nothing while the command reported success. This release closes that in both directions — the loader refuses it by name, and the installers never leave one on disk to be refused later. The marketplace and module-contract guides land alongside it.
309
+
310
+ - A module built for a newer SDK is refused at load, by name
311
+ - An install that cannot work is undone, not announced
312
+ - `marketplace remove` says what is actually true
313
+ - Two guides for building and installing add-ons
314
+
315
+ ---
316
+
317
+ ## 0.0.30 — Install, and it's configured
318
+
319
+ _2026-09-16_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.30)
320
+
321
+ Installing a module now configures it. `xanosdk marketplace install` was `npm install` plus a message — a toolchain module's questions were never asked, its `.gitattributes` lines never written, and the per-project config block every later `deploy` reads never created. That is now one idempotent reconciler over your `dependencies` and stored config, which `install`, `reinstall` and `remove` all drive, so a module configures correctly however it arrived — including by a plain `npm install` or a merged PR that no xanosdk command ever saw. Module authors: the plugin contract changed shape and the old one is refused by name.
322
+
323
+ - `marketplace install` configures the module it installs
324
+ - `marketplace reinstall <package>` re-asks a module its questions
325
+ - `marketplace remove <package>` drops what the module contributed
326
+ - ⚠️ The plugin contract applies to a project, not a scaffold
327
+ - A module that arrived without the CLI is now reported
328
+ - `init` asked one question twice, and hid what npm was doing
329
+ - `init --force` dropped your module config block
330
+ - Managed blocks are a shared mechanism
331
+
332
+ ---
333
+
334
+ ## 0.0.29 — Modules that extend the CLI
335
+
336
+ _2026-09-16_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.29)
337
+
338
+ A second kind of module lands: one that extends the **CLI** instead of the workspace. A workspace module (`@xanosdk/auth`, `@xanosdk/chatbot`) adds tables and endpoints you register in `xano/index.ts`; a toolchain module registers nothing and instead participates in the commands — contributing `init` questions and scaffold fragments, and running hooks on `export`, `deploy` and `preflight`. Everything under it is built to fail loudly: a module that cannot run is never allowed to look like one that passed, and your env values never reach third-party hook code.
339
+
340
+ - The toolchain-module contract ships on `@xanosdk/sdk/plugin`
341
+ - A module that cannot run fails the build rather than passing it
342
+ - Env values are blanked before any hook sees them
343
+ - `init` installs before it asks
344
+ - Per-project module settings live in your `package.json`
345
+ - A module's own `--flag value` could steal the scaffold's target directory
346
+ - `--marketplace` reported a working module as broken
347
+ - `.gitattributes` gains a slot for module-contributed lines
348
+
349
+ ---
350
+
351
+ ## 0.0.28 — Secrets out of source
352
+
353
+ _2026-09-15_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.28)
354
+
355
+ Workspace env var values no longer live in a committed file: a pull now writes names
356
+ with the values in a gitignored `xano/.env`, and `xanosdk env pull` fills it from a live
357
+ backend. The rest closes the complex-app gap analysis — typed builders for the SQL-side
358
+ `qf.*` filter registry, the runtime predicates the eight operators cannot spell, ordered
359
+ authorization guards, and `respond.*` for the HTTP status line, probed against a live
360
+ engine rather than inferred.
361
+
362
+ - ⚠️ Workspace env values move to `xano/.env`, names are declared in source
363
+ - `xanosdk env pull` fills `xano/.env` from a live source
364
+ - `respond.status` / `respond.redirect` / `respond.header` — the status line
365
+ - `qf.*` — typed builders for the SQL-side query-expression filters
366
+ - `cond.*` — the runtime predicates the eight operators cannot spell
367
+ - `guard.role` / `guard.owner` / `guard.require` — authorization in the right order
368
+ - `typedEnv()` and the `stack.env-undeclared` warning
369
+ - Per-kind blocks the SDK was dropping
370
+ - Instance-capability listing at export, and `set_var` constant branding
371
+
372
+ ---
373
+
374
+ ## 0.0.27 — The guards that weren't
375
+
376
+ _2026-09-15_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.27)
377
+
378
+ Seven fixes, and most of them are the same story: a guard that was not guarding. The lock check passed the one rename it exists to stop, the release list walked itself into silence past 100 rows, and three release fields shipped structurally dead because the tests agreed with the projection instead of checking it. Also new: the CLI holds more than one credential.
379
+
380
+ - ⚠️ A rename in code no longer passes `xano:check`
381
+ - Named credential profiles
382
+ - `release list` no longer goes silent past 100 rows
383
+ - Three dead fields on a release record, found by recording a live one
384
+ - An empty description stays the empty string the server reported
385
+ - `release create --branch` refuses a bad label before it cuts
386
+ - `init --from` handles an archive that repeats one object
387
+
388
+ ---
389
+
390
+ ## 0.0.26 — The guid you can write down
391
+
392
+ _2026-09-14_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.26)
393
+
394
+ Object identity in this SDK is now something you can write down and rely on. A full-replace deploy used to mint a fresh guid for every object and discard the ones your project carried, so a guid noted before a redeploy named nothing afterwards — and the next release into that workspace matched nothing and duplicated everything. It no longer does. Alongside that, `release create --seed` gains guid-based table selection and a `tables` listing verb on every source you can cut from, so the values it takes are obtainable in the first place.
395
+
396
+ - `xanosdk deploy` and `release --replace` preserve object identity
397
+ - A replace no longer rewrites your `xano.lock`
398
+ - Guid selection is documented as stable, not as a trap
399
+ - `--seed` explains a guid that does not match
400
+ - Select seeded tables by guid, and list them from any source you can cut from
401
+ - A rows-free release says what it actually contains
402
+ - ⚠️ `--expires-hours` now accepts 1–24
403
+
404
+ ---
405
+
406
+ ## 0.0.25 — The release-chain fixes
407
+
408
+ _2026-09-10_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.25)
409
+
410
+ Three fixes to the release chain, all found by running `ephemeral → release → promote / tenant deploy` end to end against a live backend rather than in tests. One of them is that `tenant deploy` had never worked at all: it sent the wrong parameter name and every invocation was refused, so landing a release on a customer tenant was closed. Nothing here changes how you author a workspace.
411
+
412
+ - `tenant deploy` never landed a release, and now does
413
+ - `release create --json` reported `createdAt` in two different formats
414
+ - `release create --help` offered a source it refuses
415
+
416
+ ---
417
+
418
+ ## 0.0.24 — Every branch gets a name
419
+
420
+ _2026-09-10_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.24)
421
+
422
+ A promote used to land your backend on a branch nobody could name. The engine's answer to a release deploy that names no branch is a branch with an *empty label* — the queries, functions and tasks went there, the tables arrived anyway because they are workspace-scoped, and the whole thing reported success. Every promote names its branch now, and the branch listing admits when one has no name. Anyone whose workspace already holds one can finally see it.
423
+
424
+ - ⚠️ A promote landed your logic on a branch nobody could name
425
+ - `--set-live` with no `--branch` lands and serves in one call
426
+ - `--backup-branch` on a promote is refused, not silently ignored
427
+ - `xanosdk workspace branch list` shows a branch carrying no label
428
+
429
+ ---
430
+
431
+ ## 0.0.23 — The release that came from somewhere else
432
+
433
+ _2026-09-10_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.23)
434
+
435
+ Cutting a release from a running environment is now **one server-side call** instead of four, and the result is verified rather than trusted. Two platform changes landed together and both reach `xanosdk release`: the release route takes a source tenant, and an OAuth token is now pinned to the workspace it was issued for across the whole Meta API, for every role.
436
+
437
+ Everything below was measured against a live instance, not inferred.
438
+
439
+ - The cut is one call, and writes nothing to the source
440
+ - A release cut from an out-of-date instance is refused, not trusted
441
+ - ⚠️ A sandbox tenant can be a release source, and `--from <bare-name>` no longer resolves
442
+ - A workspace-binding refusal explains itself
443
+ - `release show` no longer tells you to re-cut an intact release
444
+ - The release name was being compiled as a project
445
+ - npm was not found when Homebrew installed node
446
+
447
+ ---
448
+
449
+ ## 0.0.22 — A release is a noun
450
+
451
+ _2026-09-07_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.22)
452
+
453
+ Xano has a first-class **release** object, and this version restructures the CLI around it. A deploy targets a disposable ephemeral; reaching anything real — your workspace, or a customer's tenant — goes through a release, the stored record that this code came up and answered.
454
+
455
+ **This is a breaking change.** `xanosdk release ./xano/index.ts` no longer exists. `release` is now a namespace, production is `xanosdk promote <release>`, and `xanosdk deploy --to workspace` keeps the old merge behaviour as a deliberate escape hatch.
456
+
457
+ - ⚠️ A release is a noun, and the destination is never a default
458
+ - `promote` and `tenant deploy` land a release without touching your data
459
+ - `deploy` takes any source, and `--to` is the escape hatch
460
+ - `xanosdk pull` refreshes a project's backend without rescaffolding it
461
+ - A release is cut where it can be cut, and always lands in your workspace
462
+ - `release create` no longer accepts a customer tenant
463
+ - Flags that chose a destination, or promised a preview, no longer fail quietly
464
+ - Scaffolded repos render and check their committed `xanoscript/` tree
465
+
466
+ ---
467
+
468
+ ## 0.0.21 — XanoScript, rendered where the code is
469
+
470
+ _2026-09-07_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.21)
471
+
472
+ XanoScript is now produced inside the SDK. `xanosdk export` renders a workspace to XanoScript locally, byte-identical to what the engine returns for the same workspace, and can keep that rendering committed beside the TypeScript as one `.xs` file per object. New projects get this by default: the `xanosdk init` scaffold's `xano:export` writes the tree and `xano:check` fails when it is stale.
473
+
474
+ - `xanosdk export --format xs` renders XanoScript locally, byte-identical to the engine
475
+ - `xanosdk export --xanoscript` keeps a committed XanoScript tree beside the source
476
+ - `xanosdk init` scaffolds `xano:export` and `xano:check` with `--xanoscript`
477
+ - `xanosdk preflight --xanoscript` diffs the local rendering against the engine's
478
+
479
+ ---
480
+
481
+ ## 0.0.20 — The statement that could not come back
482
+
483
+ _2026-09-06_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.20)
484
+
485
+ One removal: a builder whose output could not survive a round trip. `s.security.create_guid` emitted a statement that is real at runtime but **internal** — the XanoScript language has no spelling for it, so a workspace containing it rendered a placeholder on pull and did not come back on push.
486
+
487
+ - `s.security.create_guid` is removed — use `create_uuid`
488
+
489
+ ---
490
+
491
+ ## 0.0.19 — The internal statement
492
+
493
+ _2026-09-06_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.19)
494
+
495
+ Two changes, both about a surface that was telling callers the wrong thing: a builder that emitted an **internal** engine statement, and the call family's last unverified claim. One is a behaviour change for anyone using `s.db.get_by_id`; the other is the retirement of the final `@TODO(byte-verify)` marker.
496
+
497
+ - `db.get_by_id` emitted an internal statement — and a `0` key failed the whole request
498
+ - The call family's last unverified claim is now backed by engine bytes
499
+
500
+ ---
501
+
502
+ ## 0.0.18 — The confident wrong answers
503
+
504
+ _2026-09-04_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.18)
505
+
506
+ Six fixes, each one a case where the output was confident and wrong: a tool that reported success while writing nothing, a preflight that reported a diff on a correct deploy, an MCP URL that 404'd, and three documented claims that were the opposite of what the engine does. Four were found by measuring against 0.0.17 rather than by reading, which is why they had survived being read.
507
+
508
+ - A tool passed as a bare handle runs with no caller, and `auth()` inside it fails as a *successful* result
509
+ - Preflight reported a round-trip diff on every auth-gated query
510
+ - `mcpServer().getUrl()` built a 404 for any tenant
511
+ - `resultStrategy` in a `pre` middleware rewrites the host's request inputs
512
+ - An `auth()`-keyed limiter on a public host 403s the first call — it never shares a bucket
513
+ - The `exceptionPolicy` default contradiction told authors their guards were inert
514
+
515
+ ---
516
+
517
+ ## 0.0.17 — The unchecked paths
518
+
519
+ _2026-09-03_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.17)
520
+
521
+ Three paths in this release reported success without having checked anything: `xanosdk preflight` skipped whole object kinds, a release proceeded when it could not read the target workspace, and a microservice had no way to reference a secret instead of inlining it. All three now either check or refuse, and preflight's registry has a guard so a newly added kind cannot drop out of it silently.
522
+
523
+ - Preflight skipped realtime, microservice and API-group objects entirely
524
+ - A microservice can name a workspace env var instead of inlining the secret
525
+ - A pulled microservice lost its env reference on the next deploy
526
+ - A release into a workspace it could not read is refused, not warned
527
+ - Releases apply through one import route
528
+
529
+ ---
530
+
531
+ ## 0.0.16 — Branch reads and locked identity
532
+
533
+ _2026-09-03_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.16)
534
+
535
+ This release is about a release telling you the truth before it changes your workspace, and about reading a branch without touching production. Every build now writes `xano.lock` with no flag, `--branch` actually reads the branch you name instead of silently handing you live, and a release that would rename a workspace, collide with an identity it does not own, or land on a public URL it cannot serve now says so — several of those cases previously exited 0.
536
+
537
+ - ⚠️ Every build writes `xano.lock`; `--no-lock` opts out
538
+ - ⚠️ `--branch <label>` reads that branch — and refuses when it cannot
539
+ - Branch-targeted releases are no longer hidden
540
+ - A release refuses a collision instead of reporting success over a broken workspace
541
+ - The plan names the rename and the URLs the instance will invent
542
+ - The lock records whether a public slug is a contract or a convenience
543
+ - Releases use the SDK's own import route when the instance has it
544
+ - `f.decimal` and `f.int` state the bounds that were measured
545
+
546
+ ---
547
+
548
+ ## 0.0.15 — The silent failures
549
+
550
+ _2026-09-02_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.15)
551
+
552
+ Four of the five fixes here failed quietly: a downstream package that could not emit declarations at all, a paged endpoint answering `[]` at HTTP 200, a public API's 403 arriving as null fields, and a freshly scaffolded project that did not compile on a line nobody wrote. Each is now either fixed at the source or caught by a check that goes red. The seed-data guidance for tests also ships with the constraint that makes it safe.
553
+
554
+ - A downstream package could not emit declarations at all
555
+ - A paged `db.query` roots its `output` selection at the envelope
556
+ - `xanosdk init` never scaffolds a register call whose options are required
557
+ - `datasource: 'live'` is safe on an ephemeral — and stored, not per-run
558
+ - `s.api.request` sends no `User-Agent`
559
+ - `xanosdk status` no longer labels its reads `whoami`
560
+
561
+ ---
562
+
563
+ ## 0.0.14 — The router with headroom
564
+
565
+ _2026-09-01_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.14)
566
+
567
+ A grounding-docs release. The always-read `llms.txt` router was sitting at exactly its 10,000-token ceiling; it now reads at 8,192 with its gotchas grouped by where you are standing and the rule stated before the failure. Two new topic files carry what moved out plus an index of the exact error strings the engine returns. No runtime code changes.
568
+
569
+ - The router drops from 10,000 to 8,192 tokens
570
+ - Gotchas are grouped and rule-first
571
+ - Twelve long topic-file bullets are one rule per line
572
+ - New `llms/errors.md` maps exact error strings to their fix
573
+ - New `llms/client.md` for the frontend side
574
+ - The Quickstart names the check-your-work loop
575
+
576
+ ---
577
+
578
+ ## 0.0.13 — The realtime gate contract
579
+
580
+ _2026-09-01_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.13)
581
+
582
+ Realtime v2 lifecycle triggers get their contract straightened out. A `join`
583
+ gate written the way the docs described — reading a channel path param as
584
+ `inp("room_id")` — raises at runtime and refuses every client, and a `deliver`
585
+ trigger had no typed way to read the payload it exists to transform. Both are
586
+ fixed, along with two gate rules the docs never carried. Every claim here was
587
+ verified by driving a real websocket client against a live engine.
588
+
589
+ - ⚠️ A channel path param is not a lifecycle-trigger input — read it from the session
590
+ - A `deliver` trigger now reads its payload through the typed handle
591
+ - Inside `{ allowed }`, admission needs strictly `true`
592
+ - A gate establishes no auth, so `auth.id` reads 0
593
+
594
+ ---
595
+
596
+ ## 0.0.12 — Values that answer themselves
597
+
598
+ _2026-09-01_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.12)
599
+
600
+ 0.0.12 fixes a silent wrong answer: `c.now()` inside an `obj()` served the string
601
+ `"now"` instead of a timestamp, and in a realtime handler that string was written
602
+ into the stored transcript and replayed to every joiner. It also lands the four
603
+ reports from #310 — `export` was rewriting `CLAUDE.md` with the wrong theme — and
604
+ a truthfulness pass over what ships to an agent: corrected claims, and ~480 KB of
605
+ maintainer-addressed JSDoc taken out of the consumer type surface.
606
+
607
+ - `c.now()` inside `obj()` answered the string `"now"`
608
+ - `export` rewrote `CLAUDE.md` with the wrong theme
609
+ - `bind` joins: the typed path across a join, stated
610
+ - `fields: null` on 65 statements means "typed wrapper", not "missing"
611
+ - `QUERY_EXPRESSION_FILTERS` / `VECTOR_FILTERS`: where they live, and that `fl.*` cannot spell them
612
+ - The shipped type surface stopped carrying maintainer residue
613
+ - Four documented claims corrected against the source
614
+
615
+ ---
616
+
617
+ ## 0.0.11 — The silent-success pass
618
+
619
+ _2026-08-31_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.11)
620
+
621
+ This release adds one new entry point and closes a set of shapes that compiled clean and then went wrong at request time — a regex pair that answered `false` for every input, a read addressed by query string instead of by path, a column name the engine reserves, and a `0` id that fails a whole request. Most land as warnings, so an ordinary build is unaffected; `export --strict` promotes them, so a strict build that passed on 0.0.10 can newly fail. It also corrects one piece of published advice: a physical table name is not stable across deploys, and the old atomic-counter guidance said to hardcode it.
622
+
623
+ - `@xanosdk/sdk/bundle` reads a compiled bundle without reimplementing the SDK
624
+ - ⚠️ A reversed regex operand pair is refused instead of answering `false` forever
625
+ - ⚠️ An addressing input missing from a query's path now warns
626
+ - ⚠️ A reserved `run` column and a `get_by_id` id that can be `0` now warn
627
+ - `obj()` accepts `c.obj` and `c.array` members
628
+ - `./manifest.json` is exported from the package
629
+ - Corrected: a physical table name is not stable across deploys
630
+
631
+ ---
632
+
633
+ ## 0.0.10 — The CLI surface pass
634
+
635
+ _2026-08-31_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.10)
636
+
637
+ This release is a CLI surface pass, and it is breaking throughout. Six ways to start a project collapse to `init` plus two flags, the sandbox environment is gone with every surface that named it, and a run of commands and flags were renamed to say what they actually do — including three that each carried two or three unrelated meanings. One command is new: `xanosdk status` answers where you stand in a single read.
638
+
639
+ - ⚠️ Project creation is one command: `init`, with `--from` and `--web`
640
+ - ⚠️ The sandbox environment is gone
641
+ - ⚠️ `deploy` takes no environment flag
642
+ - `xanosdk status` — who, where, and which environment
643
+ - ⚠️ `validate` is now `preflight`, and `lock adopt` is now `lock import`
644
+ - ⚠️ `--dest` is now `--env`, and names environments the way `--from` does
645
+ - ⚠️ Flags that carried several meanings were split apart
646
+ - `routes` and `whoami` are the canonical spellings
647
+
648
+ ---
649
+
650
+ ## 0.0.9 — Eight reports from real use
651
+
652
+ _2026-08-31_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.9)
653
+
654
+ Eight reports, all from one round of real-world use, and every one of them a case that type-checks, exports under `--strict` and deploys clean before going wrong. The headline is a deploy that could not succeed at all: any seeded number below `1e-4` failed the import with a signature error that named nothing. The rest correct places where the docs described behavior the engine does not have — a search operator that silently matches nothing, a by-id read that rejects the sentinel the field docs prescribe, and a seeding question whose two possible answers demanded opposite designs.
655
+
656
+ - Seed data holding a number below `1e-4` no longer fails the deploy
657
+ - ⚠️ Every test JSON document puts its per-test array under `tests`
658
+ - `like` and `ilike` match nothing for a bare term — reach for `includes`
659
+ - `db.get_by_id` rejects the `0` optional-FK sentinel, and takes the whole request with it
660
+ - A seeded `f.password()` column IS hashed, so demo credentials work as fixtures
661
+ - Native email is discoverable, and the built-in provider needs no configuration
662
+ - A relative entry path names the directory it resolved against
663
+ - Three fields the docs called plain values take tagged ones
664
+
665
+ ---
666
+
667
+ ## 0.0.8 — The auth() lookalike
668
+
669
+ _2026-08-30_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.8)
670
+
671
+ `ref("auth.id")` looks like it reads the authenticated caller. It does not, and the engine's error for it — `Missing var entry: auth` — pointed nowhere useful. That spelling, and every other reserved namespace read as if it were a stack variable, now fails the export with the accessor that works. The same mistake was shipped in our own file-upload recipe, which is corrected.
672
+
673
+ - ⚠️ `ref()` on an engine-reserved namespace now fails the export
674
+ - The file-upload recipe read the input bag the wrong way
675
+ - The unbound-variable warning now quotes the error you actually get
676
+
677
+ ---
678
+
679
+ ## 0.0.7 — Verb pairs on one path
680
+
681
+ _2026-08-29_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.7)
682
+
683
+ Queries are now identified the way the engine identifies them — by api group, verb, and name together — so `GET /items` and `POST /items` are two endpoints instead of one export error. The grounding docs an AI agent reads got a full pass for people arriving at Xano for the first time, and two silent-failure classes now surface at `export()` instead of on a live endpoint.
684
+
685
+ - A `GET` and `POST` on the same path no longer collide
686
+ - ⚠️ A query's verb and api group are now part of its identity
687
+ - ⚠️ `s.api.call` takes the query handle, not a bare name
688
+ - A tagged value in a template literal now fails the build instead of shipping garbage
689
+ - The grounding docs assume no prior Xano knowledge
690
+ - `xanosdk deploy` no longer loops on "re-run the deploy" when your session has expired
691
+
692
+ ---
693
+
694
+ ## 0.0.6 — The action identity fix
695
+
696
+ _2026-08-28_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.6)
697
+
698
+ `action.call` and `action.package.call` now take the identity the instance assigned at install
699
+ instead of deriving one from a name. A derived id is well-formed and addresses nothing, so those
700
+ calls exported clean and never resolved — if you have either in a workspace, this is a call-site
701
+ change you need to make. Alongside it: a lock-file false positive that refused a legal workspace,
702
+ and a grounding correction about what an omitted column on `db.add` actually stores.
703
+
704
+ - ⚠️ `action.call` takes the id the instance assigned, not one derived from a name
705
+ - One canonical on two different kinds is no longer a lock error
706
+ - An omitted column on `db.add` lands on its own default, not `null`
707
+ - `xanosdk init` asks two questions instead of three
708
+
709
+ ---
710
+
711
+ ## 0.0.5 — Sign in without a loopback
712
+
713
+ _2026-08-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.5)
714
+
715
+ `xanosdk login` only ever worked when the browser finishing consent could reach your machine's `127.0.0.1`. On a remote shell, a container, or a Codespace it can't — the redirect lands nowhere and login sits there for five minutes before timing out. `xanosdk login --paste` fixes that: it binds nothing, prints the URL for you to open anywhere, and you paste the redirect back. This release also corrects two documented promises that were wrong, one of which was actively misleading for exactly this case.
716
+
717
+ - `xanosdk login --paste` signs you in where the loopback can't be reached
718
+ - `XANO_NO_BROWSER` never covered remote shells, despite saying it did
719
+ - `--port` documented a default it did not have
720
+
721
+ ---
722
+
723
+ ## 0.0.4 — The markdown your agents read
724
+
725
+ _2026-08-26_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.4)
726
+
727
+ Knowledge is now workspace source: the markdown your Xano agents read before they act is authored as real `.md` files, reviewed in a diff, and deployed with the code it describes. Two commands join the CLI — `xanosdk onboard` puts the scaffold's choices in a browser, and `xanosdk upgrade` answers the version question on purpose rather than nudging. Windows users should take this one regardless: every npm call in the package was failing before it reached npm.
728
+
729
+ - `knowledge()` — author the markdown your Xano agents read
730
+ - `xanosdk onboard` — pick the scaffold's look in a browser
731
+ - `xanosdk upgrade` — the version question asked on purpose
732
+ - Every npm call failed on a current Node for Windows
733
+ - The guides ship in the tarball
734
+ - `CHANGELOG.md` ships, generated from the releases
735
+
736
+ ---
737
+
738
+ ## 0.0.3 — The scaffold gets a look
739
+
740
+ _2026-08-25_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.3)
741
+
742
+ `xanosdk init` wrote one hard-coded stylesheet, so every scaffolded project looked
743
+ identical. It now takes a theme, a corner radius, a dark-mode strategy, three
744
+ typeface slots and an icon set — 126 themes composed from shadcn/ui's own tables,
745
+ or any registry theme URL. The same command can install **and register**
746
+ marketplace add-ons in one line, and the agent grounding now points assistants at
747
+ a prebuilt module instead of hand-rolling one. Nothing changes for anyone not
748
+ passing the new flags: no flags and no TTY scaffolds exactly what it did before.
749
+
750
+ - `xanosdk init` takes a theme, typefaces and an icon set
751
+ - `chart-*` and `sidebar-*` were missing from every scaffolded stylesheet
752
+ - `components.json` hard-coded a base color the stylesheet no longer used
753
+ - Dark mode shipped inert
754
+ - `--marketplace` installs add-ons and registers them
755
+ - Agents are grounded in marketplace discovery and the first-party modules
756
+ - New `@xanosdk/sdk/scaffold` export carries the scaffold's palette as data
757
+
758
+ ---
759
+
760
+ ## 0.0.2 — What the engine actually requires
761
+
762
+ _2026-08-25_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.2)
763
+
764
+ This release is about the statement surface refusing what the engine cannot accept, while you are writing rather than after you deploy. An absent required argument does not error on Xano — it substitutes a type default and answers HTTP 200 with a confident wrong result, which nothing downstream can distinguish from a right one. So 50-odd arguments that were typed optional are now required, one field the engine never reads is gone, and the wrappers that used to pass a missing field along now name it. If your code omitted any of them it will stop type-checking; it was already producing the wrong answer.
765
+
766
+ - ⚠️ 25 arguments across 15 statements are now required
767
+ - ⚠️ The Elasticsearch and OpenSearch credentials and target are required
768
+ - ⚠️ `webflow.request` no longer offers a `headers` field
769
+ - ⚠️ Statements that passed a missing field along now refuse it
770
+ - A zero-argument call names the field it needs
771
+ - A pulled workspace decodes where it used to fall back to `raw()`
772
+ - Every statement in the catalog has byte evidence behind it
773
+
774
+ ---
775
+
776
+ ## 0.0.1 — The new name, and a README to match
777
+
778
+ _2026-08-24_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.1)
779
+
780
+ The SDK is now published as **`@xanosdk/sdk`**, starting a fresh version line at 0.0.1. The name says what the package is — the authoring surface, the compiler, and the CLI — rather than implying one member of a family with a shared core. Alongside the rename: two new build-time warnings for shapes that used to ship clean and then misbehave at request time, and a README rebuilt as a landing page with its reference material split into browsable guides.
781
+
782
+ - ⚠️ The package is now `@xanosdk/sdk`
783
+ - `s.switch` fell through without `break: true`
784
+ - A filtered operand in a `where` could 500 at request time
785
+ - The README is a landing page again
786
+ - Scaffolds build the frontend before deploying it
787
+ - `@xanosdk/auth` is authentication, not authorization
788
+ - `InferResponse`: the shapes that never derive, and the line that closes each