@xano/sdk 1.0.6 → 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 +20 -5
- package/README.md +30 -4
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-67QIX45H.js → agent-file-refresh-DGGSRPJ4.js} +12 -12
- package/dist/agent-skill-command-37DFYS7Q.js +414 -0
- package/dist/{answer-shape-UCDUKPAN.js → answer-shape-RBFDCNZ7.js} +4 -4
- package/dist/{backend-dir-3LIL6SCT.js → backend-dir-KDD43X7K.js} +14 -14
- package/dist/{backend-slot-JREP27UD.js → backend-slot-TBOVZXDE.js} +3 -3
- package/dist/bin.js +48 -47
- package/dist/{branch-2IPHOAYS.js → branch-7PIKNUD7.js} +11 -10
- package/dist/{branch-commands-KTKAXBAN.js → branch-commands-EGY7ZEZE.js} +23 -22
- package/dist/bundle.js +4 -4
- package/dist/{chunk-GWTFI3GA.js → chunk-26LHXLD3.js} +2 -2
- package/dist/{chunk-ENMBEXOP.js → chunk-2ACWDSAQ.js} +3 -3
- package/dist/{chunk-GOLFAEUV.js → chunk-2SD4LA22.js} +2 -2
- package/dist/{chunk-GZHLCUZ6.js → chunk-2XWVZRL6.js} +7 -7
- package/dist/{chunk-IF4PEGVD.js → chunk-2YER2J47.js} +11 -11
- package/dist/{chunk-N5I37JFB.js → chunk-3FRGNBOC.js} +2 -2
- package/dist/{chunk-YKP4ZKVO.js → chunk-46PATL23.js} +3 -3
- package/dist/{chunk-QJM5XZ4K.js → chunk-47XT6WQL.js} +8 -8
- package/dist/{chunk-AWQ7BQTQ.js → chunk-4GPIOIAC.js} +6 -1
- package/dist/{chunk-ND43ZOS3.js → chunk-567KK6XF.js} +7 -7
- package/dist/{chunk-EQFYOOO6.js → chunk-5GIOCDUM.js} +829 -893
- package/dist/{chunk-TTEIDD5Q.js → chunk-5SCPRXFB.js} +4 -4
- package/dist/{chunk-LAOMN6QQ.js → chunk-5ZG7V2VW.js} +3 -3
- package/dist/{chunk-JXVJGF3Y.js → chunk-7M6JP3FS.js} +2 -2
- package/dist/{chunk-JFBRXRJD.js → chunk-7XXWKTCE.js} +36 -36
- package/dist/{chunk-PL7AIAWS.js → chunk-A4R5CAY4.js} +4 -111
- package/dist/{chunk-SPKA2LV6.js → chunk-AKERAUNH.js} +4 -4
- package/dist/{chunk-26MOFAJT.js → chunk-ARWMVNDJ.js} +6 -3
- package/dist/{chunk-I3VHW6XM.js → chunk-B2URJBC4.js} +18 -18
- package/dist/{chunk-A7MRZ4GF.js → chunk-B3P25SDP.js} +4 -4
- package/dist/chunk-BRANWM4U.js +853 -0
- package/dist/{chunk-CHINR7WD.js → chunk-BSVQEKHO.js} +4 -4
- package/dist/{chunk-UD2Z7K6W.js → chunk-BZ6WTG3E.js} +4 -4
- package/dist/{chunk-D7BUMOKU.js → chunk-CH23ONYG.js} +76 -5
- package/dist/{chunk-763M6LX3.js → chunk-CNZASQPL.js} +2 -2
- package/dist/{chunk-TECTL2NU.js → chunk-CPN6WSBH.js} +4 -4
- package/dist/{chunk-5YQV35C2.js → chunk-CT3J5JRZ.js} +7 -7
- package/dist/{chunk-YYC2DZMG.js → chunk-D5OZRJ3T.js} +6 -6
- package/dist/{chunk-XFBGXB7X.js → chunk-DG3APBUJ.js} +149 -97
- package/dist/chunk-DIWF7L33.js +995 -0
- package/dist/{chunk-RIN4YY34.js → chunk-DXZTL7NA.js} +95 -58
- package/dist/{chunk-PMMHSX4H.js → chunk-EF4MHLEW.js} +4 -4
- package/dist/{chunk-ZDP6GDAB.js → chunk-ELPQTDW6.js} +101 -93
- package/dist/{chunk-Q22BMRPF.js → chunk-EPFDY5JU.js} +2 -2
- package/dist/{chunk-ZJSTUD6D.js → chunk-EU32BC5B.js} +8 -8
- package/dist/{chunk-3BBIDW3Y.js → chunk-FDTET7FZ.js} +3 -3
- package/dist/{chunk-YYLUBYXM.js → chunk-FENA7K7C.js} +3 -3
- package/dist/{chunk-QZEAANWP.js → chunk-GHMLRFRX.js} +8 -8
- package/dist/{chunk-MBDFH7XB.js → chunk-H2K4GFUS.js} +3 -3
- package/dist/{chunk-U35MTOXQ.js → chunk-HTQWAQRW.js} +3 -3
- package/dist/{chunk-ROY4YAEQ.js → chunk-HU7F56VF.js} +22 -2
- package/dist/{chunk-2FLIJGBZ.js → chunk-HZ6ADG3O.js} +47 -8
- package/dist/{chunk-GLY552SI.js → chunk-I6XRUU6U.js} +54 -54
- package/dist/{chunk-KPFS3RGM.js → chunk-IPNN2KRW.js} +3 -3
- package/dist/{chunk-LD6ARK3A.js → chunk-JOOKM7AH.js} +2 -2
- package/dist/{chunk-6X6BJN6Y.js → chunk-JOWY6HFL.js} +3 -3
- package/dist/{chunk-UIVMR7UK.js → chunk-JX6N73H3.js} +2 -2
- package/dist/{chunk-JRVQ7M7W.js → chunk-L472YIGG.js} +8 -8
- package/dist/{chunk-YR2I5HGE.js → chunk-L6HZ67P6.js} +2 -2
- package/dist/chunk-LCOCRJ4K.js +116 -0
- package/dist/{chunk-3EDSPMXN.js → chunk-LJM5CIY4.js} +5 -1
- package/dist/{chunk-NPODGBVJ.js → chunk-M2C54ZBC.js} +4 -4
- package/dist/{chunk-QXYMDARD.js → chunk-M3NEK3LT.js} +4 -4
- package/dist/{chunk-BL3AZ3AP.js → chunk-MBL7CXJ7.js} +2 -2
- package/dist/{chunk-7GAIJW62.js → chunk-MYZRMSPM.js} +2 -2
- package/dist/{chunk-GHQ4BVI4.js → chunk-N3YFCFCO.js} +13 -13
- package/dist/{chunk-M5CSVB23.js → chunk-NDJAKSE7.js} +11 -8
- package/dist/{chunk-Z4ZGTCCD.js → chunk-NV37YGOV.js} +6 -6
- package/dist/{chunk-GW5RHGOB.js → chunk-O56DQKPL.js} +9 -9
- package/dist/{chunk-U6MTGB46.js → chunk-ORGNLQN6.js} +5 -5
- package/dist/{chunk-I3H3HCPY.js → chunk-PEIBGH2V.js} +33 -30
- package/dist/{chunk-5TVFLG3C.js → chunk-PEX4QZVI.js} +2 -2
- package/dist/{chunk-HCG7NDIL.js → chunk-PV25BDCH.js} +5 -5
- package/dist/{chunk-VDHA5SSQ.js → chunk-PY722CHR.js} +2 -2
- package/dist/{chunk-VW4CWVYX.js → chunk-QGIZLFAS.js} +4 -4
- package/dist/{chunk-SSITMX7I.js → chunk-QRQ54LUI.js} +16 -14
- package/dist/{chunk-OIKLDDYC.js → chunk-RBU2YX22.js} +3 -3
- package/dist/{chunk-EADVVTDK.js → chunk-RRMH7WMY.js} +7 -7
- package/dist/{chunk-WZHLMU6T.js → chunk-S46ODQRA.js} +2 -2
- package/dist/{chunk-SPITRSOF.js → chunk-SDGV76HF.js} +2 -2
- package/dist/{chunk-ATJ2W7DC.js → chunk-SGK3PTTM.js} +281 -121
- package/dist/{chunk-3II44CUJ.js → chunk-TWVUYS63.js} +24 -24
- package/dist/{chunk-2WBH5HUY.js → chunk-U5M7T6CI.js} +7 -7
- package/dist/{chunk-6X3MY2JP.js → chunk-UYFUIHH3.js} +2 -2
- package/dist/{chunk-IMELQ2I6.js → chunk-V7MBRUK6.js} +3 -3
- package/dist/{chunk-NDWVJ2QZ.js → chunk-VAGSKUWC.js} +3 -3
- package/dist/{chunk-WBH4KJWM.js → chunk-VIJ5D3RC.js} +3 -3
- package/dist/{chunk-ITC2R2OT.js → chunk-VNDR2T35.js} +7 -7
- package/dist/{chunk-IXFJORNH.js → chunk-WNCW2RNB.js} +4 -4
- package/dist/{chunk-BTVUYHWV.js → chunk-WUEPP5HD.js} +4 -4
- package/dist/{local-engine-command-RYLGMQ2O.js → chunk-YCUDOF6Q.js} +22 -77
- package/dist/{chunk-YGLMRH5U.js → chunk-YH2JVJAO.js} +12 -12
- package/dist/{chunk-PFBXSVZF.js → chunk-ZGLNHA7T.js} +7 -7
- package/dist/{chunk-CCU5CCRX.js → chunk-ZJOAWRED.js} +8 -8
- package/dist/{chunk-FU3VCE5A.js → chunk-ZXRDD3Q2.js} +13 -9
- package/dist/cli.d.ts +25 -4
- package/dist/cli.js +45 -42
- package/dist/{codegen-command-R5IASBFC.js → codegen-command-T7TC7PQO.js} +58 -57
- package/dist/{commands-H7CPMMHH.js → commands-JDENTDJS.js} +2 -2
- package/dist/{completion-W5ZAI6TN.js → completion-YFD5OVJW.js} +8 -4
- package/dist/{config-MZ5KG4EP.js → config-YJFUTRJW.js} +7 -7
- package/dist/{deploy-command-34T2LKQ5.js → deploy-command-OEVEE6UG.js} +50 -49
- package/dist/{deploy-source-YLQ7WMYR.js → deploy-source-HYVZEYXV.js} +33 -32
- package/dist/{dev-env-sync-TMJTNU3U.js → dev-env-sync-EFDCJ6KU.js} +48 -47
- package/dist/{display-name-hint-ZJGFNJKQ.js → display-name-hint-SW3GB3V7.js} +13 -12
- package/dist/{emit-D125xxty.d.ts → emit-Dov_92kn.d.ts} +1 -1
- package/dist/{env-example-refresh-CQP3ZMKM.js → env-example-refresh-WNSOH534.js} +59 -58
- package/dist/{env-pull-command-UTG6IC2K.js → env-pull-command-UYEXMQ3P.js} +43 -42
- package/dist/{env-target-FZROWYFS.js → env-target-JBSLBKNX.js} +12 -11
- package/dist/{env-var-command-VYDBQJJW.js → env-var-command-BJNRAXNV.js} +49 -48
- package/dist/{ephemeral-BIE6FMJV.js → ephemeral-CEOGMIEA.js} +10 -9
- package/dist/{ephemeral-command-OZ26RGXF.js → ephemeral-command-IPSGBCS5.js} +61 -60
- package/dist/{ephemeral-state-SNZOX2YK.js → ephemeral-state-MTBASPRS.js} +10 -9
- package/dist/{generate-command-4HR7MR36.js → generate-command-XQXODBS6.js} +73 -71
- package/dist/{gitignore-EWQBXNX2.js → gitignore-RUVCIZO4.js} +18 -18
- package/dist/{impersonate-command-WC7OGKUM.js → impersonate-command-MA27O7S5.js} +41 -40
- package/dist/{import-7Z4GCCPO.js → import-XKRFHABE.js} +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/{init-command-HAO3WXH3.js → init-command-6RDTCMAB.js} +61 -46
- package/dist/{init-modules-NSKD4ASY.js → init-modules-DHTBOCQT.js} +7 -7
- package/dist/{init-web-MKFFOQUU.js → init-web-ELBXSXDL.js} +2 -2
- package/dist/internal.d.ts +4 -4
- package/dist/internal.js +1 -1
- package/dist/{keep-data-merge-QR2TMKEO.js → keep-data-merge-TDJOIAVT.js} +23 -23
- package/dist/{lambda-config-reconcile-7FJXXV6V.js → lambda-config-reconcile-47X5C2E4.js} +6 -5
- package/dist/{landing-record-MWXFIRCP.js → landing-record-TPPYFQAS.js} +21 -21
- package/dist/{local-engine-choice-VD5LNXJU.js → local-engine-choice-S6VHPJRU.js} +36 -35
- 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-6O7NKZCA.js → local-engine-deploy-FOPNWU7X.js} +17 -15
- 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-ZLLZEIRF.js → local-engine-process-XUQPQENQ.js} +11 -8
- package/dist/{local-engine-state-OCW5YDD7.js → local-engine-state-JQPKGB65.js} +4 -3
- package/dist/{local-engine-update-check-LVX4HBBI.js → local-engine-update-check-S7UF6ZF5.js} +6 -5
- package/dist/{lock-commands-X2OECR4R.js → lock-commands-HJ6Y5QVS.js} +51 -50
- package/dist/{login-command-RLLKD565.js → login-command-JO55NZAS.js} +32 -32
- package/dist/{logout-command-XDMSXCDO.js → logout-command-MPRIRSJA.js} +15 -14
- package/dist/{marketplace-command-2NHHY2X3.js → marketplace-command-BM6G257N.js} +33 -33
- package/dist/{marketplace-resolve-OTZYT4FG.js → marketplace-resolve-AWH3RG57.js} +5 -5
- package/dist/{meta-client-TMHVBZFY.js → meta-client-AOSWODQQ.js} +13 -12
- package/dist/{module-manifest-FNMW23IX.js → module-manifest-GXI46PEF.js} +3 -3
- package/dist/node.d.ts +4 -4
- package/dist/node.js +50 -49
- package/dist/{operation-outcome-RN62735X.js → operation-outcome-4UKPXTNC.js} +25 -23
- package/dist/{output-target-MOLCTPBP.js → output-target-RAZ4KN5J.js} +19 -19
- package/dist/{plan-disclosure-CY7AF6KP.js → plan-disclosure-JR52DWXN.js} +13 -12
- package/dist/{plugin-contributions-WR26U7NT.js → plugin-contributions-E6XHLQWK.js} +5 -5
- package/dist/{plugin-prompt-ZUYQQIX4.js → plugin-prompt-IODX5EU6.js} +4 -4
- package/dist/{plugin-questions-HAZOQ67R.js → plugin-questions-AAAJ7POP.js} +3 -3
- package/dist/{preflight-command-OHJXYND3.js → preflight-command-7GKJBWOQ.js} +52 -51
- package/dist/{profile-command-6JWT2BTL.js → profile-command-CM6J7E2M.js} +33 -33
- package/dist/{profile-pointer-PDA5XBIB.js → profile-pointer-KTYXL6FU.js} +4 -3
- package/dist/{project-dependency-GZWWGWEW.js → project-dependency-OQ5575QQ.js} +6 -6
- package/dist/{project-sdk-3W72H5QO.js → project-sdk-2ESHHZVL.js} +3 -3
- package/dist/{promote-command-UYAMUXKB.js → promote-command-BDRPG6UU.js} +68 -67
- package/dist/{prompt-U37K5RPQ.js → prompt-MQPGU4ZI.js} +3 -3
- package/dist/{publish-command-BUS27HGB.js → publish-command-IEMYZ7LF.js} +55 -54
- package/dist/{pull-command-ZGUNP27P.js → pull-command-S5E2ABZ4.js} +61 -60
- package/dist/{pull-superseded-EZBGYRZF.js → pull-superseded-E34BZVLH.js} +3 -3
- package/dist/{release-command-BQ6OHS3P.js → release-command-7F5TBKO2.js} +58 -57
- package/dist/{release-ns-command-ATGVBVIU.js → release-ns-command-EK2ZQ4CC.js} +84 -83
- package/dist/{retry-command-QJ57WVW7.js → retry-command-GL5HCMVB.js} +9 -8
- package/dist/{routes-manifest-file-UALYSZLY.js → routes-manifest-file-LCIKPDAG.js} +5 -5
- package/dist/scaffold.js +4 -4
- package/dist/secrets-IV4N5HYI.js +20 -0
- package/dist/{secrets-file-LMS7KX3E.js → secrets-file-LXREYU3M.js} +18 -18
- package/dist/{secrets-fill-command-QNBDGCGM.js → secrets-fill-command-QHZS3KWM.js} +49 -48
- package/dist/{seed-SZ6OS5DQ.js → seed-FRKMDN2Z.js} +4 -4
- package/dist/{source-resolve-MKLNYFWG.js → source-resolve-BBHYTOXI.js} +23 -21
- package/dist/{static-host-ONEHA4LI.js → static-host-7LC7OZR4.js} +4 -4
- package/dist/{status-command-XKIFKBGM.js → status-command-TY253MJT.js} +52 -51
- package/dist/{store-Bg4Na6Sm.d.ts → store-Boba9OOh.d.ts} +1 -1
- package/dist/{store-X6ZH7EC3.js → store-VJ3OS6VO.js} +7 -6
- package/dist/{sync-contributions-HNVHDIQW.js → sync-contributions-63542VE4.js} +9 -9
- package/dist/{sync-record-PRXHLK4S.js → sync-record-RGHK7EAL.js} +13 -12
- package/dist/{table-DC36QA4Y.js → table-OAYGFGEN.js} +5 -5
- package/dist/{tables-command-UQLKTELN.js → tables-command-PZIVDAH3.js} +38 -37
- package/dist/{tenant-EKNQGG5A.js → tenant-Y3II4VY3.js} +11 -10
- package/dist/{tenant-command-2LWP2MPB.js → tenant-command-G6XON7CF.js} +86 -85
- package/dist/{test-command-IU5MBBXY.js → test-command-3FZOX7O3.js} +41 -40
- package/dist/{tests-RG2Y5EQ4.js → tests-KF6N6BZ7.js} +5 -5
- package/dist/{token-7AWSJLKO.js → token-DJJUW5HY.js} +11 -10
- package/dist/{toolchain-hooks-4ZMQLBPQ.js → toolchain-hooks-7PWCFLSU.js} +4 -4
- package/dist/{toolchain-modules-VU7SURVJ.js → toolchain-modules-OTNSKK52.js} +4 -4
- package/dist/{toolchain-peers-CIDNEEQV.js → toolchain-peers-KQ7TQ2AR.js} +7 -7
- package/dist/{tracked-backend-4BHSV7NC.js → tracked-backend-AJCGTO5Y.js} +36 -35
- package/dist/{update-check-A7FXIINW.js → update-check-4E5L6GAW.js} +46 -45
- package/dist/{upgrade-command-C5KBITFI.js → upgrade-command-BXMSQN4C.js} +52 -49
- package/dist/{whoami-command-7WQII2H4.js → whoami-command-NLCCIEUM.js} +14 -13
- package/dist/{workspace-Z46PUZNI.js → workspace-PNMJOXE4.js} +4 -4
- package/dist/{workspace-binding-JE6YNDZJ.js → workspace-binding-J5GWDFRI.js} +13 -12
- package/dist/{workspace-command-FC4IMLAE.js → workspace-command-MHIIY352.js} +79 -78
- package/dist/{workspace-env-N4ZPFT6A.js → workspace-env-LLRWCHSA.js} +15 -15
- package/dist/{workspace-export-3A5BZTPS.js → workspace-export-BIKAYHWJ.js} +4 -4
- package/dist/{writable-D7KCZI5N.js → writable-UOTO4WWC.js} +3 -3
- package/dist/{xanosdk-import-P2A2KSXM.js → xanosdk-import-S7A3CVBN.js} +5 -5
- package/dist/{xanosdk-project-6AGMW2SL.js → xanosdk-project-J4VCFRHP.js} +15 -15
- package/guides/README.md +2 -2
- package/guides/cli.md +69 -0
- package/guides/codegen.md +23 -5
- package/guides/codes.md +1 -0
- package/guides/coverage.md +5 -0
- package/guides/deploying.md +28 -0
- package/guides/scaffold.md +61 -10
- package/llms-full.txt +1 -1
- package/llms.txt +1 -1
- package/manifest.json +63 -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/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
|
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-full.txt
CHANGED
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.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.
|