@xano/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +788 -0
- package/LICENSE +21 -0
- package/README.md +541 -0
- package/dist/.build-fingerprint +1 -0
- package/dist/agent-file-refresh-ZEMK33AX.js +38 -0
- package/dist/answer-shape-K67TAAPY.js +33 -0
- package/dist/backend-dir-2U53CIAL.js +39 -0
- package/dist/backend-slot-7QXW2QYC.js +28 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +255 -0
- package/dist/branch-NCRNWQBQ.js +61 -0
- package/dist/branch-commands-ACIRCEQJ.js +79 -0
- package/dist/bundle.d.ts +223 -0
- package/dist/bundle.js +153 -0
- package/dist/capture-WAXPD7DR.js +41 -0
- package/dist/chunk-27GWNP2I.js +23 -0
- package/dist/chunk-2CMJZDCL.js +177 -0
- package/dist/chunk-2EZ3ZJZZ.js +302 -0
- package/dist/chunk-2GNFDZA2.js +390 -0
- package/dist/chunk-2MNLRIOX.js +11 -0
- package/dist/chunk-2TFRR6JV.js +104 -0
- package/dist/chunk-2ZUEE4EK.js +408 -0
- package/dist/chunk-36JUQZVQ.js +22 -0
- package/dist/chunk-3DRXWLJ5.js +83 -0
- package/dist/chunk-3JDU4VRL.js +137 -0
- package/dist/chunk-3KZCLN4Z.js +241 -0
- package/dist/chunk-3LDULPRE.js +168 -0
- package/dist/chunk-3M4LFYNQ.js +111 -0
- package/dist/chunk-3XI5CTUE.js +22 -0
- package/dist/chunk-3YW23UFH.js +50 -0
- package/dist/chunk-45UIT5T2.js +862 -0
- package/dist/chunk-4BW2SG2N.js +46 -0
- package/dist/chunk-4KHEMC32.js +79 -0
- package/dist/chunk-4POWHT2K.js +321 -0
- package/dist/chunk-4Q2GN7NW.js +192 -0
- package/dist/chunk-5A2PLKZB.js +70 -0
- package/dist/chunk-5FBYXK5P.js +159 -0
- package/dist/chunk-5HVXPTU4.js +323 -0
- package/dist/chunk-5QU2P5CA.js +304 -0
- package/dist/chunk-5V5XU32D.js +191 -0
- package/dist/chunk-5ZSO4T2G.js +10 -0
- package/dist/chunk-622HUCZT.js +10 -0
- package/dist/chunk-65HWOMGV.js +177 -0
- package/dist/chunk-6ELFRN3P.js +365 -0
- package/dist/chunk-6HO3NCSJ.js +1055 -0
- package/dist/chunk-6IUMKYWI.js +457 -0
- package/dist/chunk-6KEB3C3U.js +65 -0
- package/dist/chunk-6MR5TI5V.js +987 -0
- package/dist/chunk-6NNTNXN7.js +157 -0
- package/dist/chunk-6PBR37LN.js +97 -0
- package/dist/chunk-6QXLMMT3.js +155 -0
- package/dist/chunk-6ZGJCBZS.js +224 -0
- package/dist/chunk-73IVBKMA.js +250 -0
- package/dist/chunk-7G3CTU7I.js +286 -0
- package/dist/chunk-A3UDOZB6.js +222 -0
- package/dist/chunk-A6E77GDW.js +85 -0
- package/dist/chunk-AHJWCYQO.js +660 -0
- package/dist/chunk-AKNCFVKZ.js +36 -0
- package/dist/chunk-AM4FKL4J.js +237 -0
- package/dist/chunk-AN6BL47T.js +26 -0
- package/dist/chunk-AOSYVMUS.js +147 -0
- package/dist/chunk-APWXY5SL.js +182 -0
- package/dist/chunk-AWEIIR2U.js +218 -0
- package/dist/chunk-AWQ7BQTQ.js +73 -0
- package/dist/chunk-BAUZOWGX.js +393 -0
- package/dist/chunk-BHACRS6R.js +940 -0
- package/dist/chunk-BWPNT55T.js +680 -0
- package/dist/chunk-C6RIMRU4.js +187 -0
- package/dist/chunk-CGVQZXYG.js +263 -0
- package/dist/chunk-CIMQZRRE.js +162 -0
- package/dist/chunk-CJHQKJU4.js +113 -0
- package/dist/chunk-CTMO46PK.js +1897 -0
- package/dist/chunk-D53J55C5.js +106 -0
- package/dist/chunk-D7VGG3WS.js +90 -0
- package/dist/chunk-DAD3ONIS.js +245 -0
- package/dist/chunk-DGWHAVRG.js +162 -0
- package/dist/chunk-DX4QR4B2.js +483 -0
- package/dist/chunk-EHP3WPEG.js +21 -0
- package/dist/chunk-ELP2HMXC.js +432 -0
- package/dist/chunk-ERVIASGL.js +21 -0
- package/dist/chunk-ET4Y4XCB.js +865 -0
- package/dist/chunk-ETO6LGLD.js +4750 -0
- package/dist/chunk-EUUUMY7J.js +24 -0
- package/dist/chunk-FQJ2TTHP.js +218 -0
- package/dist/chunk-FQOF7E2E.js +133 -0
- package/dist/chunk-FWD7AL6N.js +21 -0
- package/dist/chunk-FXFV3KU6.js +138 -0
- package/dist/chunk-FXRQOWTE.js +171 -0
- package/dist/chunk-G554NZNI.js +210 -0
- package/dist/chunk-GSGDWJB5.js +13 -0
- package/dist/chunk-H2V3N23D.js +66 -0
- package/dist/chunk-H5C7MBCR.js +159 -0
- package/dist/chunk-HHN734BU.js +371 -0
- package/dist/chunk-HRVBLCVJ.js +243 -0
- package/dist/chunk-HVRUQXGD.js +1264 -0
- package/dist/chunk-I4F5TCJH.js +130 -0
- package/dist/chunk-IDOTCMDV.js +57 -0
- package/dist/chunk-IGOLHKWF.js +427 -0
- package/dist/chunk-JGE7CAWB.js +148 -0
- package/dist/chunk-JTUKLCXS.js +92 -0
- package/dist/chunk-JZGVVJSI.js +66 -0
- package/dist/chunk-K4WX6UUU.js +923 -0
- package/dist/chunk-K5BBGTYZ.js +217 -0
- package/dist/chunk-K6RXBGUB.js +427 -0
- package/dist/chunk-KTSDSD36.js +165 -0
- package/dist/chunk-L5JYN3NM.js +1038 -0
- package/dist/chunk-LIEOKXKD.js +354 -0
- package/dist/chunk-LLNZGEFK.js +51 -0
- package/dist/chunk-LPECSJ2J.js +55 -0
- package/dist/chunk-LQCMKAJ7.js +413 -0
- package/dist/chunk-LRN4ZJCQ.js +1145 -0
- package/dist/chunk-MJ4ZVHKN.js +17 -0
- package/dist/chunk-MXHSQOC4.js +3061 -0
- package/dist/chunk-N5GKCWE5.js +367 -0
- package/dist/chunk-NA3PXMEF.js +10 -0
- package/dist/chunk-NAQDMEHV.js +76 -0
- package/dist/chunk-NWKXM5RD.js +109 -0
- package/dist/chunk-NZOWWHU5.js +196 -0
- package/dist/chunk-OHX6MIUZ.js +184 -0
- package/dist/chunk-OOXWYAA4.js +15 -0
- package/dist/chunk-OPHB5ORL.js +1990 -0
- package/dist/chunk-OXA6PSZT.js +1725 -0
- package/dist/chunk-P2HAGF6H.js +73 -0
- package/dist/chunk-PTHVMXZI.js +3036 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q325JKYB.js +189 -0
- package/dist/chunk-Q7DGTQ5G.js +255 -0
- package/dist/chunk-QCNYHBL7.js +601 -0
- package/dist/chunk-QO6BVGS5.js +145 -0
- package/dist/chunk-QXTKSOFI.js +76 -0
- package/dist/chunk-ROY4YAEQ.js +66 -0
- package/dist/chunk-RTJRZFFY.js +447 -0
- package/dist/chunk-SAVJUS2X.js +128 -0
- package/dist/chunk-SFLHVCKX.js +173 -0
- package/dist/chunk-STSFNCY4.js +127 -0
- package/dist/chunk-SWBF2LTK.js +170 -0
- package/dist/chunk-T5KELPAR.js +109 -0
- package/dist/chunk-TFFGOFVZ.js +1481 -0
- package/dist/chunk-TLHIFK4M.js +256 -0
- package/dist/chunk-TLQE7ZN3.js +156 -0
- package/dist/chunk-TPHWJ7UG.js +1981 -0
- package/dist/chunk-TRJCALW3.js +291 -0
- package/dist/chunk-TTEIYD5P.js +133 -0
- package/dist/chunk-U64O2MXY.js +407 -0
- package/dist/chunk-UCQ2VUTG.js +630 -0
- package/dist/chunk-UTI5G6OJ.js +44 -0
- package/dist/chunk-UVHDMMIP.js +188 -0
- package/dist/chunk-UZ6QQWJT.js +120 -0
- package/dist/chunk-VAX3UZOY.js +686 -0
- package/dist/chunk-W3HBUKFO.js +57 -0
- package/dist/chunk-WKQLGKCL.js +2823 -0
- package/dist/chunk-WQFNASK4.js +560 -0
- package/dist/chunk-WRBKLYSJ.js +224 -0
- package/dist/chunk-WTPZRR4I.js +17 -0
- package/dist/chunk-WZDJ2LLX.js +2385 -0
- package/dist/chunk-X2NL4KUO.js +14 -0
- package/dist/chunk-X4DVXBFY.js +38 -0
- package/dist/chunk-X677DMZM.js +7050 -0
- package/dist/chunk-XBKMWY7F.js +612 -0
- package/dist/chunk-XNCP4KYO.js +78 -0
- package/dist/chunk-XVBGLISP.js +35 -0
- package/dist/chunk-XW6KISBB.js +1192 -0
- package/dist/chunk-YGZHHAAB.js +8156 -0
- package/dist/chunk-YHEFQUQB.js +186 -0
- package/dist/chunk-YLDALTWZ.js +653 -0
- package/dist/chunk-YU4HSQW7.js +229 -0
- package/dist/chunk-ZDPP6RKB.js +27 -0
- package/dist/chunk-ZFDZKNGG.js +194 -0
- package/dist/chunk-ZIY7RNUT.js +49 -0
- package/dist/chunk-ZYJP6BOO.js +30 -0
- package/dist/cli.d.ts +1111 -0
- package/dist/cli.js +165 -0
- package/dist/codegen-command-VR2GWR6C.js +173 -0
- package/dist/codegen.d.ts +115 -0
- package/dist/codegen.js +19 -0
- package/dist/commands-GJMJ4XYZ.js +76 -0
- package/dist/completion-ZQLO6PB6.js +738 -0
- package/dist/config-MBYGCAFK.js +136 -0
- package/dist/deploy-command-JVZPWHMK.js +180 -0
- package/dist/deploy-source-3W45CXMP.js +81 -0
- package/dist/dev-env-sync-HN44K4D5.js +188 -0
- package/dist/diagnostics-UEAAHWVF.js +30 -0
- package/dist/display-name-hint-ABBPVQIR.js +46 -0
- package/dist/emit-CyhBDxli.d.ts +7007 -0
- package/dist/env-example-refresh-ET5HMMDW.js +126 -0
- package/dist/env-pull-command-TNMNB3CV.js +323 -0
- package/dist/env-target-O4HRKTGZ.js +40 -0
- package/dist/env-var-command-ZIRDCAZA.js +427 -0
- package/dist/ephemeral-P7F3PMAD.js +54 -0
- package/dist/ephemeral-command-CLJJKOFT.js +592 -0
- package/dist/ephemeral-state-PYCBSOGX.js +61 -0
- package/dist/file-lock-PT74GWYW.js +10 -0
- package/dist/generate-command-AYEOLA26.js +510 -0
- package/dist/gitignore-3SJ3WNRG.js +51 -0
- package/dist/guards-4EBNCZDC.js +162 -0
- package/dist/hosted-file-PSHJB3HX.js +28 -0
- package/dist/impersonate-command-5JAS3WSV.js +152 -0
- package/dist/import-EQSFU6JC.js +19 -0
- package/dist/index.d.ts +5470 -0
- package/dist/index.js +371 -0
- package/dist/init-command-X2FR4UAK.js +125 -0
- package/dist/init-modules-RY7UHAOL.js +50 -0
- package/dist/init-web-M4YZSZK6.js +42 -0
- package/dist/internal.d.ts +179 -0
- package/dist/internal.js +2634 -0
- package/dist/io-RC56QSN5.js +26 -0
- package/dist/keep-data-merge-7MPLVAVI.js +1119 -0
- package/dist/lambda-config-reconcile-OUZ4OYAB.js +116 -0
- package/dist/landed-753YLJ5H.js +40 -0
- package/dist/landing-record-SU52SKXU.js +61 -0
- package/dist/live-diff-YONW2VI3.js +65 -0
- package/dist/local-engine-choice-CH5X3W7E.js +79 -0
- package/dist/local-engine-command-Z3OL7VOD.js +766 -0
- package/dist/local-engine-config-5U3SC434.js +39 -0
- package/dist/local-engine-deploy-PCQ4SNPB.js +39 -0
- package/dist/local-engine-process-EHTE5LLU.js +63 -0
- package/dist/local-engine-state-A4FTRFAF.js +32 -0
- package/dist/local-engine-update-check-6L645VBL.js +162 -0
- package/dist/lock-MRRHW5GS.js +87 -0
- package/dist/lock-commands-2QG25HL7.js +963 -0
- package/dist/login-command-QPYRWOXZ.js +538 -0
- package/dist/logout-command-WOIQLDP6.js +56 -0
- package/dist/loop-ALIZLOSX.js +191 -0
- package/dist/marketplace-command-K5YL42NO.js +977 -0
- package/dist/marketplace-resolve-LY32JES5.js +40 -0
- package/dist/meta-client-YXGPW53C.js +244 -0
- package/dist/module-manifest-JFGHU2TC.js +38 -0
- package/dist/near-key.d.ts +13 -0
- package/dist/near-key.js +8 -0
- package/dist/node.d.ts +95 -0
- package/dist/node.js +969 -0
- package/dist/operation-outcome-TZSESNC7.js +51 -0
- package/dist/output-target-AL3I44GG.js +47 -0
- package/dist/package-manager-PRAHUSCN.js +34 -0
- package/dist/plan-disclosure-6G4MLZKD.js +114 -0
- package/dist/plugin-contributions-WRNY5ABG.js +28 -0
- package/dist/plugin-prompt-4VA3B4FF.js +20 -0
- package/dist/plugin-questions-JTSYA74Q.js +24 -0
- package/dist/plugin.d.ts +396 -0
- package/dist/plugin.js +1 -0
- package/dist/preflight-command-2T5Z36MI.js +321 -0
- package/dist/profile-command-AH3PIM4X.js +800 -0
- package/dist/profile-pointer-GRWJU3YD.js +31 -0
- package/dist/profile-select-74TRDEPD.js +23 -0
- package/dist/project-dependency-KSH63ODT.js +35 -0
- package/dist/project-sdk-REPPOIBD.js +24 -0
- package/dist/promote-command-PCWT5N6S.js +140 -0
- package/dist/prompt-II3F3LND.js +27 -0
- package/dist/publish-command-TTDUUJI5.js +414 -0
- package/dist/pull-command-VBO7C4S3.js +161 -0
- package/dist/pull-superseded-GJWLG7XO.js +20 -0
- package/dist/release-command-N4ZPKMHR.js +146 -0
- package/dist/release-ns-command-3KFDMZ6G.js +1745 -0
- package/dist/response-HlXahv4K.d.ts +925 -0
- package/dist/retry-command-AS5EVREX.js +34 -0
- package/dist/routes-manifest-SNWUVBT6.js +43 -0
- package/dist/runtime-XETHVF33.js +14 -0
- package/dist/scaffold.d.ts +1911 -0
- package/dist/scaffold.js +107 -0
- package/dist/secrets-file-LVZD6IIM.js +56 -0
- package/dist/secrets-fill-command-TTCPSVXN.js +218 -0
- package/dist/seed-VU7C3QYS.js +46 -0
- package/dist/sent-writes-N7X4OVXT.js +22 -0
- package/dist/source-resolve-S2XA3XZF.js +83 -0
- package/dist/static-host-B2Y6AG3W.js +352 -0
- package/dist/status-command-RUDXTF7I.js +554 -0
- package/dist/store-6VNCD4D7.js +20 -0
- package/dist/store-ARM6VMO5.js +98 -0
- package/dist/store-DuYfzKlW.d.ts +3144 -0
- package/dist/suggest-6FOOYKHG.js +12 -0
- package/dist/sveltekit.d.ts +154 -0
- package/dist/sveltekit.js +109 -0
- package/dist/sync-contributions-UCEROO26.js +415 -0
- package/dist/table-ENAVMITR.js +42 -0
- package/dist/tables-command-GUPXXSB5.js +156 -0
- package/dist/tenant-IIHPOHGP.js +42 -0
- package/dist/tenant-command-D5HGI2X4.js +965 -0
- package/dist/test-command-TIKZMDPZ.js +476 -0
- package/dist/tests-BGGIOK3L.js +26 -0
- package/dist/token-NICJUTMT.js +72 -0
- package/dist/toolchain-hooks-GHKLUJOH.js +96 -0
- package/dist/toolchain-modules-5EAZUONB.js +24 -0
- package/dist/tracked-backend-EIBUMDZA.js +80 -0
- package/dist/update-check-2W2NLDTC.js +136 -0
- package/dist/upgrade-command-QHNFWM7O.js +531 -0
- package/dist/verify-rollout-DRCK5TDD.js +61 -0
- package/dist/whoami-command-STGINTXH.js +51 -0
- package/dist/workspace-2CLHU2LK.js +93 -0
- package/dist/workspace-binding-56PIIPCP.js +54 -0
- package/dist/workspace-command-JEXQETJD.js +535 -0
- package/dist/workspace-env-F2RFMSC5.js +70 -0
- package/dist/workspace-export-OJSH2HIW.js +21 -0
- package/dist/writable-VA7OISSK.js +25 -0
- package/dist/xano-ICFUSPFR.js +42 -0
- package/dist/xanosdk-import-GN42TO2B.js +56 -0
- package/dist/xanosdk-project-S6DXJONQ.js +41 -0
- package/dist/xdo-CxDr2Q1C.d.ts +1371 -0
- package/guides/README.md +33 -0
- package/guides/authoring.md +921 -0
- package/guides/cli.md +401 -0
- package/guides/codegen.md +177 -0
- package/guides/codes.md +404 -0
- package/guides/coverage.md +74 -0
- package/guides/deploying.md +1525 -0
- package/guides/environment.md +400 -0
- package/guides/marketplace.md +415 -0
- package/guides/module-contract.md +558 -0
- package/guides/object-kinds.md +433 -0
- package/guides/project-structure.md +43 -0
- package/guides/scaffold.md +351 -0
- package/guides/typed-frontend.md +242 -0
- package/llms/client.md +63 -0
- package/llms/errors.md +56 -0
- package/llms/fields.md +176 -0
- package/llms/filters.md +183 -0
- package/llms/kinds-agent-mcp.md +30 -0
- package/llms/kinds-core.md +100 -0
- package/llms/kinds-knowledge.md +20 -0
- package/llms/kinds-realtime.md +76 -0
- package/llms/lambda.md +94 -0
- package/llms/legacy.md +44 -0
- package/llms/lock.md +40 -0
- package/llms/object-kinds.md +34 -0
- package/llms/statements-calls.md +62 -0
- package/llms/statements-catalog.md +320 -0
- package/llms/statements-data.md +66 -0
- package/llms/statements-runtime.md +68 -0
- package/llms/tests.md +59 -0
- package/llms/toolchain.md +16 -0
- package/llms/triggers.md +36 -0
- package/llms/values.md +29 -0
- package/llms-full.txt +2085 -0
- package/llms.txt +493 -0
- package/manifest.json +11224 -0
- package/package.json +162 -0
- package/types/lambda-globals.d.ts +129 -0
package/guides/codes.md
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
# Warning and error codes
|
|
2
|
+
|
|
3
|
+
<!-- Generated by `npm run codes` from the codes the source emits. Do not edit by hand. -->
|
|
4
|
+
|
|
5
|
+
Every code the CLI and the build emit, with the first sentence of the message it comes with.
|
|
6
|
+
Match on the code, never on the message text: messages are reworded, codes are not.
|
|
7
|
+
|
|
8
|
+
## Error codes
|
|
9
|
+
|
|
10
|
+
`error.code` of a failure document (`--json`, or any piped run): `{ ok: false, error: { code, message, exitCode, details? } }`.
|
|
11
|
+
|
|
12
|
+
| Code | Meaning |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `SDK_BRANCH_LIVE` | The branch is the live one and cannot be deleted or replaced that way. Exit 2. |
|
|
15
|
+
| `SDK_BRANCH_TAKEN` | The branch label is already in use. Exit 2. |
|
|
16
|
+
| `SDK_CONSTRAINT_VIOLATION` | The workspace's rows break a unique index, required column or reference the release declares; nothing landed (`details.constraint`). Exit 2. |
|
|
17
|
+
| `SDK_CREDENTIAL_REJECTED` | The instance rejected the credential (`details`: `{ profile, credentialType, instance, workspaceId, signIn }`). |
|
|
18
|
+
| `SDK_DRIFT` | A committed artifact (`xano.lock`, `.env.example`, `routes.gen.ts`) is out of date with the source — `--check`, `--strict`, `--frozen-lock`. |
|
|
19
|
+
| `SDK_ERROR` | Any failure without a code of its own; `exitCode` says which kind. |
|
|
20
|
+
| `SDK_EXPORT_INVALID` | The workspace does not build: `details.diagnostics[]` lists every error (and, under `--strict`, every warning). |
|
|
21
|
+
| `SDK_IDENTITY_CONFLICT` | A landing would delete or re-create an object under another identity; nothing was written (`details.refused`). Exit 2. |
|
|
22
|
+
| `SDK_IMPORT_REFUSED` | The target refused the import (`details.refused` names the check); exit 8 when another import was running. |
|
|
23
|
+
| `SDK_KIND_CONFLICT` | A name the target holds as another kind of object; nothing was written. Exit 2. |
|
|
24
|
+
| `SDK_LIVE_BRANCH_MISMATCH` | The live branch is not the one the command expected (`details.conflictsWith`). |
|
|
25
|
+
| `SDK_PRUNE_OUT_OF_SCOPE` | A landing would delete objects another source landed (`details.refused: "pruneOutOfScope"`). Exit 2. |
|
|
26
|
+
| `SDK_RELEASE_FILES_NOT_CARRIED` | The release cannot carry the files (hosted files, static assets) the source needs. |
|
|
27
|
+
| `SDK_RELEASE_NAME_TAKEN` | A release with that name already exists. Exit 2. |
|
|
28
|
+
| `SDK_SEED_IN_STATIC` | A static build carries seed values from non-public columns (`details.leaks[]`); nothing was published. |
|
|
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
|
+
| `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
|
+
|
|
32
|
+
## CLI warnings
|
|
33
|
+
|
|
34
|
+
Printed as `! …` on stderr, and as `{ code, message }` in a `--json` document's `warnings[]`.
|
|
35
|
+
|
|
36
|
+
| Code | Meaning |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `agents.refresh-failed` | A managed agent file (AGENTS.md, …) could not be refreshed; the compile itself went on. |
|
|
39
|
+
| `agents.symlink` | … is a symlink — left it and its target untouched. |
|
|
40
|
+
| `branch.deletion` | … will be permanently deleted and CANNOT be recovered: |
|
|
41
|
+
| `branch.inventory-unknown` | The branch inventory could not be read, so what this wipe destroys is UNKNOWN. |
|
|
42
|
+
| `branch.live-unverified` | Could not verify whether a branch is live after the replace. |
|
|
43
|
+
| `branch.none-live` | No branch is live in workspace #… — "…" becomes the branch the runtime serves. |
|
|
44
|
+
| `branch.not-found` | No branch named "…" on … — nothing was deleted. |
|
|
45
|
+
| `branch.production-cutover` | This is a production cutover for workspace #…. |
|
|
46
|
+
| `branch.settings-withheld` | … workspace setting… will NOT be applied from branch "…": … |
|
|
47
|
+
| `branch.shared-schema-changed` | … shared-schema change… applied to the LIVE workspace. |
|
|
48
|
+
| `branch.shared-schema-unknown` | The live workspace could not be read, so whether this changed shared schema is UNKNOWN. |
|
|
49
|
+
| `branch.stale-schema-refs` | "…"'s logic writes … the shared tables no longer have — once it is live, … nothing there: |
|
|
50
|
+
| `branch.unlabeled` | … branch… here carr… no label: |
|
|
51
|
+
| `canonical.differs` | … public URL… the value this project compiled: |
|
|
52
|
+
| `canonical.invented` | … public URL… will be invented by the instance, and this project will not know …: |
|
|
53
|
+
| `credential.env-outranks` | … set in this environment, outranking this credential — commands will keep using …. |
|
|
54
|
+
| `credential.env-overrides-pin` | Using the … credential from the environment — ignoring …, which pins this project to profile "…". |
|
|
55
|
+
| `credential.readable-file` | … can be read by other users of this machine, and it holds your Xano credentials. |
|
|
56
|
+
| `credential.shadowed-global` | Using project-local …, … (…, workspace …), but a global credential for …, workspace … also exists under the same profile name — the local one wins. |
|
|
57
|
+
| `credential.unpinned-profile` | The project has no `xano.profile.json` and several profiles are stored, so the run used the default one; `profile use` pins it. |
|
|
58
|
+
| `decode.findings` | Not everything round-tripped cleanly — … (listed below). |
|
|
59
|
+
| `deploy.destructive` | The landing deletes objects or data on the target; each operation is listed, with the rows a pruned table loses. |
|
|
60
|
+
| `deploy.dry-run-refusal` | A real run would refuse: … |
|
|
61
|
+
| `deploy.env-written` | Environment variables from the bundle … written. |
|
|
62
|
+
| `deploy.ephemeral-write` | Says which ephemeral this deploy writes to. |
|
|
63
|
+
| `deploy.import-failed-backup` | The import failed. Your pre-deploy snapshot is on branch "…". |
|
|
64
|
+
| `deploy.open-no-url` | --open had no URL to open — the deploy reported none. |
|
|
65
|
+
| `deploy.replace-wipe` | `--replace` wipes … before importing — including table data and history. |
|
|
66
|
+
| `deploy.rows-written` | Table rows from the bundle … written. |
|
|
67
|
+
| `deploy.tenant-write` | This deploy writes to a target that is not an ephemeral, named in the message. |
|
|
68
|
+
| `deploy.tests-not-run` | The deploy stands, but its tests could not be run: |
|
|
69
|
+
| `dev-env.sync-failed` | The frontend's dev env file could not be pointed at the deployed backend; the deploy itself landed. |
|
|
70
|
+
| `doc-token.cleared` | Documentation tokens: the named scopes are sent EMPTY on purpose, clearing that doc site's gate. |
|
|
71
|
+
| `doc-token.not-written` | Documentation tokens: … found and NOT written (--no-secrets). |
|
|
72
|
+
| `doc-token.orphan` | Documentation tokens: `…` holds … entr… no scope in this source claims — …. |
|
|
73
|
+
| `env-pull.declared-missing` | … holds no value for …, which this project declares — so … has none for … either, and a deploy has nothing to send. |
|
|
74
|
+
| `env-pull.dropped-keys` | Dropped … key… that … only in the local …: …. |
|
|
75
|
+
| `env-pull.invalid-name` | … could not be written: … — a name is letters, digits and `_`, and does not start with a digit. |
|
|
76
|
+
| `env-pull.unwritable-value` | … could not be written: the dotenv format carries no newlines or edge whitespace in a value. |
|
|
77
|
+
| `ephemeral.duplicate-name` | … also named "…" (…) — this deploy created … beside …. |
|
|
78
|
+
| `ephemeral.entry-changed` | … was last deployed from …; …. |
|
|
79
|
+
| `ephemeral.expires-not-applied` | --expires-hours … was not applied: … already exists, and an ephemeral's lifetime is set only when it is created (this one expires …). |
|
|
80
|
+
| `ephemeral.not-found` | No ephemeral named "…" — nothing was deleted.… |
|
|
81
|
+
| `ephemeral.rename-failed` | The deploy landed, but renaming … to "…" failed: …. |
|
|
82
|
+
| `export.env-example-cli-skew` | This CLI is another version than the project's installed SDK, so it left `.env.example` for the installed CLI to render. |
|
|
83
|
+
| `export.hosted-files-omitted` | Exported bundle names hostedFile() icons whose files it does not carry: …. |
|
|
84
|
+
| `filter.unresolvable` | Filter "…" (in …) is not engine-resolvable and will 500 at runtime… |
|
|
85
|
+
| `generate.replace` | A regeneration would replace or delete files edited since the last one; each is listed before anything is touched. |
|
|
86
|
+
| `gitignore.added-export` | Added … to … — … holds secrets. |
|
|
87
|
+
| `gitignore.credential-tracked` | … is tracked by git, so its ignore rule cannot keep the token just written out of the next commit. |
|
|
88
|
+
| `gitignore.update-failed` | Could not update.gitignore (…). |
|
|
89
|
+
| `init.install-failed` | The new project's dependency install (with its package manager) did not complete; the files are written, and running that install in the project is the whole repair. |
|
|
90
|
+
| `init.lock-derive-failed` | xano/index.ts does not load yet, so … and … were not written: … |
|
|
91
|
+
| `init.module-config-dropped` | A module's configuration could not be serialized and was left out of package.json. |
|
|
92
|
+
| `init.overwrite` | … project file… outside …/ will be overwritten (--force): |
|
|
93
|
+
| `init.roundtrip-skipped` | Skipped the round-trip check (--skip-roundtrip) — the tree is unchecked. |
|
|
94
|
+
| `init.sdk-skew` | The tree resolved a different @xano/sdk than the CLI that generated it — the likely cause of round-trip mismatches. |
|
|
95
|
+
| `init.strict-warnings` | …/ carries … export warning… (printed above) that `npm run xano:check` fails on — it exports with `--strict`. |
|
|
96
|
+
| `init.unverified` | The pulled tree was not round-trip checked (its dependencies are not installed); the remedy names the check to run. |
|
|
97
|
+
| `init.verify-failed` | Verification FAILED — the objects listed above do not re-export as they were pulled. |
|
|
98
|
+
| `init.workflow-exists` | … already exists — moving the new workflow there replaces it. |
|
|
99
|
+
| `landing.record-failed` | The prune landed, but … could not be updated: … |
|
|
100
|
+
| `local-engine.foreign` | Left running, not started by xanosdk: … |
|
|
101
|
+
| `local-engine.import-failed` | The import failed — the engine is still running, so nothing needs restarting: |
|
|
102
|
+
| `local-engine.list-failed` | Could not list running engines, so none are shown: … |
|
|
103
|
+
| `local-engine.not-pinned` | No package.json in …, and it is not a Xano SDK project, so the local engine was not pinned — this deploy runs the latest engine. |
|
|
104
|
+
| `local-engine.pin-unusable` | The project's pinned engine version could not be read and was not used. |
|
|
105
|
+
| `local-engine.runtime-kept` | Kept the unpacked runtime (…): … still running on it. |
|
|
106
|
+
| `local-engine.stale` | … is running …, but the engine cached here is …. |
|
|
107
|
+
| `local-engine.stop-failed` | … was listed as running but did not stop…. |
|
|
108
|
+
| `local-engine.version-invalid` | … This deploy runs the latest local engine and the field is left as written — set it to a version like "v0.1.5", or run `xanosdk local-engine update` to pin… |
|
|
109
|
+
| `lock.ceded-canonical` | A lock entry kept its guid but ceded its canonical to a live object; a rename moves the entry so the object keeps its URL. |
|
|
110
|
+
| `lock.created-in-ci` | This lock was created in CI, which means the repository does not have one. |
|
|
111
|
+
| `lock.dropped-entry` | A stale lock entry was dropped because its identity reappeared under a live name (a reverted or identity-keeping rename). |
|
|
112
|
+
| `lock.duplicate-identity` | xano.lock holds two entries with one identity. |
|
|
113
|
+
| `lock.identity-only` | --identity-only — nothing was evaluated, so nothing confirms … orphaned. |
|
|
114
|
+
| `lock.import-code-pinned` | … was not adopted: its def pins `guid: "…"` in code, which wins over xano.lock, so the live guid … would be replaced again at the next export. |
|
|
115
|
+
| `lock.module-orphans` | …/xano.lock still pins … the workspace no longer exports (the removed module's objects). |
|
|
116
|
+
| `lock.no-canonicals` | No canonicals found in … — a configuration-only export strips them, so only guids were adopted. |
|
|
117
|
+
| `lock.not-found` | writeBundle found no xano.lock and built unlocked: guids derived from names, so a rename recreates. Pass `lock:`. |
|
|
118
|
+
| `lock.orphan` | xano.lock entry "…" matched nothing this export (no workspace canonical emitted). |
|
|
119
|
+
| `lock.orphan-adopted` | xano.lock entries `lock import` adopted match no exported object — objects still serving that this project has not ported; a bare `lock prune` keeps them. |
|
|
120
|
+
| `lock.prune-adopted` | … adopted by `lock import`. |
|
|
121
|
+
| `lock.prune-adopted-kept` | Kept … `lock import` adopted that this code does not declare: …. |
|
|
122
|
+
| `lock.prune-near-miss` | "…" is not in …. |
|
|
123
|
+
| `lock.rename-unchecked` | Could not evaluate … to check this rename, so nothing confirms "…" was renamed in code. |
|
|
124
|
+
| `lock.repinned-table` | A table's def pins a new guid; xano.lock keeps the old one as `replaced`, so a keep-data deploy into an environment still holding it refuses rather than dropping its rows. |
|
|
125
|
+
| `lock.repointed` | None of xano.lock's entries appear in …, so this tree now points at a different backend. |
|
|
126
|
+
| `lock.root-shadowed` | A xano.lock also sits at the project root, but `xanosdk export` reads … (beside …), so …. |
|
|
127
|
+
| `lock.write-failed` | Could not record the source's identities in xano.lock (…). |
|
|
128
|
+
| `login.client-reregistered` | The registered client was rejected — re-registering and retrying once. |
|
|
129
|
+
| `login.no-refresh-token` | No refresh token was issued (offline_access not granted); push will require re-login once the access token expires. |
|
|
130
|
+
| `login.paste-failed` | The pasted sign-in code or URL could not be read; the link is still valid, so paste again. |
|
|
131
|
+
| `logout.env-still-set` | … — commands keep authenticating with …. |
|
|
132
|
+
| `logout.pin-signed-out` | … still pins this project to "…", which is signed out now. |
|
|
133
|
+
| `logout.revoke-failed` | Did not revoke …: … The token was not sent. |
|
|
134
|
+
| `logout.shared-file` | Clearing … in the shared credential file … — this affects every project that reuses it. |
|
|
135
|
+
| `logout.unreadable` | Could not read … (…). |
|
|
136
|
+
| `microservice.failed` | Some microservices failed to start: |
|
|
137
|
+
| `microservice.starting` | Microservices are still starting (…/… ready) — they should come up shortly: |
|
|
138
|
+
| `microservice.status-unreadable` | Could not read microservice status (the backend deployed fine): |
|
|
139
|
+
| `module.describe-failed` | … could not describe what it contributes and was skipped. |
|
|
140
|
+
| `module.disabled` | … is switched off in this project (`"enabled": false`). |
|
|
141
|
+
| `module.gitattributes-conflict` | .gitattributes already carries … contributes, outside any managed block. |
|
|
142
|
+
| `module.install-failed` | … failed — the module was not added. |
|
|
143
|
+
| `module.kind-unknown` | … does not declare a module kind we recognize, so it is read as an ordinary package. |
|
|
144
|
+
| `module.legacy-peer-deps` | Installed with --legacy-peer-deps: …. |
|
|
145
|
+
| `module.load-failed` | Could not load …/index.ts to update what the module left behind (…). |
|
|
146
|
+
| `module.peer-unresolved` | … declares a peer range this project does not satisfy; --legacy-peer-deps did not resolve it either. |
|
|
147
|
+
| `module.removed-from-marketplace` | … has been removed from the marketplace. |
|
|
148
|
+
| `module.sdk-skew` | … requires `@xano/sdk` … — the module was not added. |
|
|
149
|
+
| `module.setting-dropped` | …: `…` is no longer asked, so its stored setting was dropped. |
|
|
150
|
+
| `module.settings-unreadable` | … could not read its stored settings back; its defaults were used instead. |
|
|
151
|
+
| `module.stale-settings` | … is no longer a dependency, but this project still records settings for it. |
|
|
152
|
+
| `module.unconfigured` | … was left unconfigured, so it runs on its own defaults. |
|
|
153
|
+
| `module.uninstall-failed` | … could not be removed again — it is still in this project's dependencies. |
|
|
154
|
+
| `module.unregistered` | … is installed but not registered — …. |
|
|
155
|
+
| `operation.outcome-unknown` | Outcome unknown — check with `…` before retrying. |
|
|
156
|
+
| `plan.canonical-change` | The merge … move … — the project pins another `canonical`, and every endpoint under the old slug stops answering: |
|
|
157
|
+
| `plan.column-drop` | The landing drops columns the target has, and their values with them. |
|
|
158
|
+
| `plan.column-retype` | A kept column changes type; stored values stay, and one that does not read as the new type reads null. |
|
|
159
|
+
| `plan.doc-not-updated` | The workspace … NOT be updated — a merge does not write the workspace's `documentation` block. |
|
|
160
|
+
| `plan.enum-values-removed` | An enum column loses values; a row holding a removed value reads null until it is restored. |
|
|
161
|
+
| `plan.env-drop` | … environment variable… will be DROPPED: … |
|
|
162
|
+
| `plan.env-kept` | … live value — the project's differs, and a merge does not update values: …. |
|
|
163
|
+
| `plan.index-change` | The landing adds or drops indexes; a unique index is refused over duplicate rows. |
|
|
164
|
+
| `plan.not-null-kept` | A column becomes nullable, but the merge keeps NOT NULL on the table. |
|
|
165
|
+
| `plan.not-null-tightened` | A column stops being nullable; rows holding null read back as the type's empty value. |
|
|
166
|
+
| `plan.nothing-matched` | NOTHING MATCHED. … be created and … already in this … deleted — not one of them shares an identity with this project. |
|
|
167
|
+
| `plan.object-remove` | The replace DELETES … — a replace clears everything … holds: |
|
|
168
|
+
| `plan.object-remove-unlisted` | Could not read … to list what the replace clears that this project did not land; `--yes` deletes it unlisted. |
|
|
169
|
+
| `plan.realtime-history-detached` | The merge … detach realtime history: sockets on the old … stop connecting, and the `conversation` transcript and the `at_least_once` replay stay under the ol… |
|
|
170
|
+
| `plan.schema-additive` | The new tables and columns the landing adds. |
|
|
171
|
+
| `plan.seed-not-written` | … seed rows a merge does not write — …. |
|
|
172
|
+
| `plan.server-note` | A note the instance attached to the landing plan, passed on as it came. |
|
|
173
|
+
| `plan.table-drop` | The merge … DROP … the project no longer declares, …: |
|
|
174
|
+
| `plan.table-rename` | The landing renames tables matched by identity, keeping their rows. |
|
|
175
|
+
| `plan.tableref-retarget` | A table reference points at another table; the ids the rows hold now name that table's rows. |
|
|
176
|
+
| `plan.target-unreadable` | Could not read the target …, so this plan does not account for dropped columns or env that will not update. |
|
|
177
|
+
| `plan.workspace-rename` | This workspace will be RENAMED: "…" → "…" |
|
|
178
|
+
| `preflight.check-unavailable` | A toolchain module's check could not run: the engine comparison was unavailable. |
|
|
179
|
+
| `preflight.import-rejected` | Import rejected by the engine: |
|
|
180
|
+
| `preflight.nothing-captured` | nothing to capture (no objects round-tripped) |
|
|
181
|
+
| `preflight.roundtrip` | round-trip ? … — not found in the imported workspace |
|
|
182
|
+
| `preflight.runtime` | A preflight request ran and the engine threw; the status alone would read as a pass. |
|
|
183
|
+
| `preflight.teardown-failed` | Could not delete the validation environment; it will expire on its own: |
|
|
184
|
+
| `profile.local-shadows-pin` | This project pins profile "…" (…), which is in … but not in …. |
|
|
185
|
+
| `profile.missing` | … is selected here but not stored in …, so no profile is active — commands here fail until it is added or another is selected. |
|
|
186
|
+
| `profile.not-found` | No credential profile "…" in … — nothing to delete. |
|
|
187
|
+
| `profile.orphan-ephemeral` | The environment "…" was deployed under "…", and no stored profile reaches it now. |
|
|
188
|
+
| `profile.pin-deleted` | … still pins this project to "…", which no longer exists. |
|
|
189
|
+
| `profile.pin-missing` | … pins profile "…", which this machine does not have — commands here will fail until you run …, or re-pin with `…xanosdk profile use <name>`. |
|
|
190
|
+
| `profile.project-pin-wins` | This project pins its own profile in …, which still wins here. |
|
|
191
|
+
| `promote.canonical-not-served` | Public URL slug… pinned in code … served under another value — every route a frontend builds from … answers 404 there: |
|
|
192
|
+
| `promote.canonical-substituted` | Public URL slug… the release declares … served under another value (not pinned in code, so the instance chose): |
|
|
193
|
+
| `promote.identities-unchecked` | Whether this release's names and pinned public URL slugs are free in your workspace was not checked — …. |
|
|
194
|
+
| `promote.missing-objects` | … declared object… did not arrive: |
|
|
195
|
+
| `promote.no-landing-record` | No landing will be recorded: this directory is no project, so no xano.lock records what lands (a later `--prune` deletes only what a lock records). |
|
|
196
|
+
| `promote.seed-rows` | "…" carries rows for … table… (…), and they are not written: a promote lands logic on a branch, and tables are shared by every branch. |
|
|
197
|
+
| `promote.server-release` | `promote` lands a release the server holds, so the local pre-flight did not run; what it checked instead is listed. |
|
|
198
|
+
| `promote.suffixed-rename` | … look… like a suffixed rename of a declared name — check it is the object you meant. |
|
|
199
|
+
| `promote.unverified` | Contents NOT verified — the release landed, but verification could not run (…) — check what landed with `xanosdk workspace export --branch … --path -…` |
|
|
200
|
+
| `publish.unbuilt-source` | The directory being published looks like frontend source, not a build output. |
|
|
201
|
+
| `pull.env-check-failed` | Could not check …/… for missing values (…). |
|
|
202
|
+
| `pull.kept-duplicates` | … kept file… objects the decoded tree declares too. |
|
|
203
|
+
| `pull.kept-files` | Kept … file… in …/ no decode wrote — … yours, and not part of the decoded tree: |
|
|
204
|
+
| `pull.lock-dropped` | …/xano.lock entr… no counterpart in … and will be dropped: |
|
|
205
|
+
| `pull.lock-repinned` | …/xano.lock entr… will be re-pinned to the object … holds under the same name: |
|
|
206
|
+
| `pull.module-replaced` | … registers … (`…`), and the decoded entry registers plain copies of the objects it contributed instead — a later … upgrade no longer reaches them. |
|
|
207
|
+
| `pull.no-git` | Not a git repository — nothing here holds the version of …/ about to be replaced. |
|
|
208
|
+
| `pull.replace` | A pull replaces files under `xano/` (edited since the last pull, or no longer generated); each is listed. |
|
|
209
|
+
| `pull.seeds-dropped` | … table… seeded in code, and the pulled tree drops … `seed:`: |
|
|
210
|
+
| `pull.settings-lost` | … carries no workspace settings, so the workspaceConfig in …/… is rewritten without its …. |
|
|
211
|
+
| `pull.tsx-needed` | …/ is now … TypeScript files, and an entry that imports its own modules loads only under tsx, which this project does not have — the next deploy fails until… |
|
|
212
|
+
| `pull.unverified` | Could not check that …/ round-trips — loading its TypeScript entry needs `tsx`, which is not installed. |
|
|
213
|
+
| `release.already-gone` | Release "…" was already gone. |
|
|
214
|
+
| `release.contents-missing` | Its stored contents are missing — cut it again from a live environment. |
|
|
215
|
+
| `release.copy-unrecorded` | Transferred, but recording on "…" which release it was copied from failed (…). |
|
|
216
|
+
| `release.delete-in-use` | Release "…" is in use: …. |
|
|
217
|
+
| `release.drift` | … does not match … (… object… differing, missing or extra). |
|
|
218
|
+
| `release.env-created` | … env var… in "…" … NOT set on … and will be CREATED carrying the value the release was cut with: …. |
|
|
219
|
+
| `release.env-unset` | Release "…" reads … env var… doesn't set: …. |
|
|
220
|
+
| `release.name-stored` | The destination stored it as "…": "…" was taken by the time it landed. |
|
|
221
|
+
| `release.no-env` | The release carries no env vars (or no documentation settings), so what it lands on comes up with them unset. |
|
|
222
|
+
| `release.not-found` | No release named "…" on … — nothing was deleted. |
|
|
223
|
+
| `release.rows-transferred` | This release carries table rows, and they go to the destination with it: |
|
|
224
|
+
| `release.seed-rows-not-decoded` | … carries seed rows for …, and a decoded tree carries no rows — they are not in …/. |
|
|
225
|
+
| `release.transfer-cancelled` | Transfer cancelled — nothing was imported. |
|
|
226
|
+
| `routes.cli-skew` | This CLI is another version than the project's installed SDK, so it left the route table for the installed CLI to render. |
|
|
227
|
+
| `routes.not-written` | The route table (`routes.gen.ts`) was not written this run; the line says why and what writes it. |
|
|
228
|
+
| `routes.realtime-unresolved` | …: leaving out … — … — whose canonical URL token resolves nowhere, along with their channels. |
|
|
229
|
+
| `secrets.cleartext-export` | … carries … in cleartext — written owner-only (0600); do not commit it. |
|
|
230
|
+
| `secrets.cleartext-stdout` | The export carries … in cleartext — written to stdout, where no file permission protects it; do not commit or log it. |
|
|
231
|
+
| `secrets.doc-token-written` | Documentation tokens: wrote … to `…` — …. |
|
|
232
|
+
| `secrets.env-written` | Workspace env: wrote … from the bundle to `…`. |
|
|
233
|
+
| `secrets.local-only` | `…` is SECRET MATERIAL and is gitignored, so a teammate's clone and CI both need `--secrets-file` or `--doc-token` instead. |
|
|
234
|
+
| `secrets.not-ignored` | … holds secrets and git was not ignoring it. |
|
|
235
|
+
| `secrets.tracked-by-git` | … holds secrets and is tracked by git — an ignore rule cannot untrack it. |
|
|
236
|
+
| `secrets.vault-in-bundle` | … contains … private stored …. |
|
|
237
|
+
| `seed.guarded-columns` | Could not read which columns are sensitive in … — the source's export does not carry …, so only `internal` and password columns were checked: … |
|
|
238
|
+
| `seed.none-declared` | `--seed` was passed, but no table in this project declares seed rows — no rows will be written. |
|
|
239
|
+
| `seed.password-hashes` | Seed rows land password columns as given — they must already be hashes. |
|
|
240
|
+
| `static-env.not-injected` | The deploy's frontend config was not injected into some static routes (no HTML document or `<head>`); they run with it unset. |
|
|
241
|
+
| `static-env.secret-like` | A `--static-env` value looks like a secret, and every one is published in the static site's config. |
|
|
242
|
+
| `static-env.unscannable-seed` | … non-public seed column… the static scan cannot search for — too short to match on, or not text at all — so they were NOT checked. |
|
|
243
|
+
| `static.hidden-unserved` | The build has files under a dot segment (`.well-known/`, …), which the static host never serves; those paths answer with the fallback page. |
|
|
244
|
+
| `static.link-skipped` | A symlink in the build points outside it, or to nothing, so it was not uploaded. |
|
|
245
|
+
| `static.republish` | The import failed — republishing the frontend so the static host keeps serving. |
|
|
246
|
+
| `static.routing-inferred-multipage` | Routing was inferred as multipage only because the build ships … beside index.html — the shape of a single-page app with its own … page. |
|
|
247
|
+
| `static.teardown` | This replace takes the frontend… at … down — a replace clears …'s static hosting, and this one publishes none. |
|
|
248
|
+
| `static.teardown-unknown` | Could not read …'s static hosting, so this cannot say whether a frontend serves there — this replace takes down any that does. |
|
|
249
|
+
| `static.unconfirmed-live` | Could not confirm the frontend is live within the wait window — the build uploaded and should come online shortly. |
|
|
250
|
+
| `static.upload-failed` | The static-host upload failed — the backend deploy stands: |
|
|
251
|
+
| `tenant.deploy-partial` | The deploy stopped partway: … release "…" declares… — answered as a NOT NULL violation, though the release makes no field required: the value converts to nul… |
|
|
252
|
+
| `tenant.deploy-unconfirmed` | Compare its `deployedAt` and `deployedReleaseId` with what they were before this deploy (deployedAt …, deployedReleaseId …). |
|
|
253
|
+
| `tenant.identities-unchecked` | Whether this release's names and pinned public URL slugs are free on … was not checked — …. |
|
|
254
|
+
| `tenant.not-found` | No tenant or ephemeral named "…" — nothing was deleted…. |
|
|
255
|
+
| `tenant.seed-replaces-rows` | "…" was cut with rows, and a tenant deploy REPLACES … rows on … with the release's — every row there now is deleted: |
|
|
256
|
+
| `tenant.server-release` | `tenant deploy` lands a release the server holds, so the local pre-flight did not run; what it checked instead is listed. |
|
|
257
|
+
| `test.list-truncated` | Stopped after … tests — the list did not terminate, so some may not have run. |
|
|
258
|
+
| `toolchain.failed` | A toolchain plugin's hook failed and was skipped; its check did not run. |
|
|
259
|
+
| `toolchain.load-failed` | … could not be loaded and … skipped. |
|
|
260
|
+
| `update.available` | A new @xano/sdk is available: … → … |
|
|
261
|
+
| `upgrade.partial` | Could not restore the … range in package.json: … |
|
|
262
|
+
| `workspace-env.compared-empty` | Workspace env: … compared as EMPTY (--allow-empty-env). |
|
|
263
|
+
| `workspace-env.missing-values` | … declared env var… no value in …: …. |
|
|
264
|
+
| `workspace-env.not-written` | Workspace env: the bundle carries … (…) — NOT written (--no-secrets). |
|
|
265
|
+
| `workspace-env.undeclared` | A workspace env var is supplied but not declared in `workspaceConfig({ env })`; the deploy would add it. |
|
|
266
|
+
| `workspace-env.unsupplied` | A declared workspace env var has no value from any source this run reads. |
|
|
267
|
+
| `workspace-env.valueless` | … env var… declared with no value in the bundle (…) — see …/.env.example. |
|
|
268
|
+
| `workspace.drift` | … does not match this project’s compile (… compared, … differing, … missing, … unexpected). |
|
|
269
|
+
| `workspace.unreachable` | The credential is pinned to a workspace id its own workspace list does not hold; the ids it can reach are listed. |
|
|
270
|
+
|
|
271
|
+
## Build diagnostics
|
|
272
|
+
|
|
273
|
+
Raised while a workspace compiles (`export`, `deploy`, `release`, …). A warning fails `--strict`; a def accepts one with `diagnostics: { allow: ["<code>"] }`.
|
|
274
|
+
|
|
275
|
+
| Code | Meaning |
|
|
276
|
+
|---|---|
|
|
277
|
+
| `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. |
|
|
278
|
+
| `agent.literal-api-key` | agent "…" spells its `llm.apiKey` literally. |
|
|
279
|
+
| `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. |
|
|
280
|
+
| `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… |
|
|
281
|
+
| `api-group.cors-origin-unmatchable` | A stored CORS origin no browser `Origin` can equal (path, trailing slash, no scheme, uppercase, wildcard), kept on a pulled group. |
|
|
282
|
+
| `api-group.cors-wildcard-origin` | apiGroup "…": `allowOrigins` contains `"*"`, which is compared as a LITERAL origin under `mode: "custom"` — no browser sends `Origin: *`, so it matches nothi… |
|
|
283
|
+
| `api-group.docs-gate-unresolved` | … API group… declare… a documentation gate (`require_token: true`), but no token was supplied for it — …. |
|
|
284
|
+
| `api-group.docs-public` | after this deploy, … API group… documentation will be PUBLICLY READABLE — …. |
|
|
285
|
+
| `bundle.function-value` | A def holds a JavaScript function where a JSON value belongs; nothing can serialize it. |
|
|
286
|
+
| `bundle.non-json-value` | A def holds a value JSON cannot carry (`undefined`, a class instance, a `Date`, `NaN`, …). |
|
|
287
|
+
| `cache.ttl-not-positive` | … "…": `cache.ttl` is … — the engine stores a response only for a ttl of 1 or more whole seconds, so this cache never holds anything while every call still l… |
|
|
288
|
+
| `condition.mixed` | … "…": a condition mixes AND and OR at one level (`mixed(...)`). |
|
|
289
|
+
| `db.addon-duplicate-alias` | …: two attached addons graft as "…" — the later overwrites the earlier on every row. |
|
|
290
|
+
| `db.addon-unknown-column` | …: the attached … binds `out("…")`, but the rows it reads have no `…` column — the binding is null on every row, so the addon grafts nothing. |
|
|
291
|
+
| `db.addon-unknown-input` | …: the attached … is passed `…`, which that addon does not declare — the engine drops it, so the addon runs with its input unset and grafts nothing. |
|
|
292
|
+
| `db.bulk-update-partial-item` | …: `s.db.bulk.update` on table "…" is a full-row REPLACE, and these items omit … — each omitted column is written to its zero value ("" / 0 / null), not left… |
|
|
293
|
+
| `db.filter-operand-invalid` | …: a `where` clause fails every request that reaches it, whatever the data — …. |
|
|
294
|
+
| `db.internal-column-read` | …: reads `ref("…")`, but "…" on table "…" is `access: "internal"` and a `db.get` does not return it — the row has no "…" key, so this fails at runtime with `… |
|
|
295
|
+
| `db.null-match-arg` | …: `c.null()` is the … of `…`. |
|
|
296
|
+
| `db.output-unknown-column` | …: `output` selects "…", but the row has no "…" — the key is absent from the result. |
|
|
297
|
+
| `db.query-envelope-read-unpaged` | … "…": `ref("…")` reads the paging envelope, but `s.db.query` "…" is not paged with one, so it binds the row list and `…` is no key of it. |
|
|
298
|
+
| `db.query-output-joined-column` | …: `output` selects "…", a JOINED column — a join adds no key to the row, so it is dropped from the result with no error. |
|
|
299
|
+
| `db.query-output-mixed-roots` | …: `s.db.query` is PAGED, so `output` selects from the envelope (…) — but …, which no envelope key matches, so … dropped from the result. |
|
|
300
|
+
| `db.query-output-not-envelope-rooted` | …: `s.db.query` is PAGED with an envelope (`metadata: true`, the default), so `output` selects from that envelope — but this selection is rooted at the row (…). |
|
|
301
|
+
| `db.query-output-totals-off` | …: `output` keeps …, but the envelope carries … only when counting is on — the key is absent from the result. |
|
|
302
|
+
| `db.query-output-unknown-column` | …: `output` selects "…", but the row has no "…" — the key is absent from the result. |
|
|
303
|
+
| `db.safe-ref-match-arg` | …: a `ref(…, { safe: true })` is the … of `…`. |
|
|
304
|
+
| `diagnostics.allow-unused` | … "…": `diagnostics.allow` accepts …, but this export raised no such warning about … — the shape … accepted is gone, or the check no longer finds it. |
|
|
305
|
+
| `doc-token.unsupplied` | API group "…" declares a documentation gate and no token was found for it in `…`, so this artifact carries no `documentation` block — the bytes an export wou… |
|
|
306
|
+
| `documentation.literal-token` | … spells a documentation token literally in …. |
|
|
307
|
+
| `expression.ignore-empty-static-empty` | …: comparison …`…` sets `ignoreEmpty` on an operand that is EMPTY in the bundle. |
|
|
308
|
+
| `field.default-not-text` | The `default` at … was stored as … — a field's default is TEXT (a string, number or boolean), and an object, Map, Set or class instance passed there through… |
|
|
309
|
+
| `field.email-default-invalid` | The `default` at … is …, which is not an email address — every insert or request that leaves the field out is refused "Invalid email format.". |
|
|
310
|
+
| `field.enum-default-not-a-value` | The `default` at … is …, which is not one of the enum's values (…) — a value no request can send back. |
|
|
311
|
+
| `field.input-default-invalid` | The `default` at … is …, which … — every request that leaves the input out is refused. |
|
|
312
|
+
| `field.vector-not-nullable` | table "…", column "…" is a vector with `nullable: false` and no default — an empty default becomes NULL only on a nullable column, and `''` is not a vector,… |
|
|
313
|
+
| `function.reserved-input-name` | function "…": the input name `…` is reserved by the engine — a call passes its arguments keyed by input name, and the engine skips a `…` key when it evaluate… |
|
|
314
|
+
| `guard.role-unsatisfiable` | A guard.role on a table passed by name checks a column the table lacks, or a role its enum column cannot hold. |
|
|
315
|
+
| `knowledge.agents-md-mode` | …: `mode: "…"` has no effect on an `agents.md` item — its body is injected in full on every turn regardless. |
|
|
316
|
+
| `knowledge.empty-body` | …: the markdown body is empty. |
|
|
317
|
+
| `knowledge.multiple-agents-md` | A workspace can have at most one `type: "agents.md"` knowledge item, and this one declares …: …. |
|
|
318
|
+
| `knowledge.name-charset` | …: name contains …. The platform accepts the deploy and then silently DROPS the item — the agent ends up with no such knowledge and nothing reports an error.… |
|
|
319
|
+
| `knowledge.name-too-long` | …: name is … characters; the platform accepts at most …. |
|
|
320
|
+
| `knowledge.newline` | …: `…` contains a newline. |
|
|
321
|
+
| `knowledge.refs-include-source` | knowledge "…": … contains …, which … as … — everything under the directory is collected. |
|
|
322
|
+
| `knowledge.refs-symlink-skipped` | knowledge "…": … contains …, …, which … not ship — a link is not followed. |
|
|
323
|
+
| `lock.same-name-siblings` | … objects share the identity "…" while carrying different guids…. |
|
|
324
|
+
| `mcp.elicit-duplicate-key` | …: … more than one `s.mcp.elicit` that can run in one call. |
|
|
325
|
+
| `mcp.elicit-outside-mcp` | …: `s.mcp.elicit` runs in a … stack, which no MCP client calls, so there is nobody to ask and it answers `{ action: "cancel" }` every time. |
|
|
326
|
+
| `mcp.oauth-claim-unacked` | …: `oauth.claim` "…" can be edited by users at many identity providers, which would let a user choose the row they sign in as. |
|
|
327
|
+
| `mcp.oauth-external-incomplete` | …: `oauth` is external mode with no …. |
|
|
328
|
+
| `mcp.oauth-hosted-incomplete` | …: `oauth` is hosted mode with no `loginUrl`. |
|
|
329
|
+
| `mcp.oauth-preset-client-ids` | …: `oauth.preset` "…" issues access tokens without an audience, so nothing ties a token to this server. |
|
|
330
|
+
| `mcp.oauth-revoke-target` | …: `s.mcp.oauth.revoke` needs exactly one of `user_id`, `grant_id` or `all`, but it names … — the platform refuses any other combination every time the state… |
|
|
331
|
+
| `mcp.prompt-no-response` | … has no `response` and no top-level `s.return`, so every `prompts/get` of it fails: a prompt's messages are its answer. |
|
|
332
|
+
| `mcp.resource-uri-duplicate` | mcpServer "…": resources "…" and "…" share the uri "…". |
|
|
333
|
+
| `mcp.write-before-elicit` | …: … runs before `s.mcp.elicit`…. |
|
|
334
|
+
| `microservice.early-surface` | this workspace declares … — an EARLY platform surface whose stored shape is expected to change. |
|
|
335
|
+
| `microservice.secret-in-bundle` | microservice "…" writes … into this bundle verbatim — the engine stores the value as given, so a `process.env` read here resolves at export, not on the tenant. |
|
|
336
|
+
| `microservice.unsupported-block` | microservice "…" declares …, which the engine refuses on import — the workspace fatals mid-deploy, after provisioning has begun. |
|
|
337
|
+
| `middleware.auth-null-host` | middleware "…" references auth() and is attached to … "…"…, where …. |
|
|
338
|
+
| `middleware.envelope-unnested` | middleware "…" reads … straight off `s.util.get_all_input`, which binds a `{ type, vars }` envelope — the request is under `vars`, so …. |
|
|
339
|
+
| `middleware.inp-unresolvable` | middleware "…" reads …, which cannot resolve — an attached middleware has no bound inputs, so this fails at runtime with `Unable to locate input: …`.… Use `s… |
|
|
340
|
+
| `middleware.input-never-bound` | middleware "…" declares `input`, which the host request never binds — `inp()` inside a middleware fails at runtime with `Unable to locate input`, and a decla… |
|
|
341
|
+
| `middleware.post-merge-list` | query "…" answers a list, and the post middleware … merges its response into it: the list arrives as an object keyed by index (`{"0":{…},"1":{…},…}`), not th… |
|
|
342
|
+
| `middleware.post-reads-request` | middleware "…" is in the post chain of … "…"… and reads … from `s.util.get_all_input`. |
|
|
343
|
+
| `query.auth-table-unflagged` | query "…" requires auth against table "…", which is not marked `table({ auth: true })`. |
|
|
344
|
+
| `query.auth-table-unregistered` | query "…": `auth` is a table def that isn't registered on this workspace — add it with `registerTables([…])`. |
|
|
345
|
+
| `query.input-name-mangled` | query "…" (…) has an input named …, which a query string cannot deliver — the request parser rewrites param names, so `?…=…` … and the input stays empty. |
|
|
346
|
+
| `query.path-segment-candidate` | query "…" (…) looks up one row by the `…` input, but the path declares no `{…}` segment — so the value arrives as `?…=…` instead of addressing the resource. |
|
|
347
|
+
| `query.route-shadowed` | queries "…" and "…" (…, same api group) can both match `…`. |
|
|
348
|
+
| `realtime.conversation-no-limit` | realtimeChannel "…" sets `conversation: { enabled: true }` with no `limit` — `limit` defaults to 0 and 0 means retain NONE, so nothing is recorded or replayed. |
|
|
349
|
+
| `realtime.deliver-explicit` | realtimeMessage "…" sets `deliverTo: "explicit"`, which delivers to NOBODY — nothing selects recipients from inside a handler, and `s.realtime.publish` is no… |
|
|
350
|
+
| `realtime.deliver-falsy-return` | realtimeChannelTrigger "…" gates `deliver` and returns `…` — only an explicit NULL drops a message; `false`, `0` and `""` DELIVER IT UNCHANGED. |
|
|
351
|
+
| `realtime.deliver-without-per-recipient` | … "…" gates `deliver` on channel "…", but that channel does not set `delivery: { perRecipient: true }` — the engine runs the per-recipient path only when BOT… |
|
|
352
|
+
| `realtime.gate-denies-everyone` | … "…" gates `…` but declares no `response`, so it returns nothing on every run — and an empty return is a DENY, which refuses every client. |
|
|
353
|
+
| `realtime.join-deliver-object-response` | … "…" serves both `join` and `deliver` with one object response — `join` reads it as the admit decision, but `deliver` reads an object as the recipient's NEW… |
|
|
354
|
+
| `realtime.per-recipient-without-deliver` | realtimeChannel "…" sets `delivery: { perRecipient: true }` but no active `deliver` trigger is bound to it, so the flag is a no-op — the engine falls back to… |
|
|
355
|
+
| `realtime.publish-unknown-channel` | …: `s.realtime.publish` targets channel path "…" on realtime server "…", but that path is a channel of … only, so no client of "…" can be subscribed to it —… |
|
|
356
|
+
| `realtime.publish-unknown-server` | …: `s.realtime.publish` targets realtime server "…", which this workspace does not register. |
|
|
357
|
+
| `realtime.server-disabled` | realtimeServer "…" is not enabled — `enabled` defaults to FALSE, unlike every other `enabled` — but … channel… registered on it, so no client can connect to …. |
|
|
358
|
+
| `redis.ratelimit-no-error` | … "…": an `s.redis.ratelimit` has no `error`, so it never stops a request — over `max` it …. |
|
|
359
|
+
| `reference.unresolved` | … references …, which is not registered on this workspace. |
|
|
360
|
+
| `response.unbound-return` | … "…" ends with s.return(...) but has no `response` field. |
|
|
361
|
+
| `search.request-only-filter` | … pipes a search operand through `…`, which evaluates only in the request. |
|
|
362
|
+
| `seed.invalid` | A seed row does not match its table's columns. |
|
|
363
|
+
| `seed.public-seed` | Table "…" declares publicSeed but has no `seed`: there are no seed values to declare public. |
|
|
364
|
+
| `stack.auth-no-caller` | … "…" reads `auth()`, but …: it deploys clean and never holds the caller's identity. |
|
|
365
|
+
| `stack.auth-null-host` | … "…": an `s.redis.ratelimit` in its stack keys off auth(), where …. |
|
|
366
|
+
| `stack.blank-table` | … has … (…) bound to no table (`table: null`) — … nothing when run. |
|
|
367
|
+
| `stack.col-outside-query` | `col("…")` outside a `db.*` statement's where/sort/eval — the engine reads it as the column NAME, so a condition on it is decided by that text and a response returns it. |
|
|
368
|
+
| `stack.env-undeclared` | … "…" reads …, which … among the … environment variable… this workspace config declares (…). |
|
|
369
|
+
| `stack.expect-outside-test` | … runs … in its stack. |
|
|
370
|
+
| `stack.inp-undeclared` | … "…" reads …, which … here — ….… This deploys clean and fails at runtime with `Unable to locate input: …`. |
|
|
371
|
+
| `stack.loop-control-outside-loop` | … runs `…` outside any loop. |
|
|
372
|
+
| `stack.password-input-double-hash` | …: `s.security.check_password` reads `inp("…")`, and the input `…` is declared `input.password()`. |
|
|
373
|
+
| `stack.reserved-var-namespace` | `ref("…")` reads a stack variable named after a reserved namespace (`auth`, `input`, `env`, …) that nothing binds — use its accessor (`auth()`, `inp()`, `env()`, …) — a 500 at runtime. |
|
|
374
|
+
| `stack.to-throw-isolated-var` | …: `ref("…")` inside an `s.expect.to_throw` body names `…`, which is bound OUTSIDE the body. |
|
|
375
|
+
| `stack.unbound-var` | `ref("…")` reads a variable nothing in the stack binds with `as` — `Missing var entry`, a 500 at runtime. |
|
|
376
|
+
| `stack.zip-password-absent` | …: `…` sends no … key (`…: null`), and the engine rejects that at run time with `Missing param: …`. |
|
|
377
|
+
| `statement.decode-only` | A pulled workspace carries a statement Xano SDK has no factory for, as a `raw(…)` call; replace it with the statement it stands in for. |
|
|
378
|
+
| `statement.omitted-input` | …: `s.function.run` of function "…" does not pass …. |
|
|
379
|
+
| `statement.reserved-input-name` | …: `…` passes an input named `…`, which is reserved by the engine — it skips a `…` key when it evaluates a call's arguments, so the callee receives the uneva… |
|
|
380
|
+
| `statement.run-family-host` | … contains `…`, which only runs inside a workflow test. |
|
|
381
|
+
| `statement.unknown-input` | …: `…` of … "…" passes `…`, which that … does not declare — the engine drops it, so the target never sees the value. |
|
|
382
|
+
| `storage.stored-file-input` | … "…": `s.storage.…` reads `inp("…")`…, an `input.…()` — that input takes an already-stored file, so an upload to it is refused (`400 Missing param: path`) b… |
|
|
383
|
+
| `switch.missing-break` | … has a `s.switch` whose case … omits `break: true`, so a match there FALLS THROUGH and also runs …. |
|
|
384
|
+
| `table.column-name-unusable` | A stored column name the rule refuses (inserts, filters or reads fail on it), kept on a pulled table. |
|
|
385
|
+
| `table.reserved-column-name` | table "…": the column name `…` is reserved by the engine — it is the key a block statement stores its sub-stack under, and an insert's parameter map collides… |
|
|
386
|
+
| `table.view-duplicate` | …: `id` "…" is also the id of … — each view needs its own uuid. |
|
|
387
|
+
| `table.view-id-not-uuid` | …: `id` "…" is not a uuid, and the engine keys the view by it. |
|
|
388
|
+
| `table.view-unknown-column` | …: `…` names "…", which is not a column of this table… The view exports and then …. |
|
|
389
|
+
| `test.live-datasource` | A def's test runs against the "live" datasource, which every run clones first; `datasource: ""` or a small fixture is the default. |
|
|
390
|
+
| `test.unknown-input` | …: `input` passes `…`, which the … does not declare — the engine drops it, so the test runs without it. |
|
|
391
|
+
| `tool.output-mismatch` | tool "…": its `response` …. |
|
|
392
|
+
| `toolset.primitive-reads-auth-ungated` | mcpServer "…": … "…" reads `auth()`, but its entry names no auth table, so it runs with no caller and every `…` answers `-32603 "Access Denied"`. |
|
|
393
|
+
| `toolset.tool-reads-auth-ungated` | … "…": tool "…" reads `auth()`, but its entry names no auth table, so the tool runs with no caller. |
|
|
394
|
+
| `toolset.tool-ref-zero` | … `tools[…]` is `id: 0`, which references no tool — engine ids start at 1. |
|
|
395
|
+
| `trigger.no-action` | … "…" enables no action, so it deploys and never fires. |
|
|
396
|
+
| `trigger.search-bare-column` | tableTrigger "…": `search` reads `col("…")`, which names neither row the condition is tested against. |
|
|
397
|
+
| `trigger.search-unknown-column` | tableTrigger "…": `search` reads `col("…")`, but its table has no column "…" — it declares …. |
|
|
398
|
+
| `trigger.unbound` | … "…" names no object to fire on, so it deploys bound to nothing and never runs. |
|
|
399
|
+
| `value.int-out-of-range` | … "…" stores the integer …, outside the signed 64-bit range (… to …). |
|
|
400
|
+
| `value.interpolated-object` | … stores … — `[object Object]` is the JS toString of a tagged value (`ref()`/`inp()`/`c.*`) interpolated into a template literal or `+` concatenation, which… |
|
|
401
|
+
| `value.obj-zero-based-numeric-keys` | … stores the object …, whose zero-based numeric keys make the engine evaluate it as a LIST, not an object. |
|
|
402
|
+
| `value.regex-operands-reversed` | … pipes a regex filter's SUBJECT and passes its PATTERN as the argument: …. |
|
|
403
|
+
| `value.timezone-unknown` | … "…": … names a timezone the engine does not apply — it formats in UTC instead, without an error. |
|
|
404
|
+
| `workflow-test.live-datasource` | A workflow test runs against the "live" datasource, which every run clones first; `datasource: ""` or a small fixture is the default. |
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Coverage & agent grounding
|
|
2
|
+
|
|
3
|
+
What Xano SDK covers against the engine catalog, what is deliberately out of scope, and the machine-readable grounding it ships for agents.
|
|
4
|
+
|
|
5
|
+
## Coverage & scope
|
|
6
|
+
|
|
7
|
+
Xano SDK emits only (the engine imports/executes). Fidelity is proven by deep-equal against
|
|
8
|
+
the real Xano engine golden fixtures, and a coverage report prints on every test run.
|
|
9
|
+
|
|
10
|
+
| Surface | Coverage |
|
|
11
|
+
|---|---|
|
|
12
|
+
| Object kinds | **27 / 33** — counted over the engine's catalog, where each trigger type is its own kind |
|
|
13
|
+
| Statements (via `s`) | **218 / 218 (100%)** — every engine statement surface has a factory |
|
|
14
|
+
| Filters (via `fl`) | **246 / 246 (100%)** — every filter's signature is known: 144 carry arguments, 102 take none |
|
|
15
|
+
|
|
16
|
+
The six engine kinds you cannot author here are `tablemap`, `run.job`, `run.service`, the
|
|
17
|
+
superseded `realtime_channel`, `branch` and `market_item`. Four of the six are the same
|
|
18
|
+
verdict: they are instance or account state rather than workspace source, so a bundle has no
|
|
19
|
+
section for them and a pull could not bring one back. `run.job`/`run.service` belong in that
|
|
20
|
+
group — a run is a named runnable registered against an ACCOUNT, carrying a user and a
|
|
21
|
+
signature, and a bundle carries only an install record for one. Nothing in this SDK targets
|
|
22
|
+
one either: `s.cloud.job` takes an `image` and a `command` directly, so a containerized job
|
|
23
|
+
is declared at the call site and needs no separate definition, and a long-running container
|
|
24
|
+
that belongs to a workspace is a `microservice()`. `llms.txt` names all six with their
|
|
25
|
+
reasons. `llms.txt` and `manifest.json` regenerate their counts from the SDK's own
|
|
26
|
+
catalogs; this table is hand-written, so a test asserts every figure in it against
|
|
27
|
+
`buildManifest()` (`@xano/sdk/internal`) — the numbers here and the numbers an agent
|
|
28
|
+
reads cannot disagree.
|
|
29
|
+
|
|
30
|
+
The statement catalog is generated from the engine's own schemas (`npm run codegen`): 153 of
|
|
31
|
+
the 218 surfaces are declarative and carry a typed field schema, and the remaining 65 —
|
|
32
|
+
control flow, the `db` family, the call family — are hand-authored. **Reachable ≠ byte-verified**: every surface is
|
|
33
|
+
authorable, but a structural special without a persisted golden yet emits a shape *modeled*
|
|
34
|
+
on the engine schema, to be deep-equal'd against fixtures as they are captured.
|
|
35
|
+
|
|
36
|
+
**Out of scope** — reimplementing the engine's XanoScript parser, executing objects at
|
|
37
|
+
runtime (Xano SDK only compiles), and generating engine-side numeric ids/timestamps.
|
|
38
|
+
(Object guids and canonicals *are* handled — deterministically derived or frozen via
|
|
39
|
+
`xano.lock`.)
|
|
40
|
+
|
|
41
|
+
**Deferred (by design)** — folder auto-discovery, and the `service` / `vault` / `branch`
|
|
42
|
+
payload sections. (Round-trip decompile is no longer deferred: that is
|
|
43
|
+
`xanosdk init --from`, in the [CLI guide](cli.md); nor is `workflow_test` — it is a
|
|
44
|
+
first-class kind, see `workflowTest` in [Object kinds](object-kinds.md).) `InferResponse`
|
|
45
|
+
auto-derivation covers the object-literal and single-`db`-variable cases (matching the engine's
|
|
46
|
+
static walk), and follows a CALL into the object it invokes (`s.function.call`/`.run`,
|
|
47
|
+
`s.tool.call`, `s.api.call` given a def handle bind the target's own `InferResponse`);
|
|
48
|
+
a response variable produced inside control flow or `set_var`, and addon/related-field
|
|
49
|
+
keys, resolve to `unknown` — declare `responseShape` for those.
|
|
50
|
+
|
|
51
|
+
## Agent grounding
|
|
52
|
+
|
|
53
|
+
Xano SDK ships two machine-readable descriptions of its whole authoring surface so an agent
|
|
54
|
+
can learn the SDK without reading source:
|
|
55
|
+
|
|
56
|
+
- **`llms.txt`** — the always-read router: the mental model, the deploy contract, control
|
|
57
|
+
flow, the non-obvious rules in `## Gotchas`, and a `## Topic files` list naming each
|
|
58
|
+
**`llms/*.md`** and when to open it. It does not document the CLI — `xanosdk <command>
|
|
59
|
+
--help` and the `cli` array in `manifest.json` do, from the same registry that generates
|
|
60
|
+
the shell completions. The written version is the [CLI guide](cli.md).
|
|
61
|
+
- **`llms/*.md`** — one file per surface (object def shapes, statements, values, fields,
|
|
62
|
+
filters, lambda bodies, what a client pays to import a def, an index of exact error
|
|
63
|
+
strings, and the legacy names a pulled workspace carries), read only when that surface
|
|
64
|
+
is in play. **`llms-full.txt`** is all
|
|
65
|
+
of them concatenated, for a reader that wants one file rather than two.
|
|
66
|
+
- **`manifest.json`** — the exhaustive reference tier, reached by targeted lookup (grep or
|
|
67
|
+
`jq` one entry; never read it whole). Every object kind (factory, `Xano.register*` method,
|
|
68
|
+
payload key), every statement surface (the `s.<path>` accessor, stored `mvp:` name, and a
|
|
69
|
+
typed field schema for the 153 declarative statements), the value constructors, the tag
|
|
70
|
+
catalog, the filter catalog, and every CLI command and flag — plus live coverage counts.
|
|
71
|
+
|
|
72
|
+
Both derive from the SDK's own sources of truth (so they can't drift), regenerate with
|
|
73
|
+
`npm run manifest`, and are available at runtime via `buildManifest()` / `renderLlmsTxt()`,
|
|
74
|
+
both exported from `@xano/sdk/internal`.
|