@xano/sdk 1.0.6 → 1.0.8
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 +30 -0
- package/README.md +32 -4
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-67QIX45H.js → agent-file-refresh-QJO3MT6Q.js} +13 -13
- package/dist/agent-skill-command-GBR4KUUG.js +414 -0
- package/dist/{answer-shape-UCDUKPAN.js → answer-shape-UMQRXMCX.js} +5 -5
- package/dist/{backend-dir-3LIL6SCT.js → backend-dir-PFUIPCV3.js} +15 -15
- package/dist/{backend-slot-JREP27UD.js → backend-slot-TTRNOQF5.js} +4 -4
- package/dist/bin.js +54 -53
- package/dist/{branch-2IPHOAYS.js → branch-Q7CDJRU6.js} +12 -11
- package/dist/{branch-commands-KTKAXBAN.js → branch-commands-CR3SAHMV.js} +27 -26
- package/dist/bundle.js +5 -5
- package/dist/{chunk-YKP4ZKVO.js → chunk-2HZDWZM2.js} +3 -3
- package/dist/{chunk-ZDP6GDAB.js → chunk-33KELF2X.js} +103 -94
- package/dist/{chunk-7VR4IO5B.js → chunk-3P35HT64.js} +2 -2
- package/dist/{chunk-2FLIJGBZ.js → chunk-3UZQ5TMG.js} +47 -8
- package/dist/{chunk-AWQ7BQTQ.js → chunk-4GPIOIAC.js} +6 -1
- package/dist/{chunk-YYLUBYXM.js → chunk-4JKXGPXB.js} +3 -3
- package/dist/{chunk-EQFYOOO6.js → chunk-5GIOCDUM.js} +829 -893
- package/dist/{chunk-26MOFAJT.js → chunk-5QOV52V4.js} +6 -3
- package/dist/{chunk-Q22BMRPF.js → chunk-5Y5HWQ2P.js} +2 -2
- package/dist/{chunk-T4LJ5UR2.js → chunk-6BOKCTCM.js} +52 -22
- package/dist/{chunk-FNLTFOUD.js → chunk-6NEV2PEC.js} +2 -2
- package/dist/{chunk-QJM5XZ4K.js → chunk-6PTITS3M.js} +8 -8
- package/dist/{chunk-N5I37JFB.js → chunk-6S263KTM.js} +2 -2
- package/dist/{chunk-JI3BLXWQ.js → chunk-6YOH2L3G.js} +11 -5
- package/dist/{chunk-5QMJOE2K.js → chunk-6ZFJEJXZ.js} +5 -3
- package/dist/{chunk-NPODGBVJ.js → chunk-75MKIQON.js} +4 -4
- package/dist/{chunk-SPITRSOF.js → chunk-76UAME77.js} +2 -2
- package/dist/{chunk-JRVQ7M7W.js → chunk-77GV772V.js} +8 -8
- package/dist/{chunk-GWTFI3GA.js → chunk-7JKNWDYN.js} +2 -2
- package/dist/{chunk-6X6BJN6Y.js → chunk-7MPI7NIW.js} +3 -3
- package/dist/{chunk-3II44CUJ.js → chunk-7UWUEUVJ.js} +24 -24
- package/dist/{chunk-ENMBEXOP.js → chunk-AS4G2MIE.js} +3 -3
- package/dist/{chunk-PMMHSX4H.js → chunk-B3NH5UBI.js} +4 -4
- package/dist/{chunk-SLGJIWCY.js → chunk-B5N6EWOM.js} +2 -2
- package/dist/chunk-BRANWM4U.js +853 -0
- package/dist/{chunk-6X3MY2JP.js → chunk-C2GHFADU.js} +2 -2
- package/dist/{chunk-CCU5CCRX.js → chunk-C2I4GC36.js} +8 -8
- package/dist/{chunk-D7BUMOKU.js → chunk-C6KBZH7M.js} +82 -6
- package/dist/{chunk-LAOMN6QQ.js → chunk-CRE7P7P2.js} +3 -3
- package/dist/{chunk-AVS4WPPY.js → chunk-DER2CVNC.js} +2 -2
- package/dist/{chunk-UIVMR7UK.js → chunk-DY3EJWWH.js} +2 -2
- package/dist/{chunk-SKEG3V2V.js → chunk-EKTIGGFO.js} +2 -2
- package/dist/{chunk-PL7AIAWS.js → chunk-F3IA3YWI.js} +4 -111
- package/dist/{chunk-FQ53GTII.js → chunk-F5RPNTN7.js} +6 -6
- package/dist/{chunk-2WBH5HUY.js → chunk-FHQYXGAY.js} +7 -7
- package/dist/{chunk-ND43ZOS3.js → chunk-FN7E6XGD.js} +7 -7
- package/dist/{chunk-3BBIDW3Y.js → chunk-GN5SQMIQ.js} +5 -5
- package/dist/{chunk-SSITMX7I.js → chunk-H3ZBAR2L.js} +16 -14
- package/dist/{chunk-OIKLDDYC.js → chunk-HFOGQIII.js} +3 -3
- package/dist/chunk-HKLBDSML.js +995 -0
- package/dist/{chunk-JXVJGF3Y.js → chunk-HQPL34O6.js} +2 -2
- package/dist/{chunk-CHINR7WD.js → chunk-HTP2CLRQ.js} +5 -5
- package/dist/{chunk-ROY4YAEQ.js → chunk-HU7F56VF.js} +22 -2
- package/dist/{chunk-TECTL2NU.js → chunk-HVPSDQJB.js} +4 -4
- package/dist/{chunk-IYXL5NYU.js → chunk-I53OTC3O.js} +2 -2
- package/dist/{chunk-M5CSVB23.js → chunk-IB6SKACE.js} +11 -8
- package/dist/{chunk-UD2Z7K6W.js → chunk-JG642U5D.js} +4 -4
- package/dist/{chunk-ZJSTUD6D.js → chunk-JJGK7XGC.js} +8 -8
- package/dist/{local-engine-command-RYLGMQ2O.js → chunk-JPRZ4ZGU.js} +22 -77
- package/dist/{chunk-QZEAANWP.js → chunk-K75BFHQQ.js} +8 -8
- package/dist/chunk-LCOCRJ4K.js +116 -0
- package/dist/{chunk-3EDSPMXN.js → chunk-LJM5CIY4.js} +5 -1
- package/dist/{chunk-D3KEPRRN.js → chunk-LTPF25L2.js} +2 -1
- package/dist/{chunk-HCG7NDIL.js → chunk-M3RLLT4O.js} +5 -5
- package/dist/{chunk-IXFJORNH.js → chunk-NFSUGVDY.js} +4 -4
- package/dist/{chunk-GHQ4BVI4.js → chunk-NFZUXS7D.js} +14 -14
- package/dist/{chunk-LBJA7IEM.js → chunk-O376UAZS.js} +2 -2
- package/dist/{chunk-LD6ARK3A.js → chunk-OBJ7FQDX.js} +2 -2
- package/dist/{chunk-VJFMUJWZ.js → chunk-OHTHG3LL.js} +2 -2
- package/dist/{chunk-U35MTOXQ.js → chunk-P5W6DBV6.js} +3 -3
- package/dist/{chunk-A7MRZ4GF.js → chunk-PAS5HOG3.js} +5 -5
- package/dist/{chunk-WZHLMU6T.js → chunk-PBK257CI.js} +2 -2
- package/dist/{chunk-SPKA2LV6.js → chunk-PFW7WFAT.js} +4 -4
- package/dist/{chunk-GOLFAEUV.js → chunk-QC3MKMDK.js} +2 -2
- package/dist/{chunk-YGLMRH5U.js → chunk-QE2GNFMP.js} +12 -12
- package/dist/{chunk-763M6LX3.js → chunk-QL3ZJWGG.js} +2 -2
- package/dist/{chunk-ITC2R2OT.js → chunk-QRKBFXIB.js} +7 -7
- package/dist/{chunk-KPFS3RGM.js → chunk-QTMXJQZN.js} +4 -4
- package/dist/{chunk-BTVUYHWV.js → chunk-QXOBZSQD.js} +4 -4
- package/dist/{chunk-NDWVJ2QZ.js → chunk-R3LANPQZ.js} +3 -3
- package/dist/{chunk-QXYMDARD.js → chunk-R4NOZBOY.js} +4 -4
- package/dist/{chunk-YYC2DZMG.js → chunk-RYMGK2K5.js} +6 -6
- package/dist/{chunk-IF4PEGVD.js → chunk-S2F7KVUL.js} +11 -11
- package/dist/{chunk-I3VHW6XM.js → chunk-S3STXOAO.js} +18 -18
- package/dist/{chunk-JFBRXRJD.js → chunk-S3WN6GGO.js} +40 -40
- package/dist/{chunk-U6MTGB46.js → chunk-S42TFTM5.js} +5 -5
- package/dist/{chunk-7GAIJW62.js → chunk-TG65NWUR.js} +2 -2
- package/dist/{chunk-YR2I5HGE.js → chunk-TR7EOUQE.js} +2 -2
- package/dist/{chunk-I3H3HCPY.js → chunk-U7XNJ33Q.js} +34 -31
- package/dist/{chunk-FU3VCE5A.js → chunk-UKJFCEMI.js} +13 -9
- package/dist/{chunk-5TVFLG3C.js → chunk-ULUUOUQX.js} +2 -2
- package/dist/{chunk-PFBXSVZF.js → chunk-UU7EEREQ.js} +7 -7
- package/dist/{chunk-ATJ2W7DC.js → chunk-V7KMIEMF.js} +286 -126
- package/dist/{chunk-VDHA5SSQ.js → chunk-VD7YTLWL.js} +2 -2
- package/dist/{chunk-EADVVTDK.js → chunk-VHV25AAO.js} +7 -7
- package/dist/{chunk-BL3AZ3AP.js → chunk-VJTTTIIB.js} +2 -2
- package/dist/{chunk-TTEIDD5Q.js → chunk-W2BVP27L.js} +4 -4
- package/dist/{chunk-GZHLCUZ6.js → chunk-WEQFI55W.js} +7 -7
- package/dist/{chunk-WBH4KJWM.js → chunk-XQO4A4Q4.js} +3 -3
- package/dist/{chunk-Z4ZGTCCD.js → chunk-XYTVP4WI.js} +6 -6
- package/dist/{chunk-5YQV35C2.js → chunk-Y5ET37NN.js} +7 -7
- package/dist/{chunk-VW4CWVYX.js → chunk-YE7MHW45.js} +4 -4
- package/dist/{chunk-YHB34BN6.js → chunk-YEH5OIPF.js} +2 -1
- package/dist/{chunk-GLY552SI.js → chunk-YG7S3N7P.js} +128 -60
- package/dist/{chunk-MBDFH7XB.js → chunk-YP76ZCQ5.js} +4 -4
- package/dist/{chunk-XFBGXB7X.js → chunk-ZJCHS7FM.js} +163 -107
- package/dist/{chunk-IMELQ2I6.js → chunk-ZO3QWFNV.js} +3 -3
- package/dist/{chunk-RIN4YY34.js → chunk-ZQ5WZWHF.js} +106 -69
- package/dist/{chunk-GW5RHGOB.js → chunk-ZT2B22VQ.js} +9 -9
- package/dist/cli.d.ts +32 -4
- package/dist/cli.js +51 -48
- package/dist/{codegen-command-R5IASBFC.js → codegen-command-4YXDJSLU.js} +69 -68
- package/dist/{commands-H7CPMMHH.js → commands-FOHIPDKZ.js} +3 -3
- package/dist/{completion-W5ZAI6TN.js → completion-XUBGMKGV.js} +9 -5
- package/dist/{config-MZ5KG4EP.js → config-544VCRKP.js} +8 -8
- package/dist/{deploy-command-34T2LKQ5.js → deploy-command-FIDS56ZC.js} +56 -55
- package/dist/{deploy-source-YLQ7WMYR.js → deploy-source-FPNNNNOW.js} +34 -33
- package/dist/{dev-env-sync-TMJTNU3U.js → dev-env-sync-RBJ2U3HG.js} +54 -53
- package/dist/{diagnostics-OMN5Y2AH.js → diagnostics-FNVNRYMB.js} +2 -2
- package/dist/{display-name-hint-ZJGFNJKQ.js → display-name-hint-EZQK2PDU.js} +14 -13
- package/dist/{emit-D125xxty.d.ts → emit-8lcNcRrd.d.ts} +12 -12
- package/dist/env-example-refresh-6UTTMDOI.js +134 -0
- package/dist/{env-pull-command-UTG6IC2K.js → env-pull-command-P5MATITQ.js} +46 -45
- package/dist/{env-target-FZROWYFS.js → env-target-F75YF25S.js} +13 -12
- package/dist/{env-var-command-VYDBQJJW.js → env-var-command-H3GHROVB.js} +50 -49
- package/dist/{ephemeral-BIE6FMJV.js → ephemeral-H24NF6WP.js} +11 -10
- package/dist/{ephemeral-command-OZ26RGXF.js → ephemeral-command-NH2XW3YK.js} +64 -63
- package/dist/{ephemeral-state-SNZOX2YK.js → ephemeral-state-YLZQIOBF.js} +11 -10
- package/dist/{generate-command-4HR7MR36.js → generate-command-IANKN6WV.js} +84 -82
- package/dist/{gitignore-EWQBXNX2.js → gitignore-FT2LVOMI.js} +19 -19
- package/dist/{guards-KYEOCVHN.js → guards-4VPSEOAI.js} +6 -4
- package/dist/{impersonate-command-WC7OGKUM.js → impersonate-command-7B67ICPL.js} +42 -41
- package/dist/{import-7Z4GCCPO.js → import-TXYVFYJS.js} +5 -5
- package/dist/index.d.ts +4 -4
- package/dist/index.js +8 -8
- package/dist/{init-command-HAO3WXH3.js → init-command-QOA4TJI2.js} +68 -53
- package/dist/{init-modules-NSKD4ASY.js → init-modules-KEEJ4HAF.js} +8 -8
- package/dist/{init-web-MKFFOQUU.js → init-web-MSXDARRF.js} +3 -3
- package/dist/internal.d.ts +4 -4
- package/dist/internal.js +10 -10
- package/dist/{keep-data-merge-QR2TMKEO.js → keep-data-merge-BIBW4QR4.js} +28 -28
- package/dist/{lambda-config-reconcile-7FJXXV6V.js → lambda-config-reconcile-47X5C2E4.js} +6 -5
- package/dist/{landing-record-MWXFIRCP.js → landing-record-DO3PM7QP.js} +22 -22
- package/dist/{live-diff-5E2BQWQ7.js → live-diff-CGTGOH3S.js} +3 -3
- package/dist/{local-engine-choice-VD5LNXJU.js → local-engine-choice-2UF7S5QZ.js} +37 -36
- package/dist/local-engine-command-WGMMZRQL.js +85 -0
- package/dist/{local-engine-config-W3KB7RWM.js → local-engine-config-6CB6FOEJ.js} +3 -2
- package/dist/{local-engine-deploy-6O7NKZCA.js → local-engine-deploy-ID4JJXB5.js} +18 -16
- package/dist/local-engine-lookup-IC7BKAYP.js +43 -0
- package/dist/local-engine-mcp-bridge-3SOJMZ5T.js +423 -0
- package/dist/local-engine-mcp-command-RMVUH4FL.js +181 -0
- package/dist/{local-engine-process-ZLLZEIRF.js → local-engine-process-HG5BGG3F.js} +12 -9
- package/dist/{local-engine-state-OCW5YDD7.js → local-engine-state-JZHTKHDG.js} +4 -3
- package/dist/{local-engine-update-check-LVX4HBBI.js → local-engine-update-check-SKZR7YSC.js} +7 -6
- package/dist/{lock-commands-X2OECR4R.js → lock-commands-5NMQWBGH.js} +57 -56
- package/dist/{login-command-RLLKD565.js → login-command-GLLFZWHT.js} +33 -33
- package/dist/{logout-command-XDMSXCDO.js → logout-command-NCMKMJWF.js} +16 -15
- package/dist/{loop-SUB6C2LK.js → loop-XFDS65OD.js} +3 -3
- package/dist/{marketplace-command-2NHHY2X3.js → marketplace-command-Y3RRUEWL.js} +34 -34
- package/dist/{marketplace-resolve-OTZYT4FG.js → marketplace-resolve-PWEYJ2XS.js} +6 -6
- package/dist/{meta-client-TMHVBZFY.js → meta-client-Y7N6WDS2.js} +14 -13
- package/dist/{module-manifest-FNMW23IX.js → module-manifest-KY7J63HG.js} +4 -4
- package/dist/node.d.ts +4 -4
- package/dist/node.js +60 -59
- package/dist/operation-outcome-4BFISK2R.js +53 -0
- package/dist/{output-target-MOLCTPBP.js → output-target-MFANTVGZ.js} +20 -20
- package/dist/{plan-disclosure-CY7AF6KP.js → plan-disclosure-GNLDYV2A.js} +17 -16
- package/dist/{plugin-contributions-WR26U7NT.js → plugin-contributions-PAGG6SUP.js} +6 -6
- package/dist/{plugin-prompt-ZUYQQIX4.js → plugin-prompt-2MX6LF6X.js} +5 -5
- package/dist/{plugin-questions-HAZOQ67R.js → plugin-questions-AP6VUTOB.js} +4 -4
- package/dist/{preflight-command-OHJXYND3.js → preflight-command-Q6XOKRM6.js} +61 -60
- package/dist/{profile-command-6JWT2BTL.js → profile-command-XPQIXFWN.js} +34 -34
- package/dist/{profile-pointer-PDA5XBIB.js → profile-pointer-4HJQH5ZR.js} +5 -4
- package/dist/{project-dependency-GZWWGWEW.js → project-dependency-ORX45I74.js} +7 -7
- package/dist/{project-sdk-3W72H5QO.js → project-sdk-IYMFVQRC.js} +4 -4
- package/dist/promote-command-DN64QK7O.js +147 -0
- package/dist/{prompt-U37K5RPQ.js → prompt-ZZUYWFQX.js} +4 -4
- package/dist/{publish-command-BUS27HGB.js → publish-command-SLE46MQX.js} +61 -60
- package/dist/{pull-command-ZGUNP27P.js → pull-command-UVK3IOXM.js} +72 -71
- package/dist/{pull-superseded-EZBGYRZF.js → pull-superseded-UZ3MB53B.js} +4 -4
- package/dist/{release-command-BQ6OHS3P.js → release-command-MKNESNGB.js} +67 -66
- package/dist/{release-ns-command-ATGVBVIU.js → release-ns-command-HLR46IKP.js} +92 -91
- package/dist/{retry-command-QJ57WVW7.js → retry-command-VZYLYDVX.js} +10 -9
- package/dist/{routes-manifest-YR4ZIMLM.js → routes-manifest-RIZGSOZC.js} +4 -4
- package/dist/{routes-manifest-file-UALYSZLY.js → routes-manifest-file-UHVVL2YB.js} +8 -8
- package/dist/scaffold.js +4 -4
- package/dist/secrets-IV4N5HYI.js +20 -0
- package/dist/{secrets-file-LMS7KX3E.js → secrets-file-HST7BMQC.js} +19 -19
- package/dist/{secrets-fill-command-QNBDGCGM.js → secrets-fill-command-FQJ4QFBP.js} +55 -54
- package/dist/{seed-SZ6OS5DQ.js → seed-KEPIS7UZ.js} +6 -6
- package/dist/{source-resolve-MKLNYFWG.js → source-resolve-LNRUITLS.js} +24 -22
- package/dist/{static-host-ONEHA4LI.js → static-host-JAOT3N3E.js} +5 -5
- package/dist/{status-command-XKIFKBGM.js → status-command-S5CBG2SW.js} +53 -52
- package/dist/{store-Bg4Na6Sm.d.ts → store-CuD1k4kV.d.ts} +1 -1
- package/dist/{store-X6ZH7EC3.js → store-YFNDD6GZ.js} +8 -7
- package/dist/{sync-baseline-DOV5AGIO.js → sync-baseline-3CDL4PKT.js} +7 -5
- package/dist/{sync-contributions-HNVHDIQW.js → sync-contributions-O5ZRM2JN.js} +10 -10
- package/dist/{sync-record-PRXHLK4S.js → sync-record-U65BCPSP.js} +14 -13
- package/dist/{table-DC36QA4Y.js → table-E5YTK7QX.js} +7 -7
- package/dist/{tables-command-UQLKTELN.js → tables-command-7KI2KZOS.js} +40 -39
- package/dist/{tenant-EKNQGG5A.js → tenant-DAXJ4P4D.js} +12 -11
- package/dist/{tenant-command-2LWP2MPB.js → tenant-command-MQTLNETR.js} +97 -96
- package/dist/{test-command-IU5MBBXY.js → test-command-NLYMAAPD.js} +42 -41
- package/dist/{tests-RG2Y5EQ4.js → tests-CLDZWLKF.js} +6 -6
- package/dist/{token-7AWSJLKO.js → token-3IPTVEEW.js} +12 -11
- package/dist/{toolchain-hooks-4ZMQLBPQ.js → toolchain-hooks-3ZAAAWPL.js} +7 -7
- package/dist/{toolchain-modules-VU7SURVJ.js → toolchain-modules-K46KYJ4G.js} +5 -5
- package/dist/{toolchain-peers-CIDNEEQV.js → toolchain-peers-AIKWKJH7.js} +8 -8
- package/dist/{tracked-backend-4BHSV7NC.js → tracked-backend-FQFXTTYZ.js} +37 -36
- package/dist/{update-check-A7FXIINW.js → update-check-FHRRUDEC.js} +52 -51
- package/dist/{upgrade-command-C5KBITFI.js → upgrade-command-WNBPKUXN.js} +58 -55
- package/dist/{whoami-command-7WQII2H4.js → whoami-command-DPGDK35H.js} +15 -14
- package/dist/{workspace-Z46PUZNI.js → workspace-2GMONZ2A.js} +5 -5
- package/dist/{workspace-binding-JE6YNDZJ.js → workspace-binding-PAUOIK3V.js} +14 -13
- package/dist/{workspace-command-FC4IMLAE.js → workspace-command-KEKL27Y4.js} +99 -103
- package/dist/{workspace-env-N4ZPFT6A.js → workspace-env-GGEZVZDY.js} +16 -16
- package/dist/{workspace-export-3A5BZTPS.js → workspace-export-UHY22VBI.js} +5 -5
- package/dist/{writable-D7KCZI5N.js → writable-2A6MBSFD.js} +4 -4
- package/dist/{xano-LCI7VWPS.js → xano-6T6L7TTI.js} +5 -5
- package/dist/{xanosdk-import-P2A2KSXM.js → xanosdk-import-HYHABD5U.js} +6 -6
- package/dist/{xanosdk-project-6AGMW2SL.js → xanosdk-project-2T56DRYS.js} +16 -16
- package/guides/README.md +2 -2
- package/guides/cli.md +69 -0
- package/guides/codegen.md +23 -5
- package/guides/codes.md +5 -1
- package/guides/coverage.md +5 -0
- package/guides/deploying.md +45 -1
- package/guides/scaffold.md +61 -10
- package/llms/errors.md +1 -1
- package/llms/kinds-agent-mcp.md +1 -1
- package/llms-full.txt +3 -3
- package/llms.txt +1 -1
- package/manifest.json +67 -5
- package/package.json +5 -2
- package/skills/xano-backend/SKILL.md +119 -0
- package/dist/chunk-LL7SGTRC.js +0 -663
- package/dist/chunk-M6ZFSTIZ.js +0 -630
- package/dist/env-example-refresh-CQP3ZMKM.js +0 -133
- package/dist/operation-outcome-RN62735X.js +0 -51
- package/dist/promote-command-UYAMUXKB.js +0 -146
package/guides/cli.md
CHANGED
|
@@ -9,6 +9,8 @@ with `@xano/sdk` installed, run them as `npx xanosdk …`; anywhere else, `npx @
|
|
|
9
9
|
```bash
|
|
10
10
|
xanosdk init my-app # scaffold a full project (frontend/ + xano/)
|
|
11
11
|
xanosdk init my-app --framework svelte # SvelteKit instead of the default React
|
|
12
|
+
xanosdk init my-api --framework none # a new project with the backend only (no frontend/)
|
|
13
|
+
xanosdk init # inside an existing app: add xano/ and the xano:* scripts, no frontend (lists clashes and writes nothing; --force overwrites)
|
|
12
14
|
xanosdk init my-app --no-agents-md --no-install # skip AGENTS.md and npm install
|
|
13
15
|
xanosdk init my-app --theme zinc-blue --dark toggle --icons tabler # the look
|
|
14
16
|
xanosdk init my-app --marketplace @xano-sdk/auth,@xano-sdk/vector # install add-ons AND register them
|
|
@@ -62,6 +64,8 @@ xanosdk deploy ./xano/index.ts --local=~/Downloads/engine.tar.gz # override: r
|
|
|
62
64
|
XANOSDK_ENGINE_OVERRIDE=v0.1.8 npm run xano:deploy # the same override for every deploy in the shell
|
|
63
65
|
xanosdk local list # Xano Engines on this machine, marking the ones xanosdk started
|
|
64
66
|
xanosdk local token # print its meta API bearer: XANO_META_TOKEN=$(xanosdk local token)
|
|
67
|
+
xanosdk local mcp # how a coding agent connects to its MCP server (url, command, config); never the bearer
|
|
68
|
+
xanosdk local mcp --stdio # the bridge an agent's .mcp.json launches: follows restarts, brings the current bearer
|
|
65
69
|
xanosdk local stop <name> # stop one (--all: every one xanosdk started, and what a crashed one left running)
|
|
66
70
|
xanosdk local update # move this project's pinned engine to the latest (--version <v>: that one) and restart it — commit package.json
|
|
67
71
|
xanosdk local cache list # each cached engine version, its size, and the engines running on it
|
|
@@ -133,6 +137,9 @@ xanosdk logout # revoke the active profile and remo
|
|
|
133
137
|
xanosdk version # print the installed @xano/sdk version
|
|
134
138
|
xanosdk upgrade --check # is a newer @xano/sdk published? exits 7 if so, 0 if current
|
|
135
139
|
xanosdk upgrade # install it: globally (npm i -g) for a global CLI; in a project, into the block that lists it (--save-prod or --save-dev)
|
|
140
|
+
xanosdk agent-skill install # put the xano-backend skill into each coding agent detected on this machine (--agent <id> to pick)
|
|
141
|
+
xanosdk agent-skill status # each copy: current, stale, edited or absent
|
|
142
|
+
xanosdk agent-skill uninstall # remove the copies install wrote (an edited copy is kept)
|
|
136
143
|
xanosdk help # grouped command reference (also the no-arg default)
|
|
137
144
|
xanosdk <command> --help # that command's usage, subcommands, and flags (`xanosdk deploy --help`)
|
|
138
145
|
xanosdk <noun> <verb> --help # scoped to one verb (`xanosdk workspace export --help`)
|
|
@@ -320,6 +327,68 @@ caret) and restamps the managed blocks in your
|
|
|
320
327
|
outside a project, it installs nothing (`status: "not-installed"`): that copy is temporary,
|
|
321
328
|
and `npx @xano/sdk@latest` already runs the newest release.
|
|
322
329
|
|
|
330
|
+
## Adding the backend to an existing app
|
|
331
|
+
|
|
332
|
+
`init` decides what to write from its target directory. An empty or missing directory is a
|
|
333
|
+
**new** project: a full app, `react` unless `--framework` says otherwise, with a framework
|
|
334
|
+
prompt on a terminal whose choices include "No frontend" (`--framework none`, the backend
|
|
335
|
+
alone). Any other directory is an **existing** project: `init` writes `xano/` and merges the
|
|
336
|
+
`xano:*` scripts and the backend's dependencies into its `package.json`, with no prompt and no
|
|
337
|
+
frontend. [The scaffolded project](scaffold.md#no-frontend-and-existing-apps) lists exactly
|
|
338
|
+
what each mode writes and merges.
|
|
339
|
+
|
|
340
|
+
Each of these is a **clash**: an existing `xano/`, any other file `init` would write that is
|
|
341
|
+
already there, and a `xano:*` script the project defines with another command. `init` lists
|
|
342
|
+
every clash and writes nothing. `--force` lists what it would overwrite and asks first
|
|
343
|
+
(`--yes` answers without a terminal).
|
|
344
|
+
|
|
345
|
+
`--framework react` or `--framework svelte` is refused in an existing project, and the
|
|
346
|
+
frontend-only flags (`--theme`, `--radius`, `--dark`, `--font`, `--font-mono`,
|
|
347
|
+
`--font-heading`, `--icons`) are refused wherever no frontend is written, rather than
|
|
348
|
+
silently ignored. `init --from` follows the same two modes
|
|
349
|
+
([Pulling an existing workspace](codegen.md#running-it)).
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
xanosdk init --json # inside the app; then run the command in `next`
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
`init --json` reports `mode` (`new` or `existing`), `files` (every file it wrote or merged
|
|
356
|
+
into, relative to the project) and `next` (the command to run next: the install when one is
|
|
357
|
+
still needed, then `xano:deploy`).
|
|
358
|
+
|
|
359
|
+
## The agent skill
|
|
360
|
+
|
|
361
|
+
`xano-backend` is an agent skill for coding agents such as Claude Code, Codex and Cursor: it
|
|
362
|
+
tells the agent when to set up a Xano backend and hands it to `init`, then to the project's
|
|
363
|
+
`AGENTS.md` and `llms.txt`. It is not a `knowledge()` def; those are docs your workspace's own
|
|
364
|
+
AI agents read. The package ships it at `skills/xano-backend/SKILL.md`.
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
xanosdk agent-skill install # every coding agent detected on this machine
|
|
368
|
+
xanosdk agent-skill install --agent claude-code # …or name one (repeatable)
|
|
369
|
+
xanosdk agent-skill install --dry-run # report what would change, write nothing
|
|
370
|
+
xanosdk agent-skill status --json # each copy, as data
|
|
371
|
+
xanosdk agent-skill uninstall
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
It writes at most two copies. Claude Code reads `~/.claude/skills/xano-backend/SKILL.md`
|
|
375
|
+
(under `$CLAUDE_CONFIG_DIR` when that is set). Codex, Cursor, Copilot, Gemini CLI, Amp and
|
|
376
|
+
OpenCode read the shared `~/.agents/skills/xano-backend/SKILL.md`. An agent is detected by its
|
|
377
|
+
home config directory; `--agent` takes `claude-code`, `agents` (the shared directory),
|
|
378
|
+
`codex`, `cursor`, `copilot`, `gemini`, `amp` or `opencode` instead. When no agent is detected
|
|
379
|
+
and none is named, `install` refuses.
|
|
380
|
+
|
|
381
|
+
Each copy carries the SDK version and a digest. `status` reports a copy as **current**,
|
|
382
|
+
**stale** (an older version, unedited), **edited** (changed since it was installed) or
|
|
383
|
+
**absent**. `install` writes a missing or stale copy and leaves a current one unchanged; it
|
|
384
|
+
leaves an edited copy alone unless `--force`. `uninstall` removes only unedited copies. A
|
|
385
|
+
symlinked skill directory belongs to another installer, and neither command touches it.
|
|
386
|
+
Nothing prompts, so both run unattended; `--json` reports one entry per target.
|
|
387
|
+
|
|
388
|
+
The skill also installs without the CLI, from the public repository:
|
|
389
|
+
`npx skills add xano-sdk/sdk`, or in Claude Code `/plugin marketplace add xano-sdk/sdk`
|
|
390
|
+
followed by `/plugin install xano@xano-sdk`.
|
|
391
|
+
|
|
323
392
|
## Checking what an installed SDK can do
|
|
324
393
|
|
|
325
394
|
A tool that drives the CLI, such as an editor extension or a CI step, should check that the
|
package/guides/codegen.md
CHANGED
|
@@ -18,10 +18,27 @@ xanosdk init my-app --from ./ws.json # a bundle already on disk — off
|
|
|
18
18
|
`workspace`, `ephemeral[:<name>]`, `local[:<name>]`, `tenant:<name>`, `release:<name>` —
|
|
19
19
|
or a bundle path. Unlike most commands it has no default: a pull names its source.
|
|
20
20
|
|
|
21
|
-
Everything else about the project is unchanged: `--framework`,
|
|
22
|
-
`--web` mean the same thing here as they do without `--from`.
|
|
23
|
-
the pull itself — `--report`, `--skip-roundtrip` and `--branch` —
|
|
24
|
-
than silently ignored.
|
|
21
|
+
Everything else about the project is unchanged: `--framework` (`react`, `svelte` or `none`), the
|
|
22
|
+
theme flags, `--no-agents-md` and `--web` mean the same thing here as they do without `--from`.
|
|
23
|
+
The three flags that describe the pull itself — `--report`, `--skip-roundtrip` and `--branch` —
|
|
24
|
+
are refused without it rather than silently ignored.
|
|
25
|
+
|
|
26
|
+
The target directory decides what is written around `xano/`, as it does for a plain
|
|
27
|
+
[`init`](scaffold.md#no-frontend-and-existing-apps):
|
|
28
|
+
|
|
29
|
+
- **Empty or missing:** a new project, with the frontend `--framework` names (`none` for the
|
|
30
|
+
backend alone).
|
|
31
|
+
- **A previous pull** (`xano/.xanosdk-codegen.json` is there): `xano/` is refreshed in place —
|
|
32
|
+
see [Verification, and the decode report](#verification-and-the-decode-report) below.
|
|
33
|
+
- **Anything else:** an existing app, which gets the backend only. The decoded `xano/` is
|
|
34
|
+
written, and the `xano:*` scripts and the backend's dependencies are merged into its
|
|
35
|
+
`package.json`. An existing `xano/`, a file the pull would write, or a `xano:*` script with
|
|
36
|
+
another command is a clash: all of them are listed and nothing is read or written unless
|
|
37
|
+
`--force`. `--framework react|svelte` and the frontend-only flags are refused.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
cd my-existing-app && npx @xano/sdk init --from workspace # add the pulled backend to this app
|
|
41
|
+
```
|
|
25
42
|
|
|
26
43
|
### Just the tree: `generate`
|
|
27
44
|
|
|
@@ -168,7 +185,8 @@ are listed), then updated from the new tree, so `export --check` passes after it
|
|
|
168
185
|
over a `xano/` no decode wrote follows the same rules.
|
|
169
186
|
|
|
170
187
|
> ⚠️ **`xano/` is your source once pulled — commit it.** A refresh overwrites the files it
|
|
171
|
-
> decodes, so commit before one (
|
|
188
|
+
> decodes, so commit before one (an existing `xano/` that isn't a previous pull is a clash, and
|
|
189
|
+
> needs `--force`).
|
|
172
190
|
> It carries schema only — no table rows or stored files.
|
|
173
191
|
> `xanosdk deploy` sends it to the Xano Engine on this machine (`--ephemeral`: a disposable
|
|
174
192
|
> ephemeral environment) as a *full replace*;
|
package/guides/codes.md
CHANGED
|
@@ -28,6 +28,7 @@ Match on the code, never on the message text: messages are reworded, codes are n
|
|
|
28
28
|
| `SDK_SEED_IN_STATIC` | A static build carries seed values from non-public columns (`details.leaks[]`); nothing was published. |
|
|
29
29
|
| `SDK_SHARED_SCHEMA_CHANGE` | A promote would alter tables live serves from (`details.reason: "shared-schema-changes"`, `details.changes[]`), or could not read them (`"tables-unreadable"`); `--allow-shared-schema-changes` lands it. Exit 2. |
|
|
30
30
|
| `SDK_USAGE` | The input is wrong — a command line, a def or a value the build or the command refuses as written — a confirmation was needed off a terminal (`details.reason: "needs-confirmation"`), or the named backend is in another workspace (`details.reason: "wrong-workspace"`, `details.heldIn`). Exit 1. |
|
|
31
|
+
| `SDK_WORKSPACE_CHANGED` | A `deploy --to workspace` would overwrite objects changed in Xano since the last sync (`details.reason: "workspace-changed"`, `details.objects[]`, `details.changedThere[]`, `details.changedBoth[]`, `details.baseline`); pull first, or `--overwrite` deploys over them. Exit 2. |
|
|
31
32
|
|
|
32
33
|
## CLI warnings
|
|
33
34
|
|
|
@@ -62,6 +63,7 @@ Printed as `! …` on stderr, and as `{ code, message }` in a `--json` document'
|
|
|
62
63
|
| `deploy.ephemeral-write` | Says which ephemeral this deploy writes to. |
|
|
63
64
|
| `deploy.import-failed-backup` | The import failed. Your pre-deploy snapshot is on branch "…". |
|
|
64
65
|
| `deploy.open-no-url` | --open had no URL to open — the deploy reported none. |
|
|
66
|
+
| `deploy.overwrite-changed` | `--overwrite`: … object… changed in Xano since the last sync … overwritten: |
|
|
65
67
|
| `deploy.replace-wipe` | `--replace` wipes … before importing — including table data and history. |
|
|
66
68
|
| `deploy.rows-written` | Table rows from the bundle … written. |
|
|
67
69
|
| `deploy.tenant-write` | This deploy writes to a target that is not an ephemeral, named in the message. |
|
|
@@ -133,6 +135,7 @@ Printed as `! …` on stderr, and as `{ code, message }` in a `--json` document'
|
|
|
133
135
|
| `logout.revoke-failed` | Did not revoke …: … The token was not sent. |
|
|
134
136
|
| `logout.shared-file` | Clearing … in the shared credential file … — this affects every project that reuses it. |
|
|
135
137
|
| `logout.unreadable` | Could not read … (…). |
|
|
138
|
+
| `merge.symlink` | … is a symlink — left it and its target untouched. |
|
|
136
139
|
| `microservice.failed` | Some microservices failed to start: |
|
|
137
140
|
| `microservice.starting` | Microservices are still starting (…/… ready) — they should come up shortly: |
|
|
138
141
|
| `microservice.status-unreadable` | Could not read microservice status (the backend deployed fine): |
|
|
@@ -278,7 +281,7 @@ Raised while a workspace compiles (`export`, `deploy`, `release`, …). A warnin
|
|
|
278
281
|
|
|
279
282
|
| Code | Meaning |
|
|
280
283
|
|---|---|
|
|
281
|
-
| `agent.args-placeholder-unpassed` |
|
|
284
|
+
| `agent.args-placeholder-unpassed` | …: `s.ai.agent.run` of agent "…" passes args …, but the agent's prompt reads `{{ $args… }}`, which this run never passes, so it resolves to nothing. |
|
|
282
285
|
| `agent.literal-api-key` | agent "…" spells its `llm.apiKey` literally. |
|
|
283
286
|
| `api-group.cors-no-methods` | apiGroup "…": `cors.mode: "custom"` enables no `allowMethods`, so no `access-control-allow-methods` is sent and a preflight has nothing to approve. |
|
|
284
287
|
| `api-group.cors-no-origins` | apiGroup "…": `cors.mode: "custom"` with an empty `allowOrigins` matches no request, so responses carry NO `access-control-*` headers and every browser call… |
|
|
@@ -366,6 +369,7 @@ Raised while a workspace compiles (`export`, `deploy`, `release`, …). A warnin
|
|
|
366
369
|
| `search.request-only-filter` | … pipes a search operand through `…`, which evaluates only in the request. |
|
|
367
370
|
| `seed.invalid` | A seed row does not match its table's columns. |
|
|
368
371
|
| `seed.public-seed` | Table "…" declares publicSeed but has no `seed`: there are no seed values to declare public. |
|
|
372
|
+
| `stack.agent-tools-off` | …: `s.ai.agent.run` of agent "…" leaves `allowToolExecution` unset, so the agent runs with its tools off: it sees them but never calls one, and answers as if… |
|
|
369
373
|
| `stack.auth-no-caller` | … "…" reads `auth()`, but …: it deploys clean and never holds the caller's identity. |
|
|
370
374
|
| `stack.auth-null-host` | … "…": an `s.redis.ratelimit` in its stack keys off auth(), where …. |
|
|
371
375
|
| `stack.blank-table` | … has … (…) bound to no table (`table: null`) — … nothing when run. |
|
package/guides/coverage.md
CHANGED
|
@@ -72,3 +72,8 @@ can learn the SDK without reading source:
|
|
|
72
72
|
Both derive from the SDK's own sources of truth (so they can't drift), regenerate with
|
|
73
73
|
`npm run manifest`, and are available at runtime via `buildManifest()` / `renderLlmsTxt()`,
|
|
74
74
|
both exported from `@xano/sdk/internal`.
|
|
75
|
+
|
|
76
|
+
The package also ships the `xano-backend` agent skill at `skills/xano-backend/SKILL.md`. It
|
|
77
|
+
carries no reference of its own: it tells a coding agent when to set up a Xano backend, runs it
|
|
78
|
+
through `init` and the first deploy, and hands it to the project's `AGENTS.md` and `llms.txt`.
|
|
79
|
+
Installing it is in the [CLI guide](cli.md#the-agent-skill).
|
package/guides/deploying.md
CHANGED
|
@@ -652,6 +652,34 @@ re-importing the backend. One command cannot serve it and refuses it by name: `r
|
|
|
652
652
|
| `xanosdk local cache list` | Each cached engine version, its size on disk, and the engines running on it. |
|
|
653
653
|
| `xanosdk local cache clear` | Removes every cached engine (`--version <v>`: just that one). An engine running on a removed version is stopped first; the next deploy fetches it again. |
|
|
654
654
|
|
|
655
|
+
#### Connecting a coding agent
|
|
656
|
+
|
|
657
|
+
The Xano Engine serves an MCP server for coding agents, and a local deploy prints where. It is
|
|
658
|
+
for looking at the deployed backend (objects, table schemas, rows, run history), seeding and
|
|
659
|
+
editing rows, and running functions, tasks, triggers, endpoints and tests by hand, each
|
|
660
|
+
answering its result and logs. It never changes a primitive: tables, endpoints, functions and
|
|
661
|
+
every other object change in `xano/` and ship with `xanosdk deploy`.
|
|
662
|
+
|
|
663
|
+
`xanosdk init` connects Claude Code (`.mcp.json`) and Cursor (`.cursor/mcp.json`) to it with one
|
|
664
|
+
server, `xano-local`, that launches a bridge:
|
|
665
|
+
|
|
666
|
+
```json
|
|
667
|
+
{ "mcpServers": { "xano-local": { "command": "npx", "args": ["--yes", "--package", "@xano/sdk", "xanosdk", "local", "mcp", "--stdio"] } } }
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
Nothing has to be started or installed by hand: the agent launches the server itself, using the
|
|
671
|
+
project's own `@xano/sdk` when it is installed and fetching it when it is not (a fresh clone opened
|
|
672
|
+
before `npm install`). The config holds no url and no token. The engine may come back on a new port after a restart and
|
|
673
|
+
always mints a new bearer, so the bridge looks both up when it needs them, and again when the
|
|
674
|
+
engine stops answering or refuses the bearer. Before the first deploy the server connects and
|
|
675
|
+
lists no tools; once an engine is up it tells the agent its tools changed. A call cut off after
|
|
676
|
+
it reached the engine is reported as unknown, never sent twice. `xanosdk local mcp` prints the
|
|
677
|
+
details and each agent's config line, and `init` in an existing project adds the server beside
|
|
678
|
+
the ones a config already declares. An engine too old to serve MCP says so on deploy, and
|
|
679
|
+
`xanosdk local update` moves the project to one that does. Claude Code asks once before it
|
|
680
|
+
starts a project's server; a Cursor version that does not pick up the tool change needs the
|
|
681
|
+
`xano-local` server refreshed in its MCP settings after the first deploy.
|
|
682
|
+
|
|
655
683
|
#### A frontend on the Xano Engine, and server rendering
|
|
656
684
|
|
|
657
685
|
`xanosdk deploy <entry> --local --static <dir>` publishes a built frontend to the
|
|
@@ -1267,7 +1295,7 @@ xanosdk workspace diff ./xano/index.ts --json
|
|
|
1267
1295
|
}
|
|
1268
1296
|
```
|
|
1269
1297
|
|
|
1270
|
-
- `changedThere`: pull before you deploy
|
|
1298
|
+
- `changedThere`: pull before you deploy. `deploy --to workspace` refuses to overwrite it (see below).
|
|
1271
1299
|
- `changedHere`: deploy it.
|
|
1272
1300
|
- `changedBoth`: reconcile by hand.
|
|
1273
1301
|
- `unclassified`: the baseline cannot tell. The object has no baseline entry, both sides
|
|
@@ -1295,6 +1323,22 @@ A few things to know about the baseline:
|
|
|
1295
1323
|
next sync records a new baseline.
|
|
1296
1324
|
- On a merge conflict in `xano.lock`, keep either side's baseline for a branch, or delete it.
|
|
1297
1325
|
|
|
1326
|
+
#### The deploy guard
|
|
1327
|
+
|
|
1328
|
+
`deploy --to workspace` reads the same baseline before it writes. When an object it would
|
|
1329
|
+
overwrite is in `changedThere` or `changedBoth`, it refuses with exit 2 and
|
|
1330
|
+
`SDK_WORKSPACE_CHANGED`. The refusal's `details.objects` lists those objects, and
|
|
1331
|
+
`details.changedThere`, `details.changedBoth` and `details.baseline` say how each was classified.
|
|
1332
|
+
Pull the change into the project and commit it, then deploy again. To deploy over it anyway, pass
|
|
1333
|
+
`--overwrite`; the run warns (`deploy.overwrite-changed`) and names what it overwrote. A
|
|
1334
|
+
`--dry-run` refuses nothing: it warns and lists the objects under `changedInXano`.
|
|
1335
|
+
|
|
1336
|
+
The guard counts only what the deploy writes. A merge leaves an object that only the branch holds
|
|
1337
|
+
alone, so an object added in Xano is refused over only under `--prune` or `--replace`, which
|
|
1338
|
+
delete it. Nothing is refused when the branch has no baseline, over an `unclassified`
|
|
1339
|
+
difference, or on a `--branch` deploy to a branch that does not exist yet. It reads the branch
|
|
1340
|
+
once, before the confirmation, so an edit made in Xano after that read is not caught.
|
|
1341
|
+
|
|
1298
1342
|
### Deploying to a branch
|
|
1299
1343
|
|
|
1300
1344
|
`--branch <label>` stages on a Xano branch instead of the live one, which is the safer shape
|
package/guides/scaffold.md
CHANGED
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
# The scaffolded project
|
|
2
2
|
|
|
3
|
-
What `xanosdk init` writes, the two frontend presets, theming, add-ons, and the SvelteKit prerendering rules.
|
|
3
|
+
What `xanosdk init` writes, the two frontend presets, a project with no frontend, adding the backend to an existing app, theming, add-ons, and the SvelteKit prerendering rules.
|
|
4
4
|
|
|
5
5
|
## init flags and add-ons
|
|
6
6
|
|
|
7
|
-
`init` flags: `--framework <react|svelte>` (default: `react`
|
|
7
|
+
`init` flags: `--framework <react|svelte|none>` (default: `react`; `none` writes the
|
|
8
|
+
backend alone — see [No frontend, and existing apps](#no-frontend-and-existing-apps)), `--name <name>`
|
|
8
9
|
(default: the folder name), `--theme <id>` / `--radius <len>` / `--dark <mode>` /
|
|
9
10
|
`--font <id>` / `--font-mono <id>` / `--font-heading <id>` / `--icons <id>`
|
|
10
11
|
(the look — see [Theming](#theming)), `--no-agents-md` (skip the `AGENTS.md`
|
|
11
12
|
agent brief, which every coding agent reads and `init` writes by default),
|
|
12
13
|
`--marketplace <pkg>` (repeatable, comma-separated; installs add-ons and
|
|
13
|
-
registers them — below), `--force` (
|
|
14
|
-
|
|
15
|
-
without a terminal — files it does not write are kept),
|
|
14
|
+
registers them — below), `--force` (write over what clashes when adding the backend to
|
|
15
|
+
a non-empty folder; it lists the files and scripts it would overwrite and asks, `--yes`
|
|
16
|
+
answering without a terminal — files it does not write are kept),
|
|
16
17
|
`--no-install` (skip `npm install`), `--web` (choose all of the above in a
|
|
17
18
|
browser instead — see [Choosing in a browser](#choosing-in-a-browser)),
|
|
18
19
|
`--from <source>` (fill `xano/` from an existing backend — any
|
|
19
20
|
[backend spelling](cli.md#naming-a-backend) or a bundle path — rather than the
|
|
20
21
|
starter — see [Pulling an existing workspace](codegen.md); over an existing `xano/` it lists
|
|
21
22
|
what it replaces and asks, and `--yes` answers without a terminal).
|
|
22
|
-
In a terminal, `init` prompts for the framework
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
In a terminal, `init` prompts for the framework in an empty or missing folder
|
|
24
|
+
(React, Svelte, or "No frontend"); the prompt has a default, so pressing enter is a
|
|
25
|
+
valid answer. A folder that already has files gets no prompt and no frontend. The look
|
|
26
|
+
is never prompted for — it comes from the flags above, or from `--web`.
|
|
25
27
|
The starter backend is empty but already compiles and deploys — grow it from the
|
|
26
28
|
walkthrough in `xano/EXAMPLE.md`.
|
|
27
29
|
|
|
@@ -113,10 +115,59 @@ project — the mistake npm answers by silently writing to the wrong `package.js
|
|
|
113
115
|
The package name is passed through exactly as typed, so version specifiers, tags,
|
|
114
116
|
and third-party packages all work.
|
|
115
117
|
|
|
118
|
+
## No frontend, and existing apps
|
|
119
|
+
|
|
120
|
+
`init` reads its target directory before it writes anything. An empty or missing directory
|
|
121
|
+
is a **new** project, and `--framework` decides its frontend. Any other directory is an
|
|
122
|
+
**existing** project, which has its own app and gets the backend only.
|
|
123
|
+
|
|
124
|
+
**A new project with `--framework none`** (or "No frontend" at the prompt) gets everything
|
|
125
|
+
above except the frontend: `xano/`, a `package.json` with only the backend's scripts and
|
|
126
|
+
dependencies, `.gitignore`, `.gitattributes`, the CI check, a README and `AGENTS.md`. There is
|
|
127
|
+
no `frontend/` and no root `tsconfig.json`; `xano/` type-checks under its own
|
|
128
|
+
`xano/tsconfig.json`, and `npm run xano:typecheck` checks it and its lambdas.
|
|
129
|
+
`xano:deploy:ephemeral` deploys the backend alone, and there is no `dev`, `build` or
|
|
130
|
+
`xano:deploy:frontend`.
|
|
131
|
+
|
|
132
|
+
**An existing project** (any non-empty directory) gets:
|
|
133
|
+
|
|
134
|
+
- `xano/`, the same starter a new project gets. When the project's `package.json` is not
|
|
135
|
+
`"type": "module"` (Next.js and `npm init -y` write one that is not), `init` also writes
|
|
136
|
+
`xano/package.json` holding only `{"type": "module"}`, so `xano/` loads as ES modules
|
|
137
|
+
without changing the project's own type.
|
|
138
|
+
- The `xano:*` scripts and the backend's dependencies merged into `package.json`. The
|
|
139
|
+
project's entries win: a dependency it already has keeps its range, a script it already
|
|
140
|
+
has keeps its command, and no other key changes (an add-on's settings under `"xanosdk"`
|
|
141
|
+
aside). The file keeps its indentation and line endings. A project with no
|
|
142
|
+
`package.json` gets one holding only what the backend needs.
|
|
143
|
+
- A marked block in `.gitignore` (created when missing) and in `AGENTS.md`, added or
|
|
144
|
+
refreshed in place; the rest of each file is left as it was. A symlinked `AGENTS.md` is left
|
|
145
|
+
alone, and `--no-agents-md` skips it.
|
|
146
|
+
- No frontend, README, CI workflow or root `tsconfig.json`. The line-ending rule goes in
|
|
147
|
+
`xano/.gitattributes`, scoped to `xano/`, so the project's own files are not renormalized.
|
|
148
|
+
|
|
149
|
+
What would be written over is a **clash**: an existing `xano/`, any other file `init` writes
|
|
150
|
+
that is already there, and a `xano:*` script the project defines with a different command (the
|
|
151
|
+
same command is no clash). `init` lists every clash and writes nothing; `--force` lists what it
|
|
152
|
+
overwrites and asks first. A `package.json` that is not valid JSON is refused, since there is
|
|
153
|
+
nothing to merge into.
|
|
154
|
+
|
|
155
|
+
`--framework react` or `--framework svelte` in a non-empty directory is refused, as are the
|
|
156
|
+
frontend-only flags (`--theme`, `--radius`, `--dark`, `--font`, `--font-mono`,
|
|
157
|
+
`--font-heading`, `--icons`) wherever no frontend is written. After the merge, `npm run
|
|
158
|
+
xano:deploy` runs the backend on the Xano Engine as it does in a new project.
|
|
159
|
+
|
|
160
|
+
If the project's own root `tsconfig.json` includes every `.ts` file (Next.js's does), add
|
|
161
|
+
`"xano/lambdas"` to its `exclude` before adding the first lambda: the lambda globals
|
|
162
|
+
type-check only under `xano/lambdas/tsconfig.json`. `init` leaves that file alone, and the
|
|
163
|
+
`AGENTS.md` it writes says the same.
|
|
164
|
+
|
|
116
165
|
## Git and CI
|
|
117
166
|
|
|
118
|
-
|
|
119
|
-
below the repository root, so moving it up never replaces another workflow).
|
|
167
|
+
A new project gets a `.gitattributes` and a `.github/workflows/check.yml` (`xanosdk-<dir>.yml`
|
|
168
|
+
below the repository root, so moving it up never replaces another workflow). An existing
|
|
169
|
+
project gets no workflow, and its line-ending rule is scoped to `xano/`; run
|
|
170
|
+
`npm run xano:check` from its own CI.
|
|
120
171
|
|
|
121
172
|
The attributes file normalizes line endings, so any generated artifact the project
|
|
122
173
|
commits is byte-identical on every checkout and a `--frozen-lock` check cannot fail
|
package/llms/errors.md
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
- A response types as `StackTupleWidened` — a `Statement[]` helper was spread into the stack; return `statements(...)`. `llms.txt`; `llms/statements-runtime.md`.
|
|
35
35
|
- `ERR_PACKAGE_PATH_NOT_EXPORTED` — `tsx -e "import …"`, or running from outside the project root; run a real file with `tsx <file.ts>` from the root. `llms/client.md`.
|
|
36
36
|
- `Missing statement: mvp:placeholder` on import — an unconfigured slot in a pulled tree; replace it with the statement it stands in for. `llms/legacy.md`.
|
|
37
|
-
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
37
|
+
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_WORKSPACE_CHANGED` (deploy over objects edited in Xano since the last sync; `details.objects`; pull first or `--overwrite`), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
38
38
|
- A CLI command reports `could not reach <url>: fetch failed (<code>)` — blocked egress, not a bad credential; fix it before `xanosdk login`, which rotates a single-use refresh token.
|
|
39
39
|
|
|
40
40
|
### CLI exit codes
|
package/llms/kinds-agent-mcp.md
CHANGED
|
@@ -25,6 +25,6 @@
|
|
|
25
25
|
- `llm` (REQUIRED): typed provider settings, a discriminated union on `type` (`"xano-free" | "anthropic" | "openai" | "google-genai"`). Shared fields: `systemPrompt?`, `maxSteps?` (default `5`), and `prompt?` XOR `messages?` (genuinely exclusive: both is a type error and throws — the engine stores ONE `prompt_type`, so one would be dropped); plus provider fields (`apiKey?`, `model?`, `temperature?`, `reasoningEffort?`, …). String fields accept Twig placeholders — `{{ $args.x }}` for run inputs (the `args` of `s.ai.agent.run`), `{{ $env.NAME }}` for env vars.
|
|
26
26
|
- `tools?`: same `ToolsetToolEntry[]` as `mcpServer` — bare `tool()` handles, or a `{ tool, enabled?, auth? }` wrapper when one needs `enabled`/`auth`. A tool reading `auth()` MUST use the wrapper naming the auth table — a bare handle runs it with no caller (see `mcpServer`'s `tools?`).
|
|
27
27
|
- `output?`: `{ schema: Record<string, input.*>, enabled? }` — structured-output schema. `schema` is a named-field record authored with the `input.*` catalog, exactly like a `defineFunction`/`query` `input:` map (the stored `structuredOutputsSchema` is the same wire shape as function inputs). e.g. `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`. When you pass the agent *handle* to `s.ai.agent.run({ agent })`, `.result` is typed straight from this schema — no `resultShape` witness needed (the shape is declared once). `resultShape` remains only to override that, or to type an agent referenced by bare name.
|
|
28
|
-
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`.
|
|
28
|
+
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, allowToolExecution: c.bool(true), as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`. ⚠ An agent with tools needs `allowToolExecution: c.bool(true)` on the run: unset, its tools are OFF and it answers without them (warns `stack.agent-tools-off`).
|
|
29
29
|
- **Marketplace:** for chat history, use `@xano-sdk/chatbot`; for vector RAG, use `@xano-sdk/vector` (`tools: [vector.searchTool]`). Find add-ons with `xanosdk marketplace search <q>`.
|
|
30
30
|
- Both kinds persist under the `toolset` payload key, so a same-name `agent` + `mcpServer` pair derives ONE guid and `export()` throws — give them distinct names.
|
package/llms-full.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanosdk v1.0.
|
|
1
|
+
# xanosdk v1.0.8
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -766,7 +766,7 @@ core sections still refresh; under `routes --emit --strict` it is fatal. `@xano-
|
|
|
766
766
|
- A response types as `StackTupleWidened` — a `Statement[]` helper was spread into the stack; return `statements(...)`. `llms.txt`; `llms/statements-runtime.md`.
|
|
767
767
|
- `ERR_PACKAGE_PATH_NOT_EXPORTED` — `tsx -e "import …"`, or running from outside the project root; run a real file with `tsx <file.ts>` from the root. `llms/client.md`.
|
|
768
768
|
- `Missing statement: mvp:placeholder` on import — an unconfigured slot in a pulled tree; replace it with the statement it stands in for. `llms/legacy.md`.
|
|
769
|
-
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
769
|
+
- A CLI command fails under `--json` or piped (unless stdout carries data): stdout is `{ ok: false, error: { code, message, exitCode, details?, suggestion? } }`, as does a failed release write. Codes: `SDK_SEED_IN_STATIC` (`details.leaks[]` → `publicSeed`), `SDK_EXPORT_INVALID` (`details.diagnostics[]`, `--strict` too), `SDK_DRIFT`, `SDK_BRANCH_TAKEN`, `SDK_BRANCH_LIVE`, `SDK_RELEASE_NAME_TAKEN`, `SDK_RELEASE_FILES_NOT_CARRIED`, `SDK_LIVE_BRANCH_MISMATCH` (`details.conflictsWith`), `SDK_IDENTITY_CONFLICT`, `SDK_KIND_CONFLICT`, `SDK_PRUNE_OUT_OF_SCOPE`, `SDK_IMPORT_REFUSED`, `SDK_SHARED_SCHEMA_CHANGE`, `SDK_CONSTRAINT_VIOLATION`, `SDK_CREDENTIAL_REJECTED` (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`; ids null on a refused env refresh), `SDK_WORKSPACE_CHANGED` (deploy over objects edited in Xano since the last sync; `details.objects`; pull first or `--overwrite`), `SDK_USAGE` (`details.reason: "needs-confirmation"`: run its `Re-run as`), `SDK_ERROR`. Landing refusal `details.refused`: identityConflict, renamePending, kindConflict, uniqueViolation, tableTrigger, importInProgress, importRefused, pruneOutOfScope. `warnings[]` / `details.warnings` / `accepted[]` entries: `{ code, message, subject? }` (`subject`: the def's `{ kind, name }`). Backend documents add `selector` and `workspaceId`.
|
|
770
770
|
- A CLI command reports `could not reach <url>: fetch failed (<code>)` — blocked egress, not a bad credential; fix it before `xanosdk login`, which rotates a single-use refresh token.
|
|
771
771
|
|
|
772
772
|
### CLI exit codes
|
|
@@ -874,7 +874,7 @@ The run is isolated in ways that make a correct test fail for reasons the failur
|
|
|
874
874
|
- `llm` (REQUIRED): typed provider settings, a discriminated union on `type` (`"xano-free" | "anthropic" | "openai" | "google-genai"`). Shared fields: `systemPrompt?`, `maxSteps?` (default `5`), and `prompt?` XOR `messages?` (genuinely exclusive: both is a type error and throws — the engine stores ONE `prompt_type`, so one would be dropped); plus provider fields (`apiKey?`, `model?`, `temperature?`, `reasoningEffort?`, …). String fields accept Twig placeholders — `{{ $args.x }}` for run inputs (the `args` of `s.ai.agent.run`), `{{ $env.NAME }}` for env vars.
|
|
875
875
|
- `tools?`: same `ToolsetToolEntry[]` as `mcpServer` — bare `tool()` handles, or a `{ tool, enabled?, auth? }` wrapper when one needs `enabled`/`auth`. A tool reading `auth()` MUST use the wrapper naming the auth table — a bare handle runs it with no caller (see `mcpServer`'s `tools?`).
|
|
876
876
|
- `output?`: `{ schema: Record<string, input.*>, enabled? }` — structured-output schema. `schema` is a named-field record authored with the `input.*` catalog, exactly like a `defineFunction`/`query` `input:` map (the stored `structuredOutputsSchema` is the same wire shape as function inputs). e.g. `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`. When you pass the agent *handle* to `s.ai.agent.run({ agent })`, `.result` is typed straight from this schema — no `resultShape` witness needed (the shape is declared once). `resultShape` remains only to override that, or to type an agent referenced by bare name.
|
|
877
|
-
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`.
|
|
877
|
+
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, allowToolExecution: c.bool(true), as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var("summary", ref("run.result.summary"))`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. `.toolCalls` is the FINAL step's calls only (often `[]`); every call is a `.steps[].content[]` entry of `type: "tool-call"`. ⚠ An agent with tools needs `allowToolExecution: c.bool(true)` on the run: unset, its tools are OFF and it answers without them (warns `stack.agent-tools-off`).
|
|
878
878
|
- **Marketplace:** for chat history, use `@xano-sdk/chatbot`; for vector RAG, use `@xano-sdk/vector` (`tools: [vector.searchTool]`). Find add-ons with `xanosdk marketplace search <q>`.
|
|
879
879
|
- Both kinds persist under the `toolset` payload key, so a same-name `agent` + `mcpServer` pair derives ONE guid and `export()` throws — give them distinct names.
|
|
880
880
|
|
package/llms.txt
CHANGED
package/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xanosdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
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>",
|
|
@@ -9076,6 +9118,10 @@
|
|
|
9076
9118
|
"flag": "--allow-shared-schema-changes",
|
|
9077
9119
|
"description": "Proceed even though table/microservice changes reach every branch — only with --to"
|
|
9078
9120
|
},
|
|
9121
|
+
{
|
|
9122
|
+
"flag": "--overwrite",
|
|
9123
|
+
"description": "Deploy over objects changed in Xano since the last deploy or pull (see `workspace diff`) — only with --to"
|
|
9124
|
+
},
|
|
9079
9125
|
{
|
|
9080
9126
|
"flag": "--allow-branch-deletion",
|
|
9081
9127
|
"description": "Acknowledge that --replace permanently deletes the workspace's other branches — only with --to"
|
|
@@ -9655,10 +9701,11 @@
|
|
|
9655
9701
|
},
|
|
9656
9702
|
{
|
|
9657
9703
|
"flag": "--framework <id>",
|
|
9658
|
-
"description": "Frontend
|
|
9704
|
+
"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
9705
|
"values": [
|
|
9660
9706
|
"react",
|
|
9661
|
-
"svelte"
|
|
9707
|
+
"svelte",
|
|
9708
|
+
"none"
|
|
9662
9709
|
]
|
|
9663
9710
|
},
|
|
9664
9711
|
{
|
|
@@ -9777,7 +9824,7 @@
|
|
|
9777
9824
|
},
|
|
9778
9825
|
{
|
|
9779
9826
|
"flag": "--force",
|
|
9780
|
-
"description": "Write
|
|
9827
|
+
"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
9828
|
},
|
|
9782
9829
|
{
|
|
9783
9830
|
"flag": "--no-install",
|
|
@@ -9851,7 +9898,7 @@
|
|
|
9851
9898
|
]
|
|
9852
9899
|
}
|
|
9853
9900
|
],
|
|
9854
|
-
"description": "Scaffold a Xano SDK project — empty, or filled from an existing backend"
|
|
9901
|
+
"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
9902
|
},
|
|
9856
9903
|
{
|
|
9857
9904
|
"command": "local cache",
|
|
@@ -9876,6 +9923,21 @@
|
|
|
9876
9923
|
"command": "local list",
|
|
9877
9924
|
"description": "List Xano Engines on this machine, marking the ones xanosdk started"
|
|
9878
9925
|
},
|
|
9926
|
+
{
|
|
9927
|
+
"command": "local mcp",
|
|
9928
|
+
"args": "[name]",
|
|
9929
|
+
"flags": [
|
|
9930
|
+
{
|
|
9931
|
+
"flag": "--stdio",
|
|
9932
|
+
"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"
|
|
9933
|
+
},
|
|
9934
|
+
{
|
|
9935
|
+
"flag": "--project <dir>",
|
|
9936
|
+
"description": "The project whose engine to reach, when the agent launches the bridge outside it (default: the current directory)"
|
|
9937
|
+
}
|
|
9938
|
+
],
|
|
9939
|
+
"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)"
|
|
9940
|
+
},
|
|
9879
9941
|
{
|
|
9880
9942
|
"command": "local stop",
|
|
9881
9943
|
"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.8",
|
|
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
|
},
|