@xano/cli 1.0.2-beta.1 → 1.0.2-beta.3
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/README.md +9 -2
- package/dist/commands/branch/delete/index.js +1 -1
- package/dist/commands/branch/set_live/index.js +2 -2
- package/dist/commands/profile/delete/index.js +2 -2
- package/dist/commands/release/delete/index.js +1 -1
- package/dist/commands/release/deploy/index.js +3 -3
- package/dist/commands/release/import/index.js +1 -1
- package/dist/commands/release/push/index.js +1 -1
- package/dist/commands/sandbox/delete/index.js +2 -2
- package/dist/commands/sandbox/env/delete/index.js +1 -1
- package/dist/commands/sandbox/env/set_all/index.js +1 -1
- package/dist/commands/sandbox/license/set/index.js +1 -1
- package/dist/commands/sandbox/push/index.d.ts +0 -2
- package/dist/commands/sandbox/push/index.js +4 -26
- package/dist/commands/sandbox/reset/index.js +2 -2
- package/dist/commands/tenant/backup/delete/index.js +2 -2
- package/dist/commands/tenant/backup/restore/index.js +2 -2
- package/dist/commands/tenant/cluster/delete/index.js +2 -2
- package/dist/commands/tenant/cluster/license/set/index.js +1 -1
- package/dist/commands/tenant/create/index.js +1 -1
- package/dist/commands/tenant/delete/index.js +1 -1
- package/dist/commands/tenant/deploy_platform/index.js +1 -1
- package/dist/commands/tenant/deploy_release/index.js +1 -1
- package/dist/commands/tenant/edit/index.js +3 -3
- package/dist/commands/tenant/env/delete/index.js +1 -1
- package/dist/commands/tenant/env/set_all/index.js +1 -1
- package/dist/commands/tenant/license/set/index.js +1 -1
- package/dist/commands/tenant/push/index.js +1 -1
- package/dist/commands/workflow_test/delete/index.js +1 -1
- package/dist/commands/workspace/delete/index.js +1 -1
- package/dist/commands/workspace/edit/index.js +1 -1
- package/dist/commands/workspace/push/index.js +6 -6
- package/dist/utils/multidoc-push.d.ts +21 -0
- package/dist/utils/multidoc-push.js +44 -0
- package/oclif.manifest.json +2786 -2807
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,6 +30,15 @@ npm install -g @xano/cli
|
|
|
30
30
|
|
|
31
31
|
## Commands
|
|
32
32
|
|
|
33
|
+
### Safety warnings in command help
|
|
34
|
+
|
|
35
|
+
Destructive commands include imperative safety prefixes in their help text and flag descriptions so automated agents (e.g. Claude Code, Cursor) pause before running them in auto-accept mode:
|
|
36
|
+
|
|
37
|
+
- **`[CRITICAL]`** — Agents must STOP and confirm with the user before running. Used for irreversible or high-blast-radius operations, including (but not limited to) `--force` deletions, `workspace edit --allow-push`, `workspace push --records`, `workspace/sandbox push --truncate`, `--no-transaction`, `--sync --delete`, backup restore/delete, cluster delete, `env set_all`, `sandbox reset`, `sandbox delete`, `profile delete`, and tenant deploys.
|
|
38
|
+
- **`[IMPORTANT]`** — Agents should confirm with the user (and prefer `--dry-run` previews where applicable). Used for base `workspace push` and `sandbox push`, `branch set_live`, `release import`, `release push`, `release deploy`, and single-variable env / workflow-test deletes.
|
|
39
|
+
|
|
40
|
+
These warnings are layer 1 of broader push-safety work; ephemeral sandbox environments and push preview remain the structural safeguards.
|
|
41
|
+
|
|
33
42
|
### Authentication
|
|
34
43
|
|
|
35
44
|
```bash
|
|
@@ -482,8 +491,6 @@ xano sandbox push --records --env # Include records and e
|
|
|
482
491
|
xano sandbox push --truncate # Truncate tables before import
|
|
483
492
|
xano sandbox push --no-guids # Skip writing GUIDs back to local files
|
|
484
493
|
xano sandbox push --force # Skip preview and confirmation
|
|
485
|
-
xano sandbox push -i "function/*" # Push only matching files
|
|
486
|
-
xano sandbox push -e "table/*" # Push all files except tables
|
|
487
494
|
xano sandbox push --review # Push and open sandbox review in the browser
|
|
488
495
|
|
|
489
496
|
# Review (open in browser)
|
|
@@ -30,7 +30,7 @@ Deleted branch: dev
|
|
|
30
30
|
force: Flags.boolean({
|
|
31
31
|
char: 'f',
|
|
32
32
|
default: false,
|
|
33
|
-
description: '
|
|
33
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
34
34
|
required: false,
|
|
35
35
|
}),
|
|
36
36
|
output: Flags.string({
|
|
@@ -9,7 +9,7 @@ export default class BranchSetLive extends BaseCommand {
|
|
|
9
9
|
required: true,
|
|
10
10
|
}),
|
|
11
11
|
};
|
|
12
|
-
static description = '
|
|
12
|
+
static description = '[IMPORTANT] ALWAYS confirm with the user before changing the live branch. Sets a branch as the live (active) branch for API requests.';
|
|
13
13
|
static examples = [
|
|
14
14
|
`$ xano branch set-live staging
|
|
15
15
|
Are you sure you want to set 'staging' as the live branch? (y/N) y
|
|
@@ -32,7 +32,7 @@ Branch 'v1' is now live
|
|
|
32
32
|
force: Flags.boolean({
|
|
33
33
|
char: 'f',
|
|
34
34
|
default: false,
|
|
35
|
-
description: '
|
|
35
|
+
description: '[IMPORTANT] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
36
36
|
required: false,
|
|
37
37
|
}),
|
|
38
38
|
output: Flags.string({
|
|
@@ -9,7 +9,7 @@ export default class ProfileDelete extends Command {
|
|
|
9
9
|
required: true,
|
|
10
10
|
}),
|
|
11
11
|
};
|
|
12
|
-
static description = '
|
|
12
|
+
static description = '[CRITICAL] NEVER run without explicit user confirmation; this removes saved credentials from the local config. Deletes a profile configuration.';
|
|
13
13
|
static examples = [
|
|
14
14
|
`$ xano profile:delete old-profile
|
|
15
15
|
Are you sure you want to delete profile 'old-profile'? (y/n): y
|
|
@@ -32,7 +32,7 @@ Profile 'old-profile' deleted successfully from ~/.xano/credentials.yaml
|
|
|
32
32
|
force: Flags.boolean({
|
|
33
33
|
char: 'f',
|
|
34
34
|
default: false,
|
|
35
|
-
description: '
|
|
35
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
36
36
|
required: false,
|
|
37
37
|
}),
|
|
38
38
|
};
|
|
@@ -25,7 +25,7 @@ Deleted release 'v1.0'
|
|
|
25
25
|
force: Flags.boolean({
|
|
26
26
|
char: 'f',
|
|
27
27
|
default: false,
|
|
28
|
-
description: '
|
|
28
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
29
29
|
required: false,
|
|
30
30
|
}),
|
|
31
31
|
output: Flags.string({
|
|
@@ -7,7 +7,7 @@ export default class ReleaseDeploy extends BaseCommand {
|
|
|
7
7
|
required: true,
|
|
8
8
|
}),
|
|
9
9
|
};
|
|
10
|
-
static description = '
|
|
10
|
+
static description = '[IMPORTANT] ALWAYS confirm with the user before deploying a release. Deploys a release to its workspace as a new branch.';
|
|
11
11
|
static examples = [
|
|
12
12
|
`$ xano release deploy "v1.0"
|
|
13
13
|
Are you sure you want to deploy release "v1.0"? (y/N) y
|
|
@@ -29,7 +29,7 @@ Deployed release "v1.0" to workspace 40 (branch: v1.0)
|
|
|
29
29
|
force: Flags.boolean({
|
|
30
30
|
char: 'f',
|
|
31
31
|
default: false,
|
|
32
|
-
description: '
|
|
32
|
+
description: '[IMPORTANT] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
33
33
|
required: false,
|
|
34
34
|
}),
|
|
35
35
|
output: Flags.string({
|
|
@@ -41,7 +41,7 @@ Deployed release "v1.0" to workspace 40 (branch: v1.0)
|
|
|
41
41
|
}),
|
|
42
42
|
set_live: Flags.boolean({
|
|
43
43
|
default: false,
|
|
44
|
-
description: '
|
|
44
|
+
description: '[CRITICAL] STOP and confirm with the user before setting the deployed branch as live.',
|
|
45
45
|
required: false,
|
|
46
46
|
}),
|
|
47
47
|
workspace: Flags.string({
|
|
@@ -5,7 +5,7 @@ import * as yaml from 'js-yaml';
|
|
|
5
5
|
import BaseCommand from '../../../base-command.js';
|
|
6
6
|
export default class ReleaseImport extends BaseCommand {
|
|
7
7
|
static args = {};
|
|
8
|
-
static description = '
|
|
8
|
+
static description = '[IMPORTANT] ALWAYS confirm with the user before importing a release. Imports a release file into a workspace.';
|
|
9
9
|
static examples = [
|
|
10
10
|
`$ xano release import --file ./my-release.tar.gz
|
|
11
11
|
Imported release as #15
|
|
@@ -5,7 +5,7 @@ import * as path from 'node:path';
|
|
|
5
5
|
import BaseCommand from '../../../base-command.js';
|
|
6
6
|
import { findFilesWithGuid } from '../../../utils/document-parser.js';
|
|
7
7
|
export default class ReleasePush extends BaseCommand {
|
|
8
|
-
static description = '
|
|
8
|
+
static description = '[IMPORTANT] ALWAYS confirm with the user before creating a release from local files. Creates a new release from local XanoScript files via the multidoc endpoint.';
|
|
9
9
|
static examples = [
|
|
10
10
|
`$ xano release push -n "v1.0"
|
|
11
11
|
Created release: v1.0 - ID: 10 (from current directory)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
2
|
import BaseCommand from '../../../base-command.js';
|
|
3
3
|
export default class SandboxDelete extends BaseCommand {
|
|
4
|
-
static description = '
|
|
4
|
+
static description = '[CRITICAL] NEVER run without explicit user confirmation; this destroys all sandbox data. Deletes your sandbox environment completely (debugging only — it will be re-created on next access).';
|
|
5
5
|
static examples = [
|
|
6
6
|
`$ xano sandbox delete
|
|
7
7
|
Are you sure you want to DELETE your sandbox environment? This destroys all data. (y/N) y
|
|
@@ -14,7 +14,7 @@ Sandbox environment deleted.
|
|
|
14
14
|
force: Flags.boolean({
|
|
15
15
|
char: 'f',
|
|
16
16
|
default: false,
|
|
17
|
-
description: '
|
|
17
|
+
description: '[CRITICAL] Skips the confirmation prompt.',
|
|
18
18
|
required: false,
|
|
19
19
|
}),
|
|
20
20
|
};
|
|
@@ -15,7 +15,7 @@ Environment variable 'DATABASE_URL' deleted
|
|
|
15
15
|
force: Flags.boolean({
|
|
16
16
|
char: 'f',
|
|
17
17
|
default: false,
|
|
18
|
-
description: '
|
|
18
|
+
description: '[IMPORTANT] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
19
19
|
required: false,
|
|
20
20
|
}),
|
|
21
21
|
name: Flags.string({
|
|
@@ -4,7 +4,7 @@ import * as fs from 'node:fs';
|
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import BaseCommand from '../../../../base-command.js';
|
|
6
6
|
export default class SandboxEnvSetAll extends BaseCommand {
|
|
7
|
-
static description = '
|
|
7
|
+
static description = '[CRITICAL] STOP and confirm with the user; this replaces all environment variables with the imported file. Sets all environment variables for a sandbox environment from a YAML file.';
|
|
8
8
|
static examples = [
|
|
9
9
|
`$ xano sandbox env set_all
|
|
10
10
|
Reads from env_<tenant>.yaml
|
|
@@ -16,7 +16,7 @@ Reads from license_<tenant>.yaml
|
|
|
16
16
|
...BaseCommand.baseFlags,
|
|
17
17
|
clean: Flags.boolean({
|
|
18
18
|
default: false,
|
|
19
|
-
description: '
|
|
19
|
+
description: '[IMPORTANT] ALWAYS confirm with the user before deleting the source license file after upload. Removes the source file after successful upload.',
|
|
20
20
|
exclusive: ['value'],
|
|
21
21
|
required: false,
|
|
22
22
|
}),
|
|
@@ -7,10 +7,8 @@ export default class SandboxPush extends BaseCommand {
|
|
|
7
7
|
delete: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
8
|
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
9
|
env: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
-
exclude: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
10
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
11
|
guids: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
-
include: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
12
|
records: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
13
|
review: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
14
|
sync: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
@@ -5,7 +5,7 @@ import open from 'open';
|
|
|
5
5
|
import BaseCommand from '../../../base-command.js';
|
|
6
6
|
import { executePush } from '../../../utils/multidoc-push.js';
|
|
7
7
|
export default class SandboxPush extends BaseCommand {
|
|
8
|
-
static description = 'Push local documents to your sandbox environment via multidoc import. By default, only changed files are pushed (partial mode). Use --sync to push all files. Shows a preview of changes before pushing unless --force is specified. Use --dry-run to preview only.';
|
|
8
|
+
static description = '[IMPORTANT] ALWAYS run --dry-run first and show the user the output before pushing. Push local documents to your sandbox environment via multidoc import. By default, only changed files are pushed (partial mode). Use --sync to push all files. Shows a preview of changes before pushing unless --force is specified. Use --dry-run to preview only. Include/exclude glob filters are intentionally not supported on sandbox push — partial pushes can hide deletions during review and lead to data loss when promoted to the workspace. Large pushes against a sandbox loaded with a different workspace will prompt for confirmation; run `xano sandbox reset` first to start clean.';
|
|
9
9
|
static examples = [
|
|
10
10
|
`$ xano sandbox push
|
|
11
11
|
Push from current directory (default partial mode)
|
|
@@ -27,15 +27,6 @@ Skip preview and push immediately
|
|
|
27
27
|
`,
|
|
28
28
|
`$ xano sandbox push --records --env`,
|
|
29
29
|
`$ xano sandbox push --truncate`,
|
|
30
|
-
`$ xano sandbox push -i "**/func*"
|
|
31
|
-
Push only files matching the glob pattern
|
|
32
|
-
`,
|
|
33
|
-
`$ xano sandbox push -i "function/*" -i "table/*"
|
|
34
|
-
Push files matching multiple patterns
|
|
35
|
-
`,
|
|
36
|
-
`$ xano sandbox push -e "table/*"
|
|
37
|
-
Push all files except tables
|
|
38
|
-
`,
|
|
39
30
|
`$ xano sandbox push --review
|
|
40
31
|
Push and open sandbox review in the browser
|
|
41
32
|
`,
|
|
@@ -63,12 +54,6 @@ Push and open sandbox review in the browser
|
|
|
63
54
|
description: 'Include environment variables in import',
|
|
64
55
|
required: false,
|
|
65
56
|
}),
|
|
66
|
-
exclude: Flags.string({
|
|
67
|
-
char: 'e',
|
|
68
|
-
description: 'Glob pattern to exclude files (e.g. "table/*", "**/test*"). Matched against relative paths from the push directory.',
|
|
69
|
-
multiple: true,
|
|
70
|
-
required: false,
|
|
71
|
-
}),
|
|
72
57
|
force: Flags.boolean({
|
|
73
58
|
default: false,
|
|
74
59
|
description: 'Skip preview and confirmation prompt (for CI/CD pipelines)',
|
|
@@ -80,12 +65,6 @@ Push and open sandbox review in the browser
|
|
|
80
65
|
description: 'Write server-assigned GUIDs back to local files (use --no-guids to skip)',
|
|
81
66
|
required: false,
|
|
82
67
|
}),
|
|
83
|
-
include: Flags.string({
|
|
84
|
-
char: 'i',
|
|
85
|
-
description: 'Glob pattern to include files (e.g. "**/func*", "table/*.xs"). Matched against relative paths from the push directory.',
|
|
86
|
-
multiple: true,
|
|
87
|
-
required: false,
|
|
88
|
-
}),
|
|
89
68
|
records: Flags.boolean({
|
|
90
69
|
default: false,
|
|
91
70
|
description: 'Include records in import',
|
|
@@ -104,12 +83,12 @@ Push and open sandbox review in the browser
|
|
|
104
83
|
transaction: Flags.boolean({
|
|
105
84
|
allowNo: true,
|
|
106
85
|
default: true,
|
|
107
|
-
description: '
|
|
86
|
+
description: '[CRITICAL] DO NOT run with --no-transaction without explicit user confirmation; this disables rollback. Wraps import in a database transaction (use --no-transaction for debugging purposes).',
|
|
108
87
|
required: false,
|
|
109
88
|
}),
|
|
110
89
|
truncate: Flags.boolean({
|
|
111
90
|
default: false,
|
|
112
|
-
description: '
|
|
91
|
+
description: '[CRITICAL] STOP and confirm with the user; this truncates live tables before importing.',
|
|
113
92
|
required: false,
|
|
114
93
|
}),
|
|
115
94
|
};
|
|
@@ -132,15 +111,14 @@ Push and open sandbox review in the browser
|
|
|
132
111
|
label: 'sandbox environment',
|
|
133
112
|
supportsBranches: false,
|
|
134
113
|
supportsPartial: true,
|
|
114
|
+
warnOnWorkspaceMismatch: true,
|
|
135
115
|
};
|
|
136
116
|
const pushFlags = {
|
|
137
117
|
delete: flags.delete,
|
|
138
118
|
'dry-run': flags['dry-run'],
|
|
139
119
|
env: flags.env,
|
|
140
|
-
exclude: flags.exclude,
|
|
141
120
|
force: flags.force,
|
|
142
121
|
guids: flags.guids,
|
|
143
|
-
include: flags.include,
|
|
144
122
|
records: flags.records,
|
|
145
123
|
sync: flags.sync,
|
|
146
124
|
transaction: flags.transaction,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
2
|
import BaseCommand from '../../../base-command.js';
|
|
3
3
|
export default class SandboxReset extends BaseCommand {
|
|
4
|
-
static description = '
|
|
4
|
+
static description = '[CRITICAL] NEVER run without explicit user confirmation; this clears all workspace data and drafts. Resets your sandbox environment.';
|
|
5
5
|
static examples = [
|
|
6
6
|
`$ xano sandbox reset
|
|
7
7
|
Are you sure you want to reset your sandbox environment? All workspace data and drafts will be cleared. (y/N) y
|
|
@@ -14,7 +14,7 @@ Sandbox environment has been reset.
|
|
|
14
14
|
force: Flags.boolean({
|
|
15
15
|
char: 'f',
|
|
16
16
|
default: false,
|
|
17
|
-
description: '
|
|
17
|
+
description: '[CRITICAL] Skips the confirmation prompt.',
|
|
18
18
|
required: false,
|
|
19
19
|
}),
|
|
20
20
|
};
|
|
@@ -10,7 +10,7 @@ export default class TenantBackupDelete extends BaseCommand {
|
|
|
10
10
|
required: true,
|
|
11
11
|
}),
|
|
12
12
|
};
|
|
13
|
-
static description = '
|
|
13
|
+
static description = '[CRITICAL] NEVER delete a backup without explicit user confirmation; this removes your restore point. Deletes a tenant backup permanently.';
|
|
14
14
|
static examples = [
|
|
15
15
|
`$ xano tenant backup delete t1234-abcd-xyz1 --backup_id 10
|
|
16
16
|
Are you sure you want to delete backup #10? This action cannot be undone. (y/N) y
|
|
@@ -28,7 +28,7 @@ Deleted backup #10
|
|
|
28
28
|
force: Flags.boolean({
|
|
29
29
|
char: 'f',
|
|
30
30
|
default: false,
|
|
31
|
-
description: '
|
|
31
|
+
description: '[CRITICAL] Skips the confirmation prompt.',
|
|
32
32
|
required: false,
|
|
33
33
|
}),
|
|
34
34
|
output: Flags.string({
|
|
@@ -9,7 +9,7 @@ export default class TenantRestore extends BaseCommand {
|
|
|
9
9
|
required: true,
|
|
10
10
|
}),
|
|
11
11
|
};
|
|
12
|
-
static description = '
|
|
12
|
+
static description = '[CRITICAL] STOP and confirm with the user; this overwrites current tenant state. Restores a tenant from a backup, replacing current tenant data.';
|
|
13
13
|
static examples = [
|
|
14
14
|
`$ xano tenant backup restore t1234-abcd-xyz1 --backup_id 10
|
|
15
15
|
Are you sure you want to restore tenant t1234-abcd-xyz1 from backup 10? This will replace current data. (y/N) y
|
|
@@ -26,7 +26,7 @@ Restored tenant t1234-abcd-xyz1 from backup #10
|
|
|
26
26
|
force: Flags.boolean({
|
|
27
27
|
char: 'f',
|
|
28
28
|
default: false,
|
|
29
|
-
description: '
|
|
29
|
+
description: '[CRITICAL] Skips the confirmation prompt.',
|
|
30
30
|
required: false,
|
|
31
31
|
}),
|
|
32
32
|
output: Flags.string({
|
|
@@ -9,7 +9,7 @@ export default class TenantClusterDelete extends BaseCommand {
|
|
|
9
9
|
required: true,
|
|
10
10
|
}),
|
|
11
11
|
};
|
|
12
|
-
static description = '
|
|
12
|
+
static description = '[CRITICAL] NEVER run without explicit user confirmation; this removes an entire cluster. Deletes a tenant cluster permanently.';
|
|
13
13
|
static examples = [
|
|
14
14
|
`$ xano tenant cluster delete 3
|
|
15
15
|
Are you sure you want to delete tenant cluster 3? This action cannot be undone. (y/N) y
|
|
@@ -25,7 +25,7 @@ Tenant cluster 3 deleted successfully
|
|
|
25
25
|
force: Flags.boolean({
|
|
26
26
|
char: 'f',
|
|
27
27
|
default: false,
|
|
28
|
-
description: '
|
|
28
|
+
description: '[CRITICAL] Skips the confirmation prompt.',
|
|
29
29
|
required: false,
|
|
30
30
|
}),
|
|
31
31
|
output: Flags.string({
|
|
@@ -23,7 +23,7 @@ Reads from kubeconfig-1.yaml
|
|
|
23
23
|
...BaseCommand.baseFlags,
|
|
24
24
|
clean: Flags.boolean({
|
|
25
25
|
default: false,
|
|
26
|
-
description: '
|
|
26
|
+
description: '[IMPORTANT] ALWAYS confirm with the user before deleting the source kubeconfig file after upload. Removes the source file after successful upload.',
|
|
27
27
|
exclusive: ['value'],
|
|
28
28
|
required: false,
|
|
29
29
|
}),
|
|
@@ -10,7 +10,7 @@ export default class TenantCreate extends BaseCommand {
|
|
|
10
10
|
required: true,
|
|
11
11
|
}),
|
|
12
12
|
};
|
|
13
|
-
static description = '
|
|
13
|
+
static description = '[IMPORTANT] ALWAYS confirm with the user before creating a tier2/tier3 tenant; this provisions billable infrastructure on a cluster. Creates a new tenant in a workspace.';
|
|
14
14
|
static examples = [
|
|
15
15
|
`$ xano tenant create "Production"
|
|
16
16
|
Created tenant: Production (production) - ID: 42
|
|
@@ -25,7 +25,7 @@ Deleted tenant t1234-abcd-xyz1
|
|
|
25
25
|
force: Flags.boolean({
|
|
26
26
|
char: 'f',
|
|
27
27
|
default: false,
|
|
28
|
-
description: '
|
|
28
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
29
29
|
required: false,
|
|
30
30
|
}),
|
|
31
31
|
output: Flags.string({
|
|
@@ -10,7 +10,7 @@ export default class TenantDeployPlatform extends BaseCommand {
|
|
|
10
10
|
required: true,
|
|
11
11
|
}),
|
|
12
12
|
};
|
|
13
|
-
static description = '
|
|
13
|
+
static description = '[CRITICAL] STOP and confirm with the user before deploying a platform version to a tenant; this mutates the live tenant. Deploys a platform version to a tenant.';
|
|
14
14
|
static examples = [
|
|
15
15
|
`$ xano tenant deploy_platform t1234-abcd-xyz1 --platform_id 5
|
|
16
16
|
Deployed platform 5 to tenant: My Tenant (my-tenant)
|
|
@@ -9,7 +9,7 @@ export default class TenantDeployRelease extends BaseCommand {
|
|
|
9
9
|
required: true,
|
|
10
10
|
}),
|
|
11
11
|
};
|
|
12
|
-
static description = '
|
|
12
|
+
static description = '[CRITICAL] STOP and confirm with the user before deploying a release to a tenant; this mutates the live tenant. Deploys a release to a tenant.';
|
|
13
13
|
static examples = [
|
|
14
14
|
`$ xano tenant deploy_release t1234-abcd-xyz1 --release v1.0
|
|
15
15
|
Deployed release "v1.0" to tenant: My Tenant (my-tenant)
|
|
@@ -33,7 +33,7 @@ Updated tenant: New Name (my-tenant) - ID: 42
|
|
|
33
33
|
}),
|
|
34
34
|
ingress: Flags.boolean({
|
|
35
35
|
allowNo: true,
|
|
36
|
-
description: '
|
|
36
|
+
description: '[IMPORTANT] ALWAYS confirm with the user before disabling ingress; this takes the tenant offline from the public network. Enables/disables ingress.',
|
|
37
37
|
required: false,
|
|
38
38
|
}),
|
|
39
39
|
output: Flags.string({
|
|
@@ -49,12 +49,12 @@ Updated tenant: New Name (my-tenant) - ID: 42
|
|
|
49
49
|
}),
|
|
50
50
|
rbac: Flags.boolean({
|
|
51
51
|
allowNo: true,
|
|
52
|
-
description: '
|
|
52
|
+
description: '[CRITICAL] NEVER disable RBAC without explicit user confirmation; this removes role-based access controls on the tenant. Enables/disables RBAC.',
|
|
53
53
|
required: false,
|
|
54
54
|
}),
|
|
55
55
|
tasks: Flags.boolean({
|
|
56
56
|
allowNo: true,
|
|
57
|
-
description: '
|
|
57
|
+
description: '[IMPORTANT] ALWAYS confirm with the user before disabling background tasks; this stops scheduled jobs on the tenant. Enables/disables background tasks.',
|
|
58
58
|
required: false,
|
|
59
59
|
}),
|
|
60
60
|
workspace: Flags.string({
|
|
@@ -25,7 +25,7 @@ Environment variable 'DATABASE_URL' deleted from tenant my-tenant
|
|
|
25
25
|
force: Flags.boolean({
|
|
26
26
|
char: 'f',
|
|
27
27
|
default: false,
|
|
28
|
-
description: '
|
|
28
|
+
description: '[IMPORTANT] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
29
29
|
required: false,
|
|
30
30
|
}),
|
|
31
31
|
name: Flags.string({
|
|
@@ -10,7 +10,7 @@ export default class TenantEnvSetAll extends BaseCommand {
|
|
|
10
10
|
required: true,
|
|
11
11
|
}),
|
|
12
12
|
};
|
|
13
|
-
static description = '
|
|
13
|
+
static description = '[CRITICAL] STOP and confirm with the user; this replaces all environment variables with the imported file. Sets all environment variables for a tenant from a YAML file.';
|
|
14
14
|
static examples = [
|
|
15
15
|
`$ xano tenant env set_all my-tenant
|
|
16
16
|
Reads from env_my-tenant.yaml
|
|
@@ -23,7 +23,7 @@ Reads from license_my-tenant.yaml
|
|
|
23
23
|
...BaseCommand.baseFlags,
|
|
24
24
|
clean: Flags.boolean({
|
|
25
25
|
default: false,
|
|
26
|
-
description: '
|
|
26
|
+
description: '[IMPORTANT] ALWAYS confirm with the user before deleting the source license file after upload. Removes the source file after successful upload.',
|
|
27
27
|
exclusive: ['value'],
|
|
28
28
|
required: false,
|
|
29
29
|
}),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from '@oclif/core';
|
|
2
2
|
export default class Push extends Command {
|
|
3
|
-
static description = 'Direct tenant push is not supported
|
|
3
|
+
static description = 'Direct tenant push is not supported — deploy through a release or use the sandbox (xano sandbox push).';
|
|
4
4
|
async run() {
|
|
5
5
|
this.error('Direct tenant push is not supported.\n' +
|
|
6
6
|
'To deploy changes, use one of the following:\n' +
|
|
@@ -23,7 +23,7 @@ Deleted workflow test 1
|
|
|
23
23
|
force: Flags.boolean({
|
|
24
24
|
char: 'f',
|
|
25
25
|
default: false,
|
|
26
|
-
description: '
|
|
26
|
+
description: '[IMPORTANT] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
27
27
|
required: false,
|
|
28
28
|
}),
|
|
29
29
|
output: Flags.string({
|
|
@@ -24,7 +24,7 @@ Deleted workspace 123
|
|
|
24
24
|
force: Flags.boolean({
|
|
25
25
|
char: 'f',
|
|
26
26
|
default: false,
|
|
27
|
-
description: '
|
|
27
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
28
28
|
required: false,
|
|
29
29
|
}),
|
|
30
30
|
output: Flags.string({
|
|
@@ -29,7 +29,7 @@ Updated workspace: my-workspace (ID: 123)
|
|
|
29
29
|
...BaseCommand.baseFlags,
|
|
30
30
|
'allow-push': Flags.boolean({
|
|
31
31
|
allowNo: true,
|
|
32
|
-
description: '
|
|
32
|
+
description: '[CRITICAL] NEVER enable without explicit user confirmation; this unlocks direct CLI push to the workspace and is the gate that protects production from destructive push operations. Enables or disables direct CLI push to this workspace (not applicable on Free plan).',
|
|
33
33
|
required: false,
|
|
34
34
|
}),
|
|
35
35
|
description: Flags.string({
|
|
@@ -4,7 +4,7 @@ import { resolve } from 'node:path';
|
|
|
4
4
|
import BaseCommand from '../../../base-command.js';
|
|
5
5
|
import { executePush } from '../../../utils/multidoc-push.js';
|
|
6
6
|
export default class Push extends BaseCommand {
|
|
7
|
-
static description = 'Push local documents to a workspace. By default, only changed files are pushed (partial mode). Use --sync to push all files. Shows a preview of changes before pushing unless --force is specified. Use --dry-run to preview only.';
|
|
7
|
+
static description = '[IMPORTANT] ALWAYS run --dry-run first and show the user the output before pushing. Push local documents to a workspace. By default, only changed files are pushed (partial mode). Use --sync to push all files. Shows a preview of changes before pushing unless --force is specified. Use --dry-run to preview only.';
|
|
8
8
|
static examples = [
|
|
9
9
|
`$ xano workspace push
|
|
10
10
|
Push from current directory (default partial mode)
|
|
@@ -70,7 +70,7 @@ Push functions but exclude test files
|
|
|
70
70
|
}),
|
|
71
71
|
delete: Flags.boolean({
|
|
72
72
|
default: false,
|
|
73
|
-
description: 'Delete workspace objects not included in the push (requires --sync)',
|
|
73
|
+
description: '[CRITICAL] STOP and confirm with the user before running. Delete workspace objects not included in the push (requires --sync).',
|
|
74
74
|
required: false,
|
|
75
75
|
}),
|
|
76
76
|
'dry-run': Flags.boolean({
|
|
@@ -91,7 +91,7 @@ Push functions but exclude test files
|
|
|
91
91
|
}),
|
|
92
92
|
force: Flags.boolean({
|
|
93
93
|
default: false,
|
|
94
|
-
description: '
|
|
94
|
+
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips preview and confirmation prompt (for CI/CD pipelines).',
|
|
95
95
|
required: false,
|
|
96
96
|
}),
|
|
97
97
|
guids: Flags.boolean({
|
|
@@ -108,7 +108,7 @@ Push functions but exclude test files
|
|
|
108
108
|
}),
|
|
109
109
|
records: Flags.boolean({
|
|
110
110
|
default: false,
|
|
111
|
-
description: '
|
|
111
|
+
description: '[CRITICAL] STOP and ALWAYS run --dry-run first to show the user a preview before pushing live table records. Includes table records in import.',
|
|
112
112
|
required: false,
|
|
113
113
|
}),
|
|
114
114
|
sync: Flags.boolean({
|
|
@@ -119,12 +119,12 @@ Push functions but exclude test files
|
|
|
119
119
|
transaction: Flags.boolean({
|
|
120
120
|
allowNo: true,
|
|
121
121
|
default: true,
|
|
122
|
-
description: '
|
|
122
|
+
description: '[CRITICAL] DO NOT run with --no-transaction without explicit user confirmation; this disables rollback. Wraps import in a database transaction (use --no-transaction for debugging purposes).',
|
|
123
123
|
required: false,
|
|
124
124
|
}),
|
|
125
125
|
truncate: Flags.boolean({
|
|
126
126
|
default: false,
|
|
127
|
-
description: '
|
|
127
|
+
description: '[CRITICAL] STOP and confirm with the user; this truncates live tables before importing.',
|
|
128
128
|
required: false,
|
|
129
129
|
}),
|
|
130
130
|
workspace: Flags.string({
|
|
@@ -29,6 +29,12 @@ export interface PushTarget {
|
|
|
29
29
|
supportsBranches: boolean;
|
|
30
30
|
/** Does this target support the partial query param? */
|
|
31
31
|
supportsPartial: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Warn when the workspace embedded in the local push differs from the workspace currently
|
|
34
|
+
* loaded on the target (per dry-run). Used by sandbox push because the sandbox is shared
|
|
35
|
+
* across workspaces and pushing onto a different workspace can leave stale state behind.
|
|
36
|
+
*/
|
|
37
|
+
warnOnWorkspaceMismatch?: boolean;
|
|
32
38
|
}
|
|
33
39
|
export interface PushContext {
|
|
34
40
|
accessToken: string;
|
|
@@ -37,6 +43,17 @@ export interface PushContext {
|
|
|
37
43
|
inputDir: string;
|
|
38
44
|
verboseFetch: (url: string, options: RequestInit, verbose: boolean, authToken?: string) => Promise<Response>;
|
|
39
45
|
}
|
|
46
|
+
export declare const WORKSPACE_MISMATCH_THRESHOLD = 10;
|
|
47
|
+
/**
|
|
48
|
+
* Sum all impactful operations in a dry-run summary. `deleted` is only counted when the
|
|
49
|
+
* caller actually intends to apply deletions (sync mode), matching what the user will see.
|
|
50
|
+
*/
|
|
51
|
+
export declare function countSummaryChanges(summary: Record<string, {
|
|
52
|
+
created: number;
|
|
53
|
+
deleted: number;
|
|
54
|
+
truncated: number;
|
|
55
|
+
updated: number;
|
|
56
|
+
}>, shouldDelete: boolean): number;
|
|
40
57
|
/**
|
|
41
58
|
* Recursively collect all .xs files from a directory, sorted for deterministic ordering.
|
|
42
59
|
*/
|
|
@@ -55,6 +72,10 @@ export declare function readDocuments(files: string[]): Array<{
|
|
|
55
72
|
}>;
|
|
56
73
|
export declare function renderBadReferences(badRefs: BadReference[], log: (msg: string) => void): void;
|
|
57
74
|
export declare function renderBadIndexes(badIndexes: BadIndex[], log: (msg: string) => void): void;
|
|
75
|
+
export declare function findLocalWorkspaceName(entries: Array<{
|
|
76
|
+
content: string;
|
|
77
|
+
filePath: string;
|
|
78
|
+
}>): null | string;
|
|
58
79
|
export declare function confirm(message: string): Promise<boolean>;
|
|
59
80
|
/**
|
|
60
81
|
* Execute a multidoc push with preview, validation, partial mode, and GUID sync.
|