@xano/sdk 1.0.5 → 1.0.7
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.
- package/CHANGELOG.md +35 -5
- package/README.md +56 -20
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-KVLR7M5Y.js → agent-file-refresh-DGGSRPJ4.js} +15 -14
- package/dist/agent-skill-command-37DFYS7Q.js +414 -0
- package/dist/{answer-shape-XGR2DGWY.js → answer-shape-RBFDCNZ7.js} +5 -5
- package/dist/{backend-dir-IE4RMUFH.js → backend-dir-KDD43X7K.js} +16 -15
- package/dist/{backend-slot-6HBWG5FN.js → backend-slot-TBOVZXDE.js} +4 -4
- package/dist/bin.js +63 -61
- package/dist/{branch-T2APKPVG.js → branch-7PIKNUD7.js} +12 -11
- package/dist/{branch-commands-HXXTCSOO.js → branch-commands-EGY7ZEZE.js} +32 -32
- package/dist/bundle.js +9 -39
- package/dist/{capture-HBXFXZEW.js → capture-GW5KNKMB.js} +3 -3
- package/dist/{chunk-3BJYQGAZ.js → chunk-26LHXLD3.js} +2 -2
- package/dist/{chunk-N6BWB35H.js → chunk-2ACWDSAQ.js} +3 -3
- package/dist/{chunk-XIABDKFQ.js → chunk-2SD4LA22.js} +2 -2
- package/dist/{chunk-K6PRKPFX.js → chunk-2XWVZRL6.js} +7 -7
- package/dist/{chunk-ES5A66IH.js → chunk-2YER2J47.js} +13 -13
- package/dist/{chunk-G57RYMKB.js → chunk-3FRGNBOC.js} +2 -2
- package/dist/{chunk-BMCZQZMI.js → chunk-46PATL23.js} +13 -9
- package/dist/{chunk-MYLPOVX6.js → chunk-47XT6WQL.js} +8 -8
- package/dist/{chunk-AWQ7BQTQ.js → chunk-4GPIOIAC.js} +6 -1
- package/dist/{chunk-7GX445AE.js → chunk-4XHAT7C5.js} +2 -2
- package/dist/{chunk-QOLOQ35F.js → chunk-567KK6XF.js} +8 -8
- package/dist/{chunk-57HMNJGB.js → chunk-5GIOCDUM.js} +893 -922
- package/dist/{chunk-OKNE3TWU.js → chunk-5KJBWIDZ.js} +83 -5
- package/dist/{chunk-SRX6B544.js → chunk-5QMJOE2K.js} +5 -5
- package/dist/{chunk-AGD7F7YI.js → chunk-5SCPRXFB.js} +4 -4
- package/dist/{chunk-SNGFEESM.js → chunk-5ZG7V2VW.js} +3 -3
- package/dist/{chunk-XJU6UAFV.js → chunk-7FIMUFBP.js} +2 -2
- package/dist/{chunk-AESE434J.js → chunk-7M6JP3FS.js} +2 -2
- package/dist/{chunk-K6CB5TKM.js → chunk-7REDHC4N.js} +2 -2
- package/dist/chunk-7VR4IO5B.js +44 -0
- package/dist/{chunk-57B56I4B.js → chunk-7XXWKTCE.js} +65 -41
- package/dist/{chunk-PL7AIAWS.js → chunk-A4R5CAY4.js} +4 -111
- package/dist/{chunk-QZTJ2556.js → chunk-AKERAUNH.js} +4 -4
- package/dist/{chunk-JZWUAEMO.js → chunk-ARWMVNDJ.js} +6 -3
- package/dist/{chunk-WYS6XVZ3.js → chunk-AVS4WPPY.js} +2 -2
- package/dist/{chunk-KUU7T4ZE.js → chunk-B2URJBC4.js} +18 -18
- package/dist/chunk-B3P25SDP.js +78 -0
- package/dist/chunk-BRANWM4U.js +853 -0
- package/dist/{chunk-BBPAXOU6.js → chunk-BSVQEKHO.js} +6 -6
- package/dist/{chunk-3WHWOKU4.js → chunk-BZ6WTG3E.js} +4 -4
- package/dist/{chunk-XNZURZ7T.js → chunk-CH23ONYG.js} +77 -6
- package/dist/{chunk-SQPIECXD.js → chunk-CJDPSCMX.js} +45 -5
- package/dist/{chunk-M7GJ6YUF.js → chunk-CNZASQPL.js} +16 -2
- package/dist/{chunk-44CWK6YC.js → chunk-CPN6WSBH.js} +4 -4
- package/dist/{chunk-L3BDO2BI.js → chunk-CT3J5JRZ.js} +7 -7
- package/dist/{chunk-3HOGFGKG.js → chunk-D3KEPRRN.js} +2 -2
- package/dist/{chunk-OGUMHW2X.js → chunk-D5OZRJ3T.js} +7 -7
- package/dist/{chunk-S5KQIFKJ.js → chunk-DG3APBUJ.js} +208 -112
- package/dist/chunk-DIWF7L33.js +995 -0
- package/dist/{chunk-WRBKLYSJ.js → chunk-DNBP4GJN.js} +4 -3
- package/dist/{chunk-LZDA6SVD.js → chunk-DXZTL7NA.js} +141 -91
- package/dist/{chunk-XMDDBEEM.js → chunk-E763QI3G.js} +2 -2
- package/dist/{chunk-3VX7VAQT.js → chunk-EF4MHLEW.js} +26 -9
- package/dist/{chunk-AGSCOISO.js → chunk-ELPQTDW6.js} +108 -100
- package/dist/{chunk-Q22BMRPF.js → chunk-EPFDY5JU.js} +2 -2
- package/dist/{chunk-7DBM6XHR.js → chunk-EU32BC5B.js} +8 -8
- package/dist/{chunk-Y76ERHLK.js → chunk-FDTET7FZ.js} +6 -6
- package/dist/{chunk-Z3SNX45M.js → chunk-FENA7K7C.js} +3 -3
- package/dist/{chunk-WOGJB2F6.js → chunk-FNLTFOUD.js} +4 -9
- package/dist/{chunk-FV55SRQU.js → chunk-FQ53GTII.js} +9 -9
- package/dist/{chunk-DEVGLLNZ.js → chunk-GHMLRFRX.js} +8 -8
- package/dist/{chunk-GMVW6ZZK.js → chunk-H2K4GFUS.js} +4 -4
- package/dist/{chunk-NUU76247.js → chunk-HTQWAQRW.js} +3 -3
- package/dist/{chunk-ROY4YAEQ.js → chunk-HU7F56VF.js} +22 -2
- package/dist/{chunk-RXCT3OCU.js → chunk-HZ6ADG3O.js} +47 -8
- package/dist/{chunk-Z2BRSQ6M.js → chunk-I6XRUU6U.js} +91 -64
- package/dist/chunk-IPNN2KRW.js +257 -0
- package/dist/{chunk-SF2B7MZK.js → chunk-IYXL5NYU.js} +259 -31
- package/dist/chunk-JI3BLXWQ.js +107 -0
- package/dist/{chunk-4DJTQ6W4.js → chunk-JIKGT7DO.js} +2 -1
- package/dist/{chunk-OVV2HXJ6.js → chunk-JOOKM7AH.js} +2 -2
- package/dist/{chunk-65SW2BA5.js → chunk-JOWY6HFL.js} +3 -3
- package/dist/{chunk-I5VEROXW.js → chunk-JX6N73H3.js} +2 -2
- package/dist/{chunk-5D6DGF3W.js → chunk-L472YIGG.js} +8 -8
- package/dist/{chunk-HLQH3AXB.js → chunk-L6HZ67P6.js} +2 -2
- package/dist/{chunk-TM5LRSBB.js → chunk-LBJA7IEM.js} +370 -45
- package/dist/chunk-LCOCRJ4K.js +116 -0
- package/dist/{chunk-DGWHAVRG.js → chunk-LJM5CIY4.js} +16 -1
- package/dist/{chunk-5RLAF6RL.js → chunk-M2C54ZBC.js} +4 -4
- package/dist/{chunk-U6DR6464.js → chunk-M3NEK3LT.js} +4 -4
- package/dist/{chunk-5XVBT6CQ.js → chunk-MBL7CXJ7.js} +2 -2
- package/dist/{chunk-5YBNXNKU.js → chunk-MFWF2NZJ.js} +12 -5
- package/dist/{chunk-TEBS7FE6.js → chunk-MYZRMSPM.js} +2 -2
- package/dist/{chunk-YSLMMR2U.js → chunk-N3YFCFCO.js} +14 -14
- package/dist/{chunk-OJPZEUPH.js → chunk-NDJAKSE7.js} +11 -8
- package/dist/{chunk-PIPIA7K7.js → chunk-NV37YGOV.js} +7 -7
- package/dist/{chunk-ZHGWR45B.js → chunk-O56DQKPL.js} +9 -9
- package/dist/{chunk-4QBGE3EO.js → chunk-ORGNLQN6.js} +6 -6
- package/dist/{chunk-NNB7VUCH.js → chunk-PEIBGH2V.js} +55 -31
- package/dist/{chunk-UJ6ZZJDD.js → chunk-PEX4QZVI.js} +2 -2
- package/dist/{chunk-LLS2WO2K.js → chunk-PV25BDCH.js} +5 -5
- package/dist/{chunk-F3557PVM.js → chunk-PY722CHR.js} +2 -2
- package/dist/{chunk-4GDEEY2U.js → chunk-QGIZLFAS.js} +4 -4
- package/dist/{chunk-YI76TURL.js → chunk-QRQ54LUI.js} +16 -14
- package/dist/{chunk-JQOX6HW4.js → chunk-RBU2YX22.js} +3 -3
- package/dist/{chunk-4NEBBKOP.js → chunk-RRMH7WMY.js} +7 -7
- package/dist/{chunk-HOOOOJJP.js → chunk-S46ODQRA.js} +2 -2
- package/dist/{chunk-37FBPMNE.js → chunk-S56YBYMN.js} +5 -2
- package/dist/{chunk-4QFBEKXI.js → chunk-SDGV76HF.js} +2 -2
- package/dist/{chunk-CV54PASI.js → chunk-SGK3PTTM.js} +312 -132
- package/dist/{chunk-S5TEJIGP.js → chunk-SKEG3V2V.js} +2 -2
- package/dist/{chunk-VZ22VUAS.js → chunk-SLGJIWCY.js} +3 -3
- package/dist/{chunk-JSEVKRVJ.js → chunk-T4LJ5UR2.js} +29 -7
- package/dist/{chunk-JXKO6JT7.js → chunk-TWVUYS63.js} +24 -24
- package/dist/{chunk-UIEFE6FU.js → chunk-U5M7T6CI.js} +7 -7
- package/dist/{chunk-Z4VN347O.js → chunk-UYFUIHH3.js} +2 -2
- package/dist/{chunk-Y6NO3DLQ.js → chunk-V7MBRUK6.js} +3 -3
- package/dist/chunk-VAGSKUWC.js +67 -0
- package/dist/{chunk-A4NNCI4O.js → chunk-VIJ5D3RC.js} +3 -3
- package/dist/{chunk-3IYVHVM6.js → chunk-VJFMUJWZ.js} +4 -4
- package/dist/{chunk-V4IBHDIY.js → chunk-VNDR2T35.js} +7 -7
- package/dist/chunk-WAVNUTMT.js +9 -0
- package/dist/{chunk-KQLACS4Q.js → chunk-WNCW2RNB.js} +4 -4
- package/dist/chunk-WUEPP5HD.js +111 -0
- package/dist/{chunk-IV446ZLJ.js → chunk-Y453TW6J.js} +2 -2
- package/dist/{local-engine-command-73NHWD6V.js → chunk-YCUDOF6Q.js} +22 -76
- package/dist/{chunk-CJ76PSJT.js → chunk-YH2JVJAO.js} +12 -12
- package/dist/{chunk-GPI3OWRE.js → chunk-YHB34BN6.js} +2 -1
- package/dist/{chunk-AMBEITWL.js → chunk-ZGLNHA7T.js} +7 -7
- package/dist/{chunk-NGAODDLX.js → chunk-ZJOAWRED.js} +8 -8
- package/dist/{chunk-TUEFTRC2.js → chunk-ZXRDD3Q2.js} +50 -27
- package/dist/cli.d.ts +40 -11
- package/dist/cli.js +60 -56
- package/dist/{codegen-command-L2OO6OTE.js → codegen-command-T7TC7PQO.js} +79 -72
- package/dist/codegen.d.ts +2 -2
- package/dist/codegen.js +2 -2
- package/dist/{commands-2E4JB3DB.js → commands-JDENTDJS.js} +3 -3
- package/dist/{completion-LPJIH5VQ.js → completion-YFD5OVJW.js} +9 -5
- package/dist/{config-QDCRKEWD.js → config-YJFUTRJW.js} +8 -8
- package/dist/{deploy-command-HJZNYCUY.js → deploy-command-OEVEE6UG.js} +65 -63
- package/dist/deploy-source-HYVZEYXV.js +83 -0
- package/dist/{dev-env-sync-GZ4QQJGV.js → dev-env-sync-EFDCJ6KU.js} +63 -61
- package/dist/{diagnostics-LSMGB4TY.js → diagnostics-OMN5Y2AH.js} +2 -2
- package/dist/{display-name-hint-AHCNH6TF.js → display-name-hint-SW3GB3V7.js} +14 -13
- package/dist/{emit-DqG6qddr.d.ts → emit-Dov_92kn.d.ts} +66 -20
- package/dist/env-example-refresh-WNSOH534.js +134 -0
- package/dist/{env-pull-command-Z4RLVEGJ.js → env-pull-command-UYEXMQ3P.js} +53 -52
- package/dist/{env-target-ZHQUS5BO.js → env-target-JBSLBKNX.js} +15 -14
- package/dist/{env-var-command-FKQ4VVQ6.js → env-var-command-BJNRAXNV.js} +51 -49
- package/dist/{ephemeral-L4KUOGEU.js → ephemeral-CEOGMIEA.js} +11 -10
- package/dist/{ephemeral-command-GRPFI3TD.js → ephemeral-command-IPSGBCS5.js} +70 -69
- package/dist/{ephemeral-state-VLYU2BXR.js → ephemeral-state-MTBASPRS.js} +13 -12
- package/dist/{generate-command-XNODJFDQ.js → generate-command-XQXODBS6.js} +96 -86
- package/dist/{gitignore-VWRSZX5F.js → gitignore-RUVCIZO4.js} +21 -20
- package/dist/{guards-OPSGB6LG.js → guards-KYEOCVHN.js} +6 -6
- package/dist/{impersonate-command-AEKIZHHK.js → impersonate-command-MA27O7S5.js} +46 -44
- package/dist/{import-PHSSFFLA.js → import-XKRFHABE.js} +5 -5
- package/dist/index.d.ts +14 -20
- package/dist/index.js +13 -13
- package/dist/init-command-6RDTCMAB.js +143 -0
- package/dist/{init-modules-SGSX7XEY.js → init-modules-DHTBOCQT.js} +10 -9
- package/dist/{init-web-6HX3YLQP.js → init-web-ELBXSXDL.js} +3 -3
- package/dist/internal.d.ts +5 -5
- package/dist/internal.js +47 -20
- package/dist/{io-TAF4WXYQ.js → io-PGTCBSIQ.js} +6 -4
- package/dist/{keep-data-merge-GUGF7MVZ.js → keep-data-merge-TDJOIAVT.js} +33 -34
- package/dist/{lambda-config-reconcile-65U6I4KU.js → lambda-config-reconcile-47X5C2E4.js} +6 -5
- package/dist/{landed-QA6PRTV2.js → landed-F7PCHGCK.js} +3 -3
- package/dist/{landing-record-FCAWLCZU.js → landing-record-TPPYFQAS.js} +26 -25
- package/dist/{live-diff-IM4W3ELT.js → live-diff-5E2BQWQ7.js} +9 -8
- package/dist/local-engine-choice-S6VHPJRU.js +81 -0
- package/dist/local-engine-command-4EZCGZ6M.js +85 -0
- package/dist/{local-engine-config-W3KB7RWM.js → local-engine-config-2EBL3QKA.js} +3 -2
- package/dist/{local-engine-deploy-Y4OAWL7K.js → local-engine-deploy-FOPNWU7X.js} +18 -16
- package/dist/local-engine-lookup-GM3E3NPP.js +43 -0
- package/dist/local-engine-mcp-bridge-QKZHUGW3.js +423 -0
- package/dist/local-engine-mcp-command-BFQVLXZC.js +181 -0
- package/dist/{local-engine-process-6YPJHKYM.js → local-engine-process-XUQPQENQ.js} +12 -9
- package/dist/{local-engine-state-OCW5YDD7.js → local-engine-state-JQPKGB65.js} +4 -3
- package/dist/{local-engine-update-check-X7TZGRFL.js → local-engine-update-check-S7UF6ZF5.js} +7 -6
- package/dist/{lock-WXXC3QHL.js → lock-HDCHD2ON.js} +4 -2
- package/dist/{lock-commands-PKDBNRSD.js → lock-commands-HJ6Y5QVS.js} +66 -64
- package/dist/{login-command-V4U4FA5G.js → login-command-JO55NZAS.js} +34 -33
- package/dist/{logout-command-TV3P545Z.js → logout-command-MPRIRSJA.js} +18 -17
- package/dist/{loop-VKHGQ6MP.js → loop-SUB6C2LK.js} +8 -9
- package/dist/{marketplace-command-LEFOAEAV.js → marketplace-command-BM6G257N.js} +90 -54
- package/dist/{marketplace-resolve-ME7O7JBJ.js → marketplace-resolve-AWH3RG57.js} +7 -6
- package/dist/{meta-client-TEEECA5W.js → meta-client-AOSWODQQ.js} +16 -15
- package/dist/{module-manifest-7YLGIRCY.js → module-manifest-GXI46PEF.js} +7 -4
- package/dist/node.d.ts +5 -5
- package/dist/node.js +68 -67
- package/dist/operation-outcome-4UKPXTNC.js +53 -0
- package/dist/{output-target-5FWX3NGZ.js → output-target-RAZ4KN5J.js} +22 -21
- package/dist/{package-manager-PRAHUSCN.js → package-manager-K762W7XT.js} +2 -2
- package/dist/{plan-disclosure-QGL5UYQR.js → plan-disclosure-JR52DWXN.js} +21 -21
- package/dist/{plugin-contributions-GNFTWDEB.js → plugin-contributions-E6XHLQWK.js} +6 -6
- package/dist/{plugin-prompt-VEQGMZ4T.js → plugin-prompt-IODX5EU6.js} +5 -5
- package/dist/{plugin-questions-BGRL23GO.js → plugin-questions-AAAJ7POP.js} +4 -4
- package/dist/plugin.d.ts +254 -10
- package/dist/{preflight-command-VKJKXRRI.js → preflight-command-7GKJBWOQ.js} +71 -70
- package/dist/{profile-command-P7A3BH26.js → profile-command-CM6J7E2M.js} +35 -34
- package/dist/{profile-pointer-HG7IXE4I.js → profile-pointer-KTYXL6FU.js} +5 -4
- package/dist/{project-dependency-Z4CKOCJI.js → project-dependency-OQ5575QQ.js} +11 -8
- package/dist/{project-sdk-JWZWGXXR.js → project-sdk-2ESHHZVL.js} +4 -4
- package/dist/promote-command-BDRPG6UU.js +147 -0
- package/dist/{prompt-SURZOUUW.js → prompt-MQPGU4ZI.js} +4 -4
- package/dist/{publish-command-HGAB3H4A.js → publish-command-IEMYZ7LF.js} +69 -67
- package/dist/pull-command-S5E2ABZ4.js +169 -0
- package/dist/{pull-superseded-TOT5S4QU.js → pull-superseded-E34BZVLH.js} +4 -4
- package/dist/{raw-where-EoWl5fqY.d.ts → raw-where-ZMLND6AG.d.ts} +20 -3
- package/dist/release-command-7F5TBKO2.js +151 -0
- package/dist/{release-ns-command-WOQE2BDQ.js → release-ns-command-EK2ZQ4CC.js} +101 -100
- package/dist/{retry-command-JRGMZZAC.js → retry-command-GL5HCMVB.js} +10 -9
- package/dist/{routes-manifest-URFMAWJE.js → routes-manifest-YR4ZIMLM.js} +15 -7
- package/dist/routes-manifest-file-LCIKPDAG.js +41 -0
- package/dist/scaffold.js +4 -4
- package/dist/secrets-IV4N5HYI.js +20 -0
- package/dist/{secrets-file-YWZWVJ52.js → secrets-file-LXREYU3M.js} +21 -20
- package/dist/{secrets-fill-command-HIHK3VH2.js → secrets-fill-command-QHZS3KWM.js} +64 -62
- package/dist/{seed-24DTEY5S.js → seed-FRKMDN2Z.js} +9 -9
- package/dist/{source-resolve-OWD3MIEO.js → source-resolve-BBHYTOXI.js} +26 -24
- package/dist/{static-host-UIR2OLPQ.js → static-host-7LC7OZR4.js} +5 -5
- package/dist/{status-command-JKTHH5QE.js → status-command-TY253MJT.js} +54 -52
- package/dist/{store-zxw2go0f.d.ts → store-Boba9OOh.d.ts} +2 -2
- package/dist/{store-5YAQS6KU.js → store-VJ3OS6VO.js} +8 -7
- package/dist/sync-baseline-DOV5AGIO.js +36 -0
- package/dist/{sync-contributions-RBB6JVOL.js → sync-contributions-63542VE4.js} +20 -12
- package/dist/sync-record-RGHK7EAL.js +43 -0
- package/dist/{table-MQFVYA4K.js → table-OAYGFGEN.js} +8 -8
- package/dist/{tables-command-5Q4BSUNO.js → tables-command-PZIVDAH3.js} +45 -43
- package/dist/{tenant-Q3LPVSSM.js → tenant-Y3II4VY3.js} +12 -11
- package/dist/{tenant-command-BFVU2PEX.js → tenant-command-G6XON7CF.js} +113 -107
- package/dist/{test-command-F4VUU4QR.js → test-command-3FZOX7O3.js} +44 -42
- package/dist/{tests-5ZSDFVIJ.js → tests-KF6N6BZ7.js} +6 -6
- package/dist/{token-TERSTNU4.js → token-DJJUW5HY.js} +14 -13
- package/dist/toolchain-hooks-7PWCFLSU.js +46 -0
- package/dist/{toolchain-modules-FD5ANV2U.js → toolchain-modules-OTNSKK52.js} +8 -5
- package/dist/toolchain-peers-KQ7TQ2AR.js +28 -0
- package/dist/tracked-backend-AJCGTO5Y.js +82 -0
- package/dist/{update-check-O4C2LCZH.js → update-check-4E5L6GAW.js} +61 -59
- package/dist/{upgrade-command-NVFWLMTA.js → upgrade-command-BXMSQN4C.js} +68 -64
- package/dist/{whoami-command-YKNTISIV.js → whoami-command-NLCCIEUM.js} +17 -16
- package/dist/{workspace-GGVGE2S5.js → workspace-PNMJOXE4.js} +5 -5
- package/dist/{workspace-binding-OS4ZOX4S.js → workspace-binding-J5GWDFRI.js} +16 -15
- package/dist/{workspace-command-GTUNVN7K.js → workspace-command-MHIIY352.js} +125 -93
- package/dist/{workspace-env-467C5KHM.js → workspace-env-LLRWCHSA.js} +17 -16
- package/dist/{workspace-export-3XTVGQVM.js → workspace-export-BIKAYHWJ.js} +5 -5
- package/dist/{writable-7SSWUQJ3.js → writable-UOTO4WWC.js} +4 -4
- package/dist/{xano-6RS5XQZE.js → xano-LCI7VWPS.js} +8 -8
- package/dist/{xanosdk-import-E3WSIYUE.js → xanosdk-import-S7A3CVBN.js} +8 -8
- package/dist/{xanosdk-project-KH5TZ2KI.js → xanosdk-project-J4VCFRHP.js} +18 -17
- package/guides/README.md +2 -2
- package/guides/cli.md +73 -4
- package/guides/codegen.md +23 -5
- package/guides/codes.md +8 -2
- package/guides/coverage.md +5 -0
- package/guides/deploying.md +80 -0
- package/guides/marketplace.md +21 -0
- package/guides/module-contract.md +80 -4
- package/guides/scaffold.md +61 -10
- package/guides/typed-frontend.md +37 -0
- package/llms/client.md +11 -1
- package/llms/filters.md +4 -0
- package/llms/kinds-core.md +1 -1
- package/llms/statements-data.md +3 -2
- package/llms/toolchain.md +12 -0
- package/llms-full.txt +34 -7
- package/llms.txt +3 -3
- package/manifest.json +63 -5
- package/package.json +5 -2
- package/skills/xano-backend/SKILL.md +119 -0
- package/dist/chunk-F6IKWAIU.js +0 -664
- package/dist/chunk-M6ZFSTIZ.js +0 -630
- package/dist/chunk-MEIJDRHU.js +0 -243
- package/dist/deploy-source-5COWTBOC.js +0 -81
- package/dist/env-example-refresh-DWQIOQYR.js +0 -127
- package/dist/init-command-TI3HCKXZ.js +0 -126
- package/dist/local-engine-choice-FPJAZSSD.js +0 -79
- package/dist/operation-outcome-GNDD35WL.js +0 -51
- package/dist/promote-command-KHTIK44I.js +0 -141
- package/dist/pull-command-EUEWBRXZ.js +0 -162
- package/dist/release-command-WOVQAMUY.js +0 -147
- package/dist/toolchain-hooks-QVUZ6HZ4.js +0 -96
- package/dist/tracked-backend-B4HTME4S.js +0 -80
package/llms/client.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Consuming defs from a client
|
|
2
2
|
|
|
3
|
-
> Read when a frontend imports a def
|
|
3
|
+
> Read when a frontend calls the deployed backend or imports a def — request types and zod schemas without the import, its cost, `window.XANO_HOST`, local dev, file URLs, a Node spot-check.
|
|
4
4
|
|
|
5
5
|
Importing a def into a browser bundle or a Node script — for `getPath()`, `getUrl()`, `verb`, or `InferResponse` — runs its factory calls; these are the costs and the checks.
|
|
6
6
|
|
|
@@ -15,6 +15,16 @@ Importing a def into a browser bundle or a Node script — for `getPath()`, `get
|
|
|
15
15
|
plain data importing NOTHING, still compile-checked: `routePath("GET blog/{slug}", { slug })`
|
|
16
16
|
`channelPath("rooms/{room_id}", { room_id })`, `socketUrl("chat", baseUrl)` (tenant base
|
|
17
17
|
URLs lifted to `wss://h/ws/<tenant>:<canonical>`). A rename is a type error, not a 404.
|
|
18
|
+
- **Request types without the def.** `routes.gen.ts` also exports types-only `RouteInputs`,
|
|
19
|
+
`ChannelInputs`, `MessageInputs` (and `MessageName`), keyed like `ROUTES`, `CHANNELS`, and
|
|
20
|
+
`"<channel key> <message name>"`: `type NewListing = RouteInputs["POST listings"]`. A
|
|
21
|
+
frontend types bodies, channel params and payloads from these, not `InferInput` on a def;
|
|
22
|
+
keep `InferInput` in code that already imports defs. They match `InferInput`, except a
|
|
23
|
+
`dbLink` input appears as the linked table's columns (what the server accepts). Responses
|
|
24
|
+
are not in the file: `InferResponse` on an `import type` of the def.
|
|
25
|
+
Runtime validation: `xanosdk marketplace install zod` adds `@xano-sdk/zod`, which writes
|
|
26
|
+
`ROUTE_SCHEMAS`/`CHANNEL_SCHEMAS`/`MESSAGE_SCHEMAS` into the file under the same keys, each
|
|
27
|
+
checked against its type at typecheck; the file then imports `zod`, never `@xano/sdk`.
|
|
18
28
|
- **Verifying a def outside a bundler.** Inside a bundler (Vite/webpack) importing a
|
|
19
29
|
query def to read `getPath()`/`verb` works directly. To spot-check from Node, run a REAL
|
|
20
30
|
file with `tsx <file.ts>` **from inside the project root** — not `tsx -e "import …"`
|
package/llms/filters.md
CHANGED
|
@@ -27,6 +27,10 @@ with `c.obj`/`c.array`. Any argument also takes a runtime value (`inp`, `ref`, a
|
|
|
27
27
|
`withFilters` chain) — inside `obj()`/`expr()` an argument cannot carry its own filter
|
|
28
28
|
chain, so compute it in a prior `set_var`. The arg types below name each argument's
|
|
29
29
|
ENGINE type, not the JS type you may pass.
|
|
30
|
+
`fl.add`/`fl.sub`/`fl.mul` keep an INT when both operands are ints (`2 × 3` is `6`, not
|
|
31
|
+
`6.0`) and give a decimal only when either operand is one — the `decimal` return type
|
|
32
|
+
below covers both, so an int pipeline needs no `fl.to_int()`. `fl.div` is an int only
|
|
33
|
+
when it divides exactly.
|
|
30
34
|
To add to a numeric column (counter, stock, balance), use `s.db.increment`
|
|
31
35
|
(`llms/statements-data.md`) — one atomic UPDATE. A pipeline read-modify-write is NOT
|
|
32
36
|
atomic (concurrent writers lose updates), and `col("clicks")` does NOT resolve to the
|
package/llms/kinds-core.md
CHANGED
|
@@ -25,7 +25,7 @@ to survive a rename).
|
|
|
25
25
|
- `getPath` percent-encodes each value (so `?`/`#`/spaces stay in their segment) and throws on what encoding cannot contain: a `/`, and a segment that becomes `.`/`..` as sent (a URL parser drops those before routing, addressing a different endpoint).
|
|
26
26
|
- The keys are typed from the literal `name`, so a typo is a compile error.
|
|
27
27
|
- `q.toSearchParams(input)` drops GET path params (free `query.toSearchParams` keeps them); lists send `k[]=a&k[]=b` (`k=a&k=b` binds only `b`).
|
|
28
|
-
- Browser bundle cost, the `routes.gen.ts` alternative, and spot-checking a def from Node: `llms/client.md`.
|
|
28
|
+
- Browser bundle cost, the `routes.gen.ts` alternative (paths and request types), and spot-checking a def from Node: `llms/client.md`.
|
|
29
29
|
- `apiGroup({ name, guid?, canonical?, description?, docs?, swagger?, apiGroupEnabled?, documentation?, cors?, middleware? })` — a query container; queries bind to it via their `apiGroup`. `canonical` holds only letters, digits, `_` and `-` (it is the `<canonical>` of `/api:<canonical>`); anything else THROWS at build.
|
|
30
30
|
- `documentation?`: `{ require_token? }` — the gate on this group's hosted docs. `require_token: true` IS the declaration; the token lives in `xano/.secrets.json` under this group's guid, and a literal `token` FAILS the export. ⚠ ALWAYS emitted, present or not: an absent key is written as the engine default on import, so omitting the block CLEARS an existing gate (the opposite of the `workspaceConfig` rule). `swagger: true` publishes the docs; `require_token` gates them only alongside a non-empty token, so `swagger: true` with no gate makes the whole group readable by anyone with the URL — export warns once per build and `--strict` fails; `diagnostics: { allow: ["api-group.docs-public"] }` accepts it. A declared gate with NO token drops the block, so those bytes clear it: export FAILS under `swagger: true`, and with `swagger` off warns and completes.
|
|
31
31
|
- `cors?`: `{ mode?, allowOrigins?: string[], allowHeaders?: string[], allowCredentials?, maxAge?, allowMethods?: { get?, post?, put?, patch?, delete?, head? } }`.
|
package/llms/statements-data.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Array blocks (an `if`/`transform` is applied per item):
|
|
6
6
|
|
|
7
|
-
- `s.array.map({ source, as?, transform? })` — `transform` is either a per-item `Value` expression (each item maps to that value) or a **record of values** (each item maps to an object with those keys), or a list of `{ key, value }` pairs, for a key computed per item or two rows sharing one. Use `ref("$this")` for the item and `ref("$index")` for its position. These are THIS statement's own bindings, in a value expression — not the JavaScript lambda contract (see **Lambda bodies**), which binds a different set per surface and is written with `lam.fn`.
|
|
7
|
+
- `s.array.map({ source, as?, transform? })` — `transform` is either a per-item `Value` expression (each item maps to that value) or a **record of values** (each item maps to an object with those keys), or a list of `{ key, value }` pairs, for a key computed per item or two rows sharing one. Use `ref("$this")` for the item and `ref("$index")` for its position. A `transform` value, filter arguments included, can read `ref("$this.<path>")` and any outer stack variable or input. These are THIS statement's own bindings, in a value expression — not the JavaScript lambda contract (see **Lambda bodies**), which binds a different set per surface and is written with `lam.fn`.
|
|
8
8
|
- `s.array.union({ source, with, as?, transform? })` — set-union two arrays. `with` is REQUIRED; omitted → `Unable to locate input: `.
|
|
9
9
|
|
|
10
10
|
DB reads/writes (`table` is a def handle or name; `fieldName` defaults to the
|
|
@@ -58,7 +58,8 @@ primary key `id`):
|
|
|
58
58
|
- Template placeholders are Twig over the request scope: `{{ $input.name }}` for an input, `{{ $var.name }}` for a stack variable. ⚠ A BARE `{{ name }}` renders as the empty string — HTTP 200, no error, a query that silently ran with a blank where the value belonged. A bound `?` arg carries a VALUE without the template at all.
|
|
59
59
|
- ⚠ A table's PHYSICAL name is **not stable across deploys**. A deploy is a full replace, so every table is created afresh and the id in its name moves every time — the same unchanged project redeployed three times gave one table three different names. Never store, cache, hardcode or fixture one: resolve it from `information_schema` inside the same request that uses it.
|
|
60
60
|
- `s.db.external.<engine>.direct_query({ sql, connectionString, responseType?, args?, parser?, as? })` — same shape against an EXTERNAL database; `<engine>` is `postgres`/`mysql`/`mssql`/`oracle`/`snowflake`. `connectionString` is a `Value` — reach for `env(...)`, not a literal — stored as `context.connection_string_flex`. A bare string stores the older `context.connection_string` instead (an env-var name unless it looks like a URL); each form round-trips as itself.
|
|
61
|
-
- `s.db.transaction({ body
|
|
61
|
+
- `s.db.transaction({ body })` — run a `Statement[]` atomically. It returns nothing, so it takes no `as`: read what the body binds. An `s.return` in the body ends the WHOLE stack with that value, and the writes before it commit.
|
|
62
|
+
- The body shares the enclosing stack: a variable it binds (`as: "order"` on an `s.db.add`) is still bound AFTER the transaction.
|
|
62
63
|
- `s.db.bulk.add({ table, items, allowIdField?, as? })` / `s.db.bulk.update` / `s.db.bulk.patch` — `items` is an array `Value`.
|
|
63
64
|
- ⚠ `bulk.add` **drops `id` on every row unless `allowIdField: true`** (silently, next sequence value instead) — the opposite of `seed`, where `id` pins. Rows referenced by a foreign key need `allowIdField: true`; literal `items` carrying `id` without it throw. `bulk.update`/`patch` keep `id` (their match key).
|
|
64
65
|
- ⚠ **`bulk.update` is a whole-row REPLACE: every column an item OMITS is zeroed** (`""`/`0`/`null`), HTTP 200, no error — `{ id: 7, status: "done" }` blanks the rest of row 7. **Use `s.db.bulk.patch`** for the partial write "update these rows" means. `export()` warns on a STATIC `items` missing columns (`--strict` fails); a `ref`/`inp` `items` is uninspectable.
|
package/llms/toolchain.md
CHANGED
|
@@ -14,3 +14,15 @@ shipped defaults. `marketplace reinstall <pkg>` re-asks with the current setting
|
|
|
14
14
|
defaults and re-enables a disabled one; `marketplace remove <pkg>` drops block, lines and
|
|
15
15
|
dependency together — a plain `npm uninstall` leaves the block, and a package it names
|
|
16
16
|
that is no longer installed fails every `--frozen-lock` run.
|
|
17
|
+
|
|
18
|
+
**A module's section of `xano/routes.gen.ts`.** A module with a `routesManifest` hook (types:
|
|
19
|
+
`@xano/sdk/plugin`) writes a block between `// xanosdk:begin <pkg>` and `// xanosdk:end <pkg>`
|
|
20
|
+
after the core sections, on every write of the file (`routes --emit`, `xano:routes`, `pull`,
|
|
21
|
+
`generate`, `marketplace install|reinstall|remove`). Edits inside the block are overwritten.
|
|
22
|
+
Install also adds the module's non-SDK peers (e.g. `zod`) as direct dependencies.
|
|
23
|
+
The hook is synchronous and pure: given
|
|
24
|
+
the request inputs under the manifest's keys and its config, it returns `{ imports?, source }`,
|
|
25
|
+
imports as bare package names (`@xano/sdk*`, relative and `node:` are refused). A module that
|
|
26
|
+
fails to load or throws leaves its previous block as it was, with a warning naming it, and the
|
|
27
|
+
core sections still refresh; under `routes --emit --strict` it is fatal. `@xano-sdk/zod`
|
|
28
|
+
(`xanosdk marketplace install zod`) is one: it adds `ROUTE_SCHEMAS` and its siblings.
|
package/llms-full.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanosdk v1.0.
|
|
1
|
+
# xanosdk v1.0.7
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -39,7 +39,7 @@ plain file read resolves them at the version you have.
|
|
|
39
39
|
|
|
40
40
|
- [Object kinds](llms/object-kinds.md): Read when deciding WHAT to build — every authorable primitive, what each is, and which factory + register method builds it. Also when `register*` will not typecheck an array built by `.flatMap()`/`.concat()`.
|
|
41
41
|
- [Core def shapes](llms/kinds-core.md): Read when authoring a function, query, api group, task, workflow test, middleware, tool, or addon — and for the `response` and `expr` shapes every one of them uses.
|
|
42
|
-
- [Consuming defs from a client](llms/client.md): Read when a frontend imports a def
|
|
42
|
+
- [Consuming defs from a client](llms/client.md): Read when a frontend calls the deployed backend or imports a def — request types and zod schemas without the import, its cost, `window.XANO_HOST`, local dev, file URLs, a Node spot-check.
|
|
43
43
|
- [Toolchain modules](llms/toolchain.md): Read when `package.json` has a `"xanosdk"` block or you run `xanosdk marketplace`.
|
|
44
44
|
- [Error index](llms/errors.md): Read when a request, test, build, or pull fails with a message you did not write — the string, its cause, and where the fix is.
|
|
45
45
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement needs a `mock`, or when running a deployed environment's tests.
|
|
@@ -436,7 +436,7 @@ Non-obvious authoring rules:
|
|
|
436
436
|
checked only by the `xanosdk export`/`deploy` CLI path. Only `deploy` ships seed rows.
|
|
437
437
|
- Entry points: the `node:fs` writers (`writeBundle`/`writeArtifact`) and lock-file I/O
|
|
438
438
|
import from `@xano/sdk/node`, NOT the browser-safe `@xano/sdk` entry (a frontend
|
|
439
|
-
imports
|
|
439
|
+
imports from it; request types come from `routes.gen.ts`). `@xano/sdk/internal` is the
|
|
440
440
|
compiler machinery, never needed to author. READING a bundle back is `@xano/sdk/bundle`
|
|
441
441
|
— a statement walker (`2.if.0` paths), a structural hash, `mvp:*` catalog, `tableRefOf`.
|
|
442
442
|
- **Intra-workspace imports use `.js` specifiers** (`../tables/links.js`), not
|
|
@@ -554,7 +554,7 @@ to survive a rename).
|
|
|
554
554
|
- `getPath` percent-encodes each value (so `?`/`#`/spaces stay in their segment) and throws on what encoding cannot contain: a `/`, and a segment that becomes `.`/`..` as sent (a URL parser drops those before routing, addressing a different endpoint).
|
|
555
555
|
- The keys are typed from the literal `name`, so a typo is a compile error.
|
|
556
556
|
- `q.toSearchParams(input)` drops GET path params (free `query.toSearchParams` keeps them); lists send `k[]=a&k[]=b` (`k=a&k=b` binds only `b`).
|
|
557
|
-
- Browser bundle cost, the `routes.gen.ts` alternative, and spot-checking a def from Node: `llms/client.md`.
|
|
557
|
+
- Browser bundle cost, the `routes.gen.ts` alternative (paths and request types), and spot-checking a def from Node: `llms/client.md`.
|
|
558
558
|
- `apiGroup({ name, guid?, canonical?, description?, docs?, swagger?, apiGroupEnabled?, documentation?, cors?, middleware? })` — a query container; queries bind to it via their `apiGroup`. `canonical` holds only letters, digits, `_` and `-` (it is the `<canonical>` of `/api:<canonical>`); anything else THROWS at build.
|
|
559
559
|
- `documentation?`: `{ require_token? }` — the gate on this group's hosted docs. `require_token: true` IS the declaration; the token lives in `xano/.secrets.json` under this group's guid, and a literal `token` FAILS the export. ⚠ ALWAYS emitted, present or not: an absent key is written as the engine default on import, so omitting the block CLEARS an existing gate (the opposite of the `workspaceConfig` rule). `swagger: true` publishes the docs; `require_token` gates them only alongside a non-empty token, so `swagger: true` with no gate makes the whole group readable by anyone with the URL — export warns once per build and `--strict` fails; `diagnostics: { allow: ["api-group.docs-public"] }` accepts it. A declared gate with NO token drops the block, so those bytes clear it: export FAILS under `swagger: true`, and with `swagger` off warns and completes.
|
|
560
560
|
- `cors?`: `{ mode?, allowOrigins?: string[], allowHeaders?: string[], allowCredentials?, maxAge?, allowMethods?: { get?, post?, put?, patch?, delete?, head? } }`.
|
|
@@ -630,7 +630,7 @@ surface — `s.conditional`/`s.while` `when` (incl. each `elif` branch), and
|
|
|
630
630
|
|
|
631
631
|
# Consuming defs from a client
|
|
632
632
|
|
|
633
|
-
> Read when a frontend imports a def
|
|
633
|
+
> Read when a frontend calls the deployed backend or imports a def — request types and zod schemas without the import, its cost, `window.XANO_HOST`, local dev, file URLs, a Node spot-check.
|
|
634
634
|
|
|
635
635
|
Importing a def into a browser bundle or a Node script — for `getPath()`, `getUrl()`, `verb`, or `InferResponse` — runs its factory calls; these are the costs and the checks.
|
|
636
636
|
|
|
@@ -645,6 +645,16 @@ Importing a def into a browser bundle or a Node script — for `getPath()`, `get
|
|
|
645
645
|
plain data importing NOTHING, still compile-checked: `routePath("GET blog/{slug}", { slug })`
|
|
646
646
|
`channelPath("rooms/{room_id}", { room_id })`, `socketUrl("chat", baseUrl)` (tenant base
|
|
647
647
|
URLs lifted to `wss://h/ws/<tenant>:<canonical>`). A rename is a type error, not a 404.
|
|
648
|
+
- **Request types without the def.** `routes.gen.ts` also exports types-only `RouteInputs`,
|
|
649
|
+
`ChannelInputs`, `MessageInputs` (and `MessageName`), keyed like `ROUTES`, `CHANNELS`, and
|
|
650
|
+
`"<channel key> <message name>"`: `type NewListing = RouteInputs["POST listings"]`. A
|
|
651
|
+
frontend types bodies, channel params and payloads from these, not `InferInput` on a def;
|
|
652
|
+
keep `InferInput` in code that already imports defs. They match `InferInput`, except a
|
|
653
|
+
`dbLink` input appears as the linked table's columns (what the server accepts). Responses
|
|
654
|
+
are not in the file: `InferResponse` on an `import type` of the def.
|
|
655
|
+
Runtime validation: `xanosdk marketplace install zod` adds `@xano-sdk/zod`, which writes
|
|
656
|
+
`ROUTE_SCHEMAS`/`CHANNEL_SCHEMAS`/`MESSAGE_SCHEMAS` into the file under the same keys, each
|
|
657
|
+
checked against its type at typecheck; the file then imports `zod`, never `@xano/sdk`.
|
|
648
658
|
- **Verifying a def outside a bundler.** Inside a bundler (Vite/webpack) importing a
|
|
649
659
|
query def to read `getPath()`/`verb` works directly. To spot-check from Node, run a REAL
|
|
650
660
|
file with `tsx <file.ts>` **from inside the project root** — not `tsx -e "import …"`
|
|
@@ -708,6 +718,18 @@ defaults and re-enables a disabled one; `marketplace remove <pkg>` drops block,
|
|
|
708
718
|
dependency together — a plain `npm uninstall` leaves the block, and a package it names
|
|
709
719
|
that is no longer installed fails every `--frozen-lock` run.
|
|
710
720
|
|
|
721
|
+
**A module's section of `xano/routes.gen.ts`.** A module with a `routesManifest` hook (types:
|
|
722
|
+
`@xano/sdk/plugin`) writes a block between `// xanosdk:begin <pkg>` and `// xanosdk:end <pkg>`
|
|
723
|
+
after the core sections, on every write of the file (`routes --emit`, `xano:routes`, `pull`,
|
|
724
|
+
`generate`, `marketplace install|reinstall|remove`). Edits inside the block are overwritten.
|
|
725
|
+
Install also adds the module's non-SDK peers (e.g. `zod`) as direct dependencies.
|
|
726
|
+
The hook is synchronous and pure: given
|
|
727
|
+
the request inputs under the manifest's keys and its config, it returns `{ imports?, source }`,
|
|
728
|
+
imports as bare package names (`@xano/sdk*`, relative and `node:` are refused). A module that
|
|
729
|
+
fails to load or throws leaves its previous block as it was, with a warning naming it, and the
|
|
730
|
+
core sections still refresh; under `routes --emit --strict` it is fatal. `@xano-sdk/zod`
|
|
731
|
+
(`xanosdk marketplace install zod`) is one: it adds `ROUTE_SCHEMAS` and its siblings.
|
|
732
|
+
|
|
711
733
|
# Error index
|
|
712
734
|
|
|
713
735
|
> Read when a request, test, build, or pull fails with a message you did not write — the string, its cause, and where the fix is.
|
|
@@ -997,7 +1019,7 @@ off); a trigger's own failure reaches the error log only while it is on.
|
|
|
997
1019
|
|
|
998
1020
|
Array blocks (an `if`/`transform` is applied per item):
|
|
999
1021
|
|
|
1000
|
-
- `s.array.map({ source, as?, transform? })` — `transform` is either a per-item `Value` expression (each item maps to that value) or a **record of values** (each item maps to an object with those keys), or a list of `{ key, value }` pairs, for a key computed per item or two rows sharing one. Use `ref("$this")` for the item and `ref("$index")` for its position. These are THIS statement's own bindings, in a value expression — not the JavaScript lambda contract (see **Lambda bodies**), which binds a different set per surface and is written with `lam.fn`.
|
|
1022
|
+
- `s.array.map({ source, as?, transform? })` — `transform` is either a per-item `Value` expression (each item maps to that value) or a **record of values** (each item maps to an object with those keys), or a list of `{ key, value }` pairs, for a key computed per item or two rows sharing one. Use `ref("$this")` for the item and `ref("$index")` for its position. A `transform` value, filter arguments included, can read `ref("$this.<path>")` and any outer stack variable or input. These are THIS statement's own bindings, in a value expression — not the JavaScript lambda contract (see **Lambda bodies**), which binds a different set per surface and is written with `lam.fn`.
|
|
1001
1023
|
- `s.array.union({ source, with, as?, transform? })` — set-union two arrays. `with` is REQUIRED; omitted → `Unable to locate input: `.
|
|
1002
1024
|
|
|
1003
1025
|
DB reads/writes (`table` is a def handle or name; `fieldName` defaults to the
|
|
@@ -1051,7 +1073,8 @@ primary key `id`):
|
|
|
1051
1073
|
- Template placeholders are Twig over the request scope: `{{ $input.name }}` for an input, `{{ $var.name }}` for a stack variable. ⚠ A BARE `{{ name }}` renders as the empty string — HTTP 200, no error, a query that silently ran with a blank where the value belonged. A bound `?` arg carries a VALUE without the template at all.
|
|
1052
1074
|
- ⚠ A table's PHYSICAL name is **not stable across deploys**. A deploy is a full replace, so every table is created afresh and the id in its name moves every time — the same unchanged project redeployed three times gave one table three different names. Never store, cache, hardcode or fixture one: resolve it from `information_schema` inside the same request that uses it.
|
|
1053
1075
|
- `s.db.external.<engine>.direct_query({ sql, connectionString, responseType?, args?, parser?, as? })` — same shape against an EXTERNAL database; `<engine>` is `postgres`/`mysql`/`mssql`/`oracle`/`snowflake`. `connectionString` is a `Value` — reach for `env(...)`, not a literal — stored as `context.connection_string_flex`. A bare string stores the older `context.connection_string` instead (an env-var name unless it looks like a URL); each form round-trips as itself.
|
|
1054
|
-
- `s.db.transaction({ body
|
|
1076
|
+
- `s.db.transaction({ body })` — run a `Statement[]` atomically. It returns nothing, so it takes no `as`: read what the body binds. An `s.return` in the body ends the WHOLE stack with that value, and the writes before it commit.
|
|
1077
|
+
- The body shares the enclosing stack: a variable it binds (`as: "order"` on an `s.db.add`) is still bound AFTER the transaction.
|
|
1055
1078
|
- `s.db.bulk.add({ table, items, allowIdField?, as? })` / `s.db.bulk.update` / `s.db.bulk.patch` — `items` is an array `Value`.
|
|
1056
1079
|
- ⚠ `bulk.add` **drops `id` on every row unless `allowIdField: true`** (silently, next sequence value instead) — the opposite of `seed`, where `id` pins. Rows referenced by a foreign key need `allowIdField: true`; literal `items` carrying `id` without it throw. `bulk.update`/`patch` keep `id` (their match key).
|
|
1057
1080
|
- ⚠ **`bulk.update` is a whole-row REPLACE: every column an item OMITS is zeroed** (`""`/`0`/`null`), HTTP 200, no error — `{ id: 7, status: "done" }` blanks the rest of row 7. **Use `s.db.bulk.patch`** for the partial write "update these rows" means. `export()` warns on a STATIC `items` missing columns (`--strict` fails); a `ref`/`inp` `items` is uninspectable.
|
|
@@ -1428,6 +1451,10 @@ with `c.obj`/`c.array`. Any argument also takes a runtime value (`inp`, `ref`, a
|
|
|
1428
1451
|
`withFilters` chain) — inside `obj()`/`expr()` an argument cannot carry its own filter
|
|
1429
1452
|
chain, so compute it in a prior `set_var`. The arg types below name each argument's
|
|
1430
1453
|
ENGINE type, not the JS type you may pass.
|
|
1454
|
+
`fl.add`/`fl.sub`/`fl.mul` keep an INT when both operands are ints (`2 × 3` is `6`, not
|
|
1455
|
+
`6.0`) and give a decimal only when either operand is one — the `decimal` return type
|
|
1456
|
+
below covers both, so an int pipeline needs no `fl.to_int()`. `fl.div` is an int only
|
|
1457
|
+
when it divides exactly.
|
|
1431
1458
|
To add to a numeric column (counter, stock, balance), use `s.db.increment`
|
|
1432
1459
|
(`llms/statements-data.md`) — one atomic UPDATE. A pipeline read-modify-write is NOT
|
|
1433
1460
|
atomic (concurrent writers lose updates), and `col("clicks")` does NOT resolve to the
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanosdk v1.0.
|
|
1
|
+
# xanosdk v1.0.7
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -39,7 +39,7 @@ plain file read resolves them at the version you have.
|
|
|
39
39
|
|
|
40
40
|
- [Object kinds](llms/object-kinds.md): Read when deciding WHAT to build — every authorable primitive, what each is, and which factory + register method builds it. Also when `register*` will not typecheck an array built by `.flatMap()`/`.concat()`.
|
|
41
41
|
- [Core def shapes](llms/kinds-core.md): Read when authoring a function, query, api group, task, workflow test, middleware, tool, or addon — and for the `response` and `expr` shapes every one of them uses.
|
|
42
|
-
- [Consuming defs from a client](llms/client.md): Read when a frontend imports a def
|
|
42
|
+
- [Consuming defs from a client](llms/client.md): Read when a frontend calls the deployed backend or imports a def — request types and zod schemas without the import, its cost, `window.XANO_HOST`, local dev, file URLs, a Node spot-check.
|
|
43
43
|
- [Toolchain modules](llms/toolchain.md): Read when `package.json` has a `"xanosdk"` block or you run `xanosdk marketplace`.
|
|
44
44
|
- [Error index](llms/errors.md): Read when a request, test, build, or pull fails with a message you did not write — the string, its cause, and where the fix is.
|
|
45
45
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement needs a `mock`, or when running a deployed environment's tests.
|
|
@@ -436,7 +436,7 @@ Non-obvious authoring rules:
|
|
|
436
436
|
checked only by the `xanosdk export`/`deploy` CLI path. Only `deploy` ships seed rows.
|
|
437
437
|
- Entry points: the `node:fs` writers (`writeBundle`/`writeArtifact`) and lock-file I/O
|
|
438
438
|
import from `@xano/sdk/node`, NOT the browser-safe `@xano/sdk` entry (a frontend
|
|
439
|
-
imports
|
|
439
|
+
imports from it; request types come from `routes.gen.ts`). `@xano/sdk/internal` is the
|
|
440
440
|
compiler machinery, never needed to author. READING a bundle back is `@xano/sdk/bundle`
|
|
441
441
|
— a statement walker (`2.if.0` paths), a structural hash, `mvp:*` catalog, `tableRefOf`.
|
|
442
442
|
- **Intra-workspace imports use `.js` specifiers** (`../tables/links.js`), not
|
package/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xanosdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.",
|
|
5
5
|
"coverage": {
|
|
6
6
|
"objectKinds": {
|
|
@@ -8997,6 +8997,48 @@
|
|
|
8997
8997
|
}
|
|
8998
8998
|
],
|
|
8999
8999
|
"cli": [
|
|
9000
|
+
{
|
|
9001
|
+
"command": "agent-skill install",
|
|
9002
|
+
"flags": [
|
|
9003
|
+
{
|
|
9004
|
+
"flag": "--agent <id>",
|
|
9005
|
+
"description": "Which agent to act for, instead of the ones detected (repeatable): claude-code, agents (the shared ~/.agents directory), codex, cursor, copilot, gemini, amp, opencode"
|
|
9006
|
+
},
|
|
9007
|
+
{
|
|
9008
|
+
"flag": "--dry-run",
|
|
9009
|
+
"description": "Report what would change and write nothing"
|
|
9010
|
+
},
|
|
9011
|
+
{
|
|
9012
|
+
"flag": "--force",
|
|
9013
|
+
"description": "Replace a copy that was edited since it was installed"
|
|
9014
|
+
}
|
|
9015
|
+
],
|
|
9016
|
+
"description": "Write the skill into the user-level skill directory of each detected agent; an edited copy is left alone unless --force"
|
|
9017
|
+
},
|
|
9018
|
+
{
|
|
9019
|
+
"command": "agent-skill status",
|
|
9020
|
+
"flags": [
|
|
9021
|
+
{
|
|
9022
|
+
"flag": "--agent <id>",
|
|
9023
|
+
"description": "Which agent to act for, instead of the ones detected (repeatable): claude-code, agents (the shared ~/.agents directory), codex, cursor, copilot, gemini, amp, opencode"
|
|
9024
|
+
}
|
|
9025
|
+
],
|
|
9026
|
+
"description": "Report each copy as current, stale, edited or absent"
|
|
9027
|
+
},
|
|
9028
|
+
{
|
|
9029
|
+
"command": "agent-skill uninstall",
|
|
9030
|
+
"flags": [
|
|
9031
|
+
{
|
|
9032
|
+
"flag": "--agent <id>",
|
|
9033
|
+
"description": "Which agent to act for, instead of the ones detected (repeatable): claude-code, agents (the shared ~/.agents directory), codex, cursor, copilot, gemini, amp, opencode"
|
|
9034
|
+
},
|
|
9035
|
+
{
|
|
9036
|
+
"flag": "--dry-run",
|
|
9037
|
+
"description": "Report what would be removed and remove nothing"
|
|
9038
|
+
}
|
|
9039
|
+
],
|
|
9040
|
+
"description": "Remove the copies install wrote; an edited copy is reported and kept"
|
|
9041
|
+
},
|
|
9000
9042
|
{
|
|
9001
9043
|
"command": "compile",
|
|
9002
9044
|
"args": "<file>",
|
|
@@ -9655,10 +9697,11 @@
|
|
|
9655
9697
|
},
|
|
9656
9698
|
{
|
|
9657
9699
|
"flag": "--framework <id>",
|
|
9658
|
-
"description": "Frontend
|
|
9700
|
+
"description": "Frontend to scaffold in a new project: react (default), svelte, or none for the backend only. A non-empty directory always gets the backend only",
|
|
9659
9701
|
"values": [
|
|
9660
9702
|
"react",
|
|
9661
|
-
"svelte"
|
|
9703
|
+
"svelte",
|
|
9704
|
+
"none"
|
|
9662
9705
|
]
|
|
9663
9706
|
},
|
|
9664
9707
|
{
|
|
@@ -9777,7 +9820,7 @@
|
|
|
9777
9820
|
},
|
|
9778
9821
|
{
|
|
9779
9822
|
"flag": "--force",
|
|
9780
|
-
"description": "Write
|
|
9823
|
+
"description": "Write over what clashes when adding the backend to a non-empty target directory: an existing xano/, a file init would write, a xano:* script with another command. It lists every file and script it would overwrite and confirms first (--yes without a terminal); files the scaffold does not write are kept"
|
|
9781
9824
|
},
|
|
9782
9825
|
{
|
|
9783
9826
|
"flag": "--no-install",
|
|
@@ -9851,7 +9894,7 @@
|
|
|
9851
9894
|
]
|
|
9852
9895
|
}
|
|
9853
9896
|
],
|
|
9854
|
-
"description": "Scaffold a Xano SDK project — empty, or filled from an existing backend"
|
|
9897
|
+
"description": "Scaffold a Xano SDK project — empty, or filled from an existing backend. In a non-empty directory, add the backend to the project there"
|
|
9855
9898
|
},
|
|
9856
9899
|
{
|
|
9857
9900
|
"command": "local cache",
|
|
@@ -9876,6 +9919,21 @@
|
|
|
9876
9919
|
"command": "local list",
|
|
9877
9920
|
"description": "List Xano Engines on this machine, marking the ones xanosdk started"
|
|
9878
9921
|
},
|
|
9922
|
+
{
|
|
9923
|
+
"command": "local mcp",
|
|
9924
|
+
"args": "[name]",
|
|
9925
|
+
"flags": [
|
|
9926
|
+
{
|
|
9927
|
+
"flag": "--stdio",
|
|
9928
|
+
"description": "Run as an MCP stdio server that forwards to the live engine with its current bearer — the command a coding agent's MCP config launches"
|
|
9929
|
+
},
|
|
9930
|
+
{
|
|
9931
|
+
"flag": "--project <dir>",
|
|
9932
|
+
"description": "The project whose engine to reach, when the agent launches the bridge outside it (default: the current directory)"
|
|
9933
|
+
}
|
|
9934
|
+
],
|
|
9935
|
+
"description": "Print how a coding agent connects to a Xano Engine's MCP server (look at the backend, seed rows, run functions, tasks, triggers, endpoints and tests); `--stdio` runs the bridge the agent's MCP config launches (default: the engine this project deployed to)"
|
|
9936
|
+
},
|
|
9879
9937
|
{
|
|
9880
9938
|
"command": "local stop",
|
|
9881
9939
|
"args": "<name>",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xano/sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Xano SDK — your Xano backend as TypeScript. `xanosdk deploy` ships your typed workspace (and an optional static frontend) to a live, auto-expiring ephemeral environment and prints its URL. init → deploy → URL.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xanosdk",
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"llms-full.txt",
|
|
87
87
|
"llms",
|
|
88
88
|
"guides",
|
|
89
|
+
"skills",
|
|
89
90
|
"README.md",
|
|
90
91
|
"CHANGELOG.md"
|
|
91
92
|
],
|
|
@@ -107,6 +108,8 @@
|
|
|
107
108
|
"audit:output-flag": "tsx scripts/audit-output-flag.ts",
|
|
108
109
|
"audit:decode-coverage": "tsx scripts/audit-decode-coverage.ts",
|
|
109
110
|
"audit:dts": "npm run build && tsx scripts/audit-dts.ts",
|
|
111
|
+
"eval:skill-trigger": "tsx scripts/eval-skill-trigger.ts",
|
|
112
|
+
"eval:skill-scenarios": "tsx scripts/eval-skill-scenarios.ts",
|
|
110
113
|
"manifest": "tsx scripts/manifest.ts",
|
|
111
114
|
"codes": "tsx scripts/codes.ts",
|
|
112
115
|
"changelog": "tsx scripts/changelog.ts",
|
|
@@ -152,7 +155,7 @@
|
|
|
152
155
|
"eslint": "^9.0.0",
|
|
153
156
|
"gpt-tokenizer": "^3.4.0",
|
|
154
157
|
"tsup": "^8.0.0",
|
|
155
|
-
"tsx": "^4.
|
|
158
|
+
"tsx": "^4.23.15",
|
|
156
159
|
"typescript": "^5.5.0",
|
|
157
160
|
"vitest": "^4.1.11"
|
|
158
161
|
},
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xano-backend
|
|
3
|
+
description: >-
|
|
4
|
+
Builds and runs application backends on Xano, authored as TypeScript with
|
|
5
|
+
@xano/sdk: database tables, REST API endpoints, user authentication,
|
|
6
|
+
server-side logic, scheduled and background jobs, webhooks, file storage and
|
|
7
|
+
realtime. Use when a project needs a backend or one of these pieces and does
|
|
8
|
+
not have one yet, including requests that never mention Xano, such as "add
|
|
9
|
+
auth and a database to this app" or "build an API for this frontend". Also
|
|
10
|
+
use in any project with a xano/ directory or an @xano/sdk dependency. Do not
|
|
11
|
+
use when the project already runs a server framework, backend service or
|
|
12
|
+
database layer (for example Express, Fastify, Hono, Next.js API routes,
|
|
13
|
+
Supabase, Firebase, Prisma, Drizzle, Convex, Django, Rails, Laravel or
|
|
14
|
+
FastAPI) unless the user asks for Xano.
|
|
15
|
+
license: MIT
|
|
16
|
+
metadata:
|
|
17
|
+
xanosdk-version: "1.0.7"
|
|
18
|
+
xanosdk-digest: "sha256:335ffa095690ba305b28ede608a35590cb247a0b0954b41d2eda3046ed051fae"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Xano backend
|
|
22
|
+
|
|
23
|
+
Xano runs the backend: database tables, API endpoints, authentication, server-side
|
|
24
|
+
logic, scheduled tasks, triggers and webhooks, file storage and realtime. It is
|
|
25
|
+
authored as TypeScript in `xano/` with `@xano/sdk`, and the `xanosdk` CLI deploys
|
|
26
|
+
it to the Xano Engine on this machine (no account) or to Xano's cloud.
|
|
27
|
+
|
|
28
|
+
Work through the steps in order. Stop at the first one that ends the task.
|
|
29
|
+
|
|
30
|
+
## 1. Is this already a Xano project?
|
|
31
|
+
|
|
32
|
+
Look at the project root: the directory holding `package.json`, else the
|
|
33
|
+
repository root.
|
|
34
|
+
|
|
35
|
+
- `xano/` exists, or `package.json` lists `@xano/sdk`: read `AGENTS.md` and
|
|
36
|
+
follow it. Do not run `init`. This skill ends here.
|
|
37
|
+
- No `AGENTS.md` in that project: install its dependencies if
|
|
38
|
+
`node_modules/@xano/sdk` is missing, then read
|
|
39
|
+
`node_modules/@xano/sdk/llms.txt` in full and follow it instead.
|
|
40
|
+
|
|
41
|
+
## 2. Does the project already have another backend?
|
|
42
|
+
|
|
43
|
+
Another backend is a server framework, backend service or database layer the
|
|
44
|
+
project runs or depends on: for example Express, Fastify, Hono, Next.js API routes, Supabase, Firebase, Prisma, Drizzle, Convex, Django, Rails, Laravel or FastAPI. These are
|
|
45
|
+
examples, not the whole set. Check the dependency manifests (`package.json`,
|
|
46
|
+
`requirements.txt`, `pyproject.toml`, `Gemfile`, `composer.json`) and the
|
|
47
|
+
server entry points.
|
|
48
|
+
|
|
49
|
+
- Another backend is present and the user did not ask for Xano: ask the user
|
|
50
|
+
whether they want a Xano backend added beside it. Without a yes, build the
|
|
51
|
+
request on the existing backend, do not run `init`, and do not create `xano/`.
|
|
52
|
+
|
|
53
|
+
## 3. Confirm Xano
|
|
54
|
+
|
|
55
|
+
- The user has not named Xano: say that you will set up the backend with Xano
|
|
56
|
+
(`@xano/sdk`, TypeScript in `xano/`, running locally on the Xano Engine), and
|
|
57
|
+
wait for a yes before step 4. Without one, stop using this skill.
|
|
58
|
+
- The user named Xano: continue.
|
|
59
|
+
|
|
60
|
+
## 4. Run init
|
|
61
|
+
|
|
62
|
+
Run it at the project root. Which form:
|
|
63
|
+
|
|
64
|
+
- The directory has files (an existing app): `init` adds only the backend. It
|
|
65
|
+
writes `xano/` and merges what the backend needs into `package.json`, and
|
|
66
|
+
writes no frontend.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx @xano/sdk init --json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- The directory is empty and the user asked only for a backend:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx @xano/sdk init --framework none --json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- The directory is empty and the user asked for an app: `npx @xano/sdk init --json`
|
|
79
|
+
writes a frontend and the backend.
|
|
80
|
+
|
|
81
|
+
The JSON names the `mode` that ran, the `files` it wrote or merged, and `next`,
|
|
82
|
+
the command to run next. When `init` refuses and lists clashes, show the list to
|
|
83
|
+
the user. Only after the user agrees to overwrite those files, re-run with
|
|
84
|
+
`--force --yes`: `--yes` confirms the overwrite, which `init` cannot ask
|
|
85
|
+
for without a terminal.
|
|
86
|
+
|
|
87
|
+
## 5. Deploy
|
|
88
|
+
|
|
89
|
+
Run the command in `next`. It deploys the backend to the Xano Engine on this
|
|
90
|
+
machine and prints the backend URL. No account is needed.
|
|
91
|
+
|
|
92
|
+
The Xano Engine runs on macOS on Apple Silicon and on Linux (x64, arm64). On any
|
|
93
|
+
other platform, such as Windows or an Intel Mac, tell the user before deploying:
|
|
94
|
+
the backend goes to a Xano ephemeral instead (`npx xanosdk deploy --ephemeral`),
|
|
95
|
+
which needs a Xano account.
|
|
96
|
+
|
|
97
|
+
Only a human can do these. Stop and ask the user, then continue once they are
|
|
98
|
+
done:
|
|
99
|
+
|
|
100
|
+
- Creating a Xano account.
|
|
101
|
+
- Signing in: `npx xanosdk login` opens a browser consent. Ask the user to run it
|
|
102
|
+
in their own terminal. Do not run it yourself.
|
|
103
|
+
|
|
104
|
+
## 6. Verify
|
|
105
|
+
|
|
106
|
+
- `npm run xano:check` passes.
|
|
107
|
+
- A request to the backend URL the deploy printed gets a response.
|
|
108
|
+
`npx xanosdk status` prints that URL again.
|
|
109
|
+
|
|
110
|
+
## 7. Hand off
|
|
111
|
+
|
|
112
|
+
Read `AGENTS.md`, which `init` wrote, and follow it for all further backend work.
|
|
113
|
+
Before writing code in `xano/`, read `node_modules/@xano/sdk/llms.txt`.
|
|
114
|
+
|
|
115
|
+
Unless run with `--no-agents-md`, `init` also declares the `xano-local` MCP server in
|
|
116
|
+
`.mcp.json` and `.cursor/mcp.json`: the deployed backend's tables, rows and runs,
|
|
117
|
+
which `AGENTS.md` describes. `npx xanosdk local mcp` prints the server block for any
|
|
118
|
+
other agent. It is not loaded into a session that was already running. Tell the user
|
|
119
|
+
to restart the agent, or reconnect its MCP servers, to use it.
|