@statechange/xano-cli 0.2.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.
Files changed (72) hide show
  1. package/README.md +251 -0
  2. package/dist/auth.d.ts +22 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +94 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/commands/audit.d.ts +6 -0
  7. package/dist/commands/audit.d.ts.map +1 -0
  8. package/dist/commands/audit.js +316 -0
  9. package/dist/commands/audit.js.map +1 -0
  10. package/dist/commands/auth.d.ts +6 -0
  11. package/dist/commands/auth.d.ts.map +1 -0
  12. package/dist/commands/auth.js +179 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/health.d.ts +6 -0
  15. package/dist/commands/health.d.ts.map +1 -0
  16. package/dist/commands/health.js +115 -0
  17. package/dist/commands/health.js.map +1 -0
  18. package/dist/commands/history.d.ts +6 -0
  19. package/dist/commands/history.d.ts.map +1 -0
  20. package/dist/commands/history.js +250 -0
  21. package/dist/commands/history.js.map +1 -0
  22. package/dist/commands/inventory.d.ts +6 -0
  23. package/dist/commands/inventory.d.ts.map +1 -0
  24. package/dist/commands/inventory.js +282 -0
  25. package/dist/commands/inventory.js.map +1 -0
  26. package/dist/commands/logs.d.ts +6 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +411 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/performance.d.ts +6 -0
  31. package/dist/commands/performance.d.ts.map +1 -0
  32. package/dist/commands/performance.js +520 -0
  33. package/dist/commands/performance.js.map +1 -0
  34. package/dist/commands/secure.d.ts +6 -0
  35. package/dist/commands/secure.d.ts.map +1 -0
  36. package/dist/commands/secure.js +52 -0
  37. package/dist/commands/secure.js.map +1 -0
  38. package/dist/commands/xanoscript.d.ts +6 -0
  39. package/dist/commands/xanoscript.d.ts.map +1 -0
  40. package/dist/commands/xanoscript.js +216 -0
  41. package/dist/commands/xanoscript.js.map +1 -0
  42. package/dist/commands/xray.d.ts +6 -0
  43. package/dist/commands/xray.d.ts.map +1 -0
  44. package/dist/commands/xray.js +194 -0
  45. package/dist/commands/xray.js.map +1 -0
  46. package/dist/format.d.ts +10 -0
  47. package/dist/format.d.ts.map +1 -0
  48. package/dist/format.js +59 -0
  49. package/dist/format.js.map +1 -0
  50. package/dist/index.d.ts +7 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +43 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/performance/load-analysis.d.ts +33 -0
  55. package/dist/performance/load-analysis.d.ts.map +1 -0
  56. package/dist/performance/load-analysis.js +290 -0
  57. package/dist/performance/load-analysis.js.map +1 -0
  58. package/dist/performance/stack-rollup.d.ts +57 -0
  59. package/dist/performance/stack-rollup.d.ts.map +1 -0
  60. package/dist/performance/stack-rollup.js +108 -0
  61. package/dist/performance/stack-rollup.js.map +1 -0
  62. package/dist/registry-client.d.ts +81 -0
  63. package/dist/registry-client.d.ts.map +1 -0
  64. package/dist/registry-client.js +333 -0
  65. package/dist/registry-client.js.map +1 -0
  66. package/dist/xano-client.d.ts +103 -0
  67. package/dist/xano-client.d.ts.map +1 -0
  68. package/dist/xano-client.js +399 -0
  69. package/dist/xano-client.js.map +1 -0
  70. package/package.json +49 -0
  71. package/skills/performance-analysis/SKILL.md +135 -0
  72. package/skills/xano-cli/SKILL.md +158 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Audit CLI Commands
3
+ */
4
+ import { analyzeAPI } from "@statechange/xano-xray";
5
+ import { makeClient } from "../registry-client.js";
6
+ import { FORMAT_HELP, parseFormat, outputFormatted } from "../format.js";
7
+ const stdOptions = (cmd) => cmd
8
+ .option("--instance <instance>", "Xano instance (e.g., xq1a-abcd-1234.xano.io)")
9
+ .option("--workspace <workspace>", "Workspace ID")
10
+ .option("--branch <branch>", "Branch ID", "0")
11
+ .option("--token <token>", "Xano API token")
12
+ .option("--api-key <key>", "StateChange API key (overrides saved key)")
13
+ .option("--format <format>", FORMAT_HELP, "table");
14
+ export function createAuditCommand(program) {
15
+ const audit = program.command("audit").description("Audit commands");
16
+ stdOptions(audit
17
+ .command("workspace")
18
+ .description("Audit workspace for issues")).action(async (options) => {
19
+ try {
20
+ const { client, workspace, branchId } = await makeClient(options);
21
+ const format = parseFormat(options.format);
22
+ const log = format === "table" ? console.log.bind(console) : console.error.bind(console);
23
+ log(`Auditing workspace ${workspace}...\n`);
24
+ const { apps, queries } = await client.getAPIAppsAndQueries(workspace, branchId);
25
+ log(`Found ${apps.length} apps and ${queries.length} queries\n`);
26
+ const errors = [];
27
+ const warnings = [];
28
+ for (const app of apps) {
29
+ const analysis = analyzeAPI(app);
30
+ analysis.errors.forEach((error) => errors.push({ app, error }));
31
+ analysis.warnings.forEach((warning) => warnings.push({ app, warning }));
32
+ }
33
+ if (outputFormatted(format, {
34
+ workspace_id: workspace,
35
+ apps_scanned: apps.length,
36
+ endpoints_scanned: queries.length,
37
+ errors: errors.map(({ app, error }) => ({
38
+ app_id: app.id,
39
+ app_name: app.name,
40
+ description: error.description,
41
+ })),
42
+ warnings: warnings.map(({ app, warning }) => ({
43
+ app_id: app.id,
44
+ app_name: app.name,
45
+ description: warning.description,
46
+ })),
47
+ }))
48
+ return;
49
+ if (errors.length > 0) {
50
+ console.log("Errors found:\n");
51
+ errors.forEach(({ app, error }) => {
52
+ console.log(` App: ${app.name} (ID: ${app.id})`);
53
+ console.log(` ${error.description}\n`);
54
+ });
55
+ }
56
+ if (warnings.length > 0) {
57
+ console.log("Warnings found:\n");
58
+ warnings.forEach(({ app, warning }) => {
59
+ console.log(` App: ${app.name} (ID: ${app.id})`);
60
+ console.log(` ${warning.description}\n`);
61
+ });
62
+ }
63
+ if (errors.length === 0 && warnings.length === 0) {
64
+ console.log("No issues found!");
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error("Error:", error.message);
69
+ process.exit(1);
70
+ }
71
+ });
72
+ stdOptions(audit
73
+ .command("swagger")
74
+ .description("List apps with unsecured (public) Swagger")).action(async (options) => {
75
+ try {
76
+ const { client, workspace, branchId } = await makeClient(options);
77
+ const format = parseFormat(options.format);
78
+ const { apps } = await client.getAPIAppsAndQueries(workspace, branchId);
79
+ const unsecured = apps.filter((app) => app?.swagger && !app?.documentation?.require_token);
80
+ if (outputFormatted(format, {
81
+ total_apps: apps.length,
82
+ unsecured_swagger: unsecured.map((app) => ({
83
+ id: app.id,
84
+ name: app.name,
85
+ description: app.description || null,
86
+ })),
87
+ }))
88
+ return;
89
+ if (unsecured.length === 0) {
90
+ console.log("No unsecured Swagger apps found.");
91
+ return;
92
+ }
93
+ console.log(`Unsecured Swagger (${unsecured.length}):\n`);
94
+ unsecured.forEach((app) => {
95
+ console.log(` ${app.name} (ID: ${app.id})`);
96
+ if (app.description)
97
+ console.log(` ${app.description}`);
98
+ });
99
+ }
100
+ catch (error) {
101
+ console.error("Error:", error.message);
102
+ process.exit(1);
103
+ }
104
+ });
105
+ stdOptions(audit
106
+ .command("database")
107
+ .description("Audit database tables (sizes, schemas, indexes)")).action(async (options) => {
108
+ try {
109
+ const { client, workspace } = await makeClient(options);
110
+ const format = parseFormat(options.format);
111
+ const log = format === "table" ? console.log.bind(console) : console.error.bind(console);
112
+ log(`Auditing database tables for workspace ${workspace}...\n`);
113
+ const sinkData = await client.getWorkspaceSink(workspace);
114
+ const dbos = sinkData.dbos ?? [];
115
+ log(`Found ${dbos.length} tables\n`);
116
+ const tables = dbos.map((table) => {
117
+ const columns = table.schema?.length ?? 0;
118
+ const indexes = table.index?.length ?? 0;
119
+ return {
120
+ id: table.id,
121
+ name: table.name,
122
+ description: table.description || null,
123
+ columns,
124
+ indexes,
125
+ missing_indexes: indexes === 0 && columns > 3,
126
+ };
127
+ });
128
+ if (outputFormatted(format, {
129
+ count: dbos.length,
130
+ tables,
131
+ }))
132
+ return;
133
+ for (const t of tables) {
134
+ console.log(` ${t.name} (ID: ${t.id})`);
135
+ console.log(` Columns: ${t.columns}, Indexes: ${t.indexes}`);
136
+ if (t.missing_indexes) {
137
+ console.log(` Warning: No indexes defined on a table with ${t.columns} columns`);
138
+ }
139
+ if (t.description)
140
+ console.log(` ${t.description}`);
141
+ console.log();
142
+ }
143
+ }
144
+ catch (error) {
145
+ console.error("Error:", error.message);
146
+ process.exit(1);
147
+ }
148
+ });
149
+ stdOptions(audit
150
+ .command("middleware")
151
+ .description("List and audit middleware stacks")).action(async (options) => {
152
+ try {
153
+ const { client, workspace, branchId } = await makeClient(options);
154
+ const format = parseFormat(options.format);
155
+ const middleware = await client.getMiddleware(workspace, branchId);
156
+ if (outputFormatted(format, {
157
+ count: middleware.length,
158
+ middleware: middleware.map((mw) => ({
159
+ id: mw.id,
160
+ name: mw.name,
161
+ description: mw.description || null,
162
+ })),
163
+ }))
164
+ return;
165
+ console.log(`Middleware (${middleware.length}):\n`);
166
+ if (middleware.length === 0) {
167
+ console.log(" No middleware found.");
168
+ return;
169
+ }
170
+ for (const mw of middleware) {
171
+ console.log(` ${mw.name} (ID: ${mw.id})`);
172
+ if (mw.description)
173
+ console.log(` Description: ${mw.description}`);
174
+ }
175
+ }
176
+ catch (error) {
177
+ console.error("Error:", error.message);
178
+ process.exit(1);
179
+ }
180
+ });
181
+ stdOptions(audit
182
+ .command("addons")
183
+ .description("List and audit addons")).action(async (options) => {
184
+ try {
185
+ const { client, workspace, branchId } = await makeClient(options);
186
+ const format = parseFormat(options.format);
187
+ const addons = await client.getAddons(workspace, branchId);
188
+ if (outputFormatted(format, {
189
+ count: addons.length,
190
+ addons: addons.map((a) => ({
191
+ id: a.id,
192
+ name: a.name,
193
+ description: a.description || null,
194
+ })),
195
+ }))
196
+ return;
197
+ console.log(`Addons (${addons.length}):\n`);
198
+ if (addons.length === 0) {
199
+ console.log(" No addons found.");
200
+ return;
201
+ }
202
+ for (const addon of addons) {
203
+ console.log(` ${addon.name} (ID: ${addon.id})`);
204
+ if (addon.description)
205
+ console.log(` Description: ${addon.description}`);
206
+ }
207
+ }
208
+ catch (error) {
209
+ console.error("Error:", error.message);
210
+ process.exit(1);
211
+ }
212
+ });
213
+ stdOptions(audit
214
+ .command("tasks")
215
+ .description("Audit background tasks")).action(async (options) => {
216
+ try {
217
+ const { client, workspace, branchId } = await makeClient(options);
218
+ const format = parseFormat(options.format);
219
+ const tasks = await client.getTasks(workspace, branchId);
220
+ if (outputFormatted(format, {
221
+ count: tasks.length,
222
+ tasks: tasks.map((t) => ({
223
+ id: t.id,
224
+ name: t.name,
225
+ description: t.description || null,
226
+ schedule: t.schedule || null,
227
+ })),
228
+ }))
229
+ return;
230
+ console.log(`Background Tasks (${tasks.length}):\n`);
231
+ if (tasks.length === 0) {
232
+ console.log(" No tasks found.");
233
+ return;
234
+ }
235
+ for (const task of tasks) {
236
+ const schedule = task.schedule || "—";
237
+ console.log(` ${task.name} (ID: ${task.id})`);
238
+ console.log(` Schedule: ${schedule}`);
239
+ if (task.description)
240
+ console.log(` Description: ${task.description}`);
241
+ }
242
+ }
243
+ catch (error) {
244
+ console.error("Error:", error.message);
245
+ process.exit(1);
246
+ }
247
+ });
248
+ stdOptions(audit
249
+ .command("triggers")
250
+ .description("Audit triggers")).action(async (options) => {
251
+ try {
252
+ const { client, workspace, branchId } = await makeClient(options);
253
+ const format = parseFormat(options.format);
254
+ const triggers = await client.getTriggers(workspace, branchId);
255
+ if (outputFormatted(format, {
256
+ count: triggers.length,
257
+ triggers: triggers.map((t) => ({
258
+ id: t.id,
259
+ name: t.name,
260
+ type: t.obj_type || "unknown",
261
+ description: t.description || null,
262
+ })),
263
+ }))
264
+ return;
265
+ console.log(`Triggers (${triggers.length}):\n`);
266
+ if (triggers.length === 0) {
267
+ console.log(" No triggers found.");
268
+ return;
269
+ }
270
+ for (const trigger of triggers) {
271
+ const type = trigger.obj_type || "unknown";
272
+ console.log(` ${trigger.name} (ID: ${trigger.id}) [${type}]`);
273
+ if (trigger.description)
274
+ console.log(` Description: ${trigger.description}`);
275
+ }
276
+ }
277
+ catch (error) {
278
+ console.error("Error:", error.message);
279
+ process.exit(1);
280
+ }
281
+ });
282
+ stdOptions(audit
283
+ .command("mcp-servers")
284
+ .description("Audit MCP/toolset servers")).action(async (options) => {
285
+ try {
286
+ const { client, workspace, branchId } = await makeClient(options);
287
+ const format = parseFormat(options.format);
288
+ const servers = await client.getMCPServers(workspace, branchId);
289
+ if (outputFormatted(format, {
290
+ count: servers.length,
291
+ mcp_servers: servers.map((s) => ({
292
+ id: s.id,
293
+ name: s.name,
294
+ description: s.description || null,
295
+ })),
296
+ }))
297
+ return;
298
+ console.log(`MCP Servers (${servers.length}):\n`);
299
+ if (servers.length === 0) {
300
+ console.log(" No MCP servers found.");
301
+ return;
302
+ }
303
+ for (const server of servers) {
304
+ console.log(` ${server.name} (ID: ${server.id})`);
305
+ if (server.description)
306
+ console.log(` Description: ${server.description}`);
307
+ }
308
+ }
309
+ catch (error) {
310
+ console.error("Error:", error.message);
311
+ process.exit(1);
312
+ }
313
+ });
314
+ return audit;
315
+ }
316
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication CLI Commands
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function createAuthCommand(program: Command): Command;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,WA6KjD"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Authentication CLI Commands
3
+ */
4
+ import * as readline from "readline";
5
+ import { saveAuthToFile, loadAuthFromFile, getStateChangeApiKey, getAuthFilePath, } from "../auth.js";
6
+ import { listXanoTokens, checkTokenHealth, resolveInstance } from "../registry-client.js";
7
+ function promptForApiKey() {
8
+ return new Promise((resolve) => {
9
+ const rl = readline.createInterface({
10
+ input: process.stdin,
11
+ output: process.stdout,
12
+ });
13
+ rl.question("Enter your StateChange API key: ", (answer) => {
14
+ rl.close();
15
+ resolve(answer.trim());
16
+ });
17
+ });
18
+ }
19
+ export function createAuthCommand(program) {
20
+ const auth = program.command("auth").description("Authentication commands");
21
+ auth
22
+ .command("init")
23
+ .description("Initialize StateChange API key")
24
+ .option("--api-key <key>", "StateChange API key")
25
+ .action(async (options) => {
26
+ let apiKey = options.apiKey;
27
+ if (!apiKey) {
28
+ apiKey = await promptForApiKey();
29
+ }
30
+ if (!apiKey) {
31
+ console.error("Error: API key is required");
32
+ process.exit(1);
33
+ }
34
+ saveAuthToFile({ apiKey });
35
+ console.log(`✅ API key saved to ${getAuthFilePath()}`);
36
+ // Test the key
37
+ try {
38
+ await listXanoTokens(apiKey);
39
+ console.log("✅ API key verified successfully");
40
+ }
41
+ catch (e) {
42
+ console.warn(`⚠️ API key saved but verification failed: ${e.message}`);
43
+ console.warn(" You may need to check your API key");
44
+ }
45
+ });
46
+ auth
47
+ .command("whoami")
48
+ .description("Verify authentication and show available instances")
49
+ .option("--api-key <key>", "StateChange API key (overrides saved key)")
50
+ .action(async (options) => {
51
+ const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
52
+ if (!apiKey) {
53
+ console.error("Error: No API key found. Run 'sc-xano auth init' first.");
54
+ console.error(" Or set STATECHANGE_API_KEY environment variable");
55
+ console.error(" Or use --api-key flag");
56
+ process.exit(1);
57
+ }
58
+ const savedAuth = loadAuthFromFile();
59
+ if (savedAuth?.xanoInstance) {
60
+ console.log(` Default instance: ${savedAuth.xanoInstance}`);
61
+ }
62
+ if (savedAuth?.xanoWorkspace) {
63
+ console.log(` Default workspace: ${savedAuth.xanoWorkspace}`);
64
+ }
65
+ try {
66
+ const response = await listXanoTokens(apiKey);
67
+ const tokens = response.tokens || [];
68
+ console.log("✅ Connected to StateChange backend");
69
+ if (tokens.length === 0) {
70
+ console.log(" No Xano instances available");
71
+ }
72
+ else {
73
+ console.log(` ${tokens.length} instance(s) available:`);
74
+ tokens.forEach((token) => {
75
+ // Handle both camelCase and snake_case from backend
76
+ // The backend may return either format, so we check both
77
+ const tokenAny = token;
78
+ const instanceId = tokenAny.instanceId || tokenAny.instance_id || "unknown";
79
+ // instanceName may come as camelCase or snake_case, or may be missing entirely
80
+ const instanceName = tokenAny.instanceName || tokenAny.instance_name;
81
+ // Use instanceName if it exists and is truthy, otherwise fallback to instanceId.
82
+ // The API key is instance-and-user level, not workspace/branch scoped,
83
+ // so we intentionally do NOT surface workspace/branch here to avoid confusion.
84
+ const displayName = instanceName ? instanceName : instanceId;
85
+ console.log(` - ${displayName}`);
86
+ });
87
+ }
88
+ }
89
+ catch (e) {
90
+ console.error(`❌ Authentication failed: ${e.message}`);
91
+ if (e.message.includes("401") || e.message.includes("403")) {
92
+ console.error(" Your API key may be invalid. Run 'sc-xano auth init' to update it.");
93
+ }
94
+ process.exit(1);
95
+ }
96
+ });
97
+ auth
98
+ .command("set-instance")
99
+ .description("Save default Xano instance and workspace")
100
+ .argument("<instance>", "Xano instance hostname (e.g., xq1a-abcd-1234.xano.io)")
101
+ .option("--workspace <workspace>", "Default workspace ID")
102
+ .action(async (instance, options) => {
103
+ const existing = loadAuthFromFile();
104
+ if (!existing) {
105
+ console.error("Error: Run 'sc-xano auth init' first to set up your API key.");
106
+ process.exit(1);
107
+ }
108
+ existing.xanoInstance = instance;
109
+ if (options.workspace) {
110
+ existing.xanoWorkspace = parseInt(options.workspace);
111
+ }
112
+ saveAuthToFile(existing);
113
+ console.log(`✅ Default instance saved: ${instance}`);
114
+ if (options.workspace) {
115
+ console.log(`✅ Default workspace saved: ${options.workspace}`);
116
+ }
117
+ console.log(` Config: ${getAuthFilePath()}`);
118
+ });
119
+ auth
120
+ .command("status")
121
+ .description("Check Xano token health and session freshness")
122
+ .option("--api-key <key>", "StateChange API key (overrides saved key)")
123
+ .option("--instance <host>", "Xano instance hostname")
124
+ .action(async (options) => {
125
+ const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
126
+ if (!apiKey) {
127
+ console.error("Error: No API key found. Run 'sc-xano auth init' first.");
128
+ process.exit(1);
129
+ }
130
+ try {
131
+ const response = await listXanoTokens(apiKey);
132
+ const tokens = response.tokens || [];
133
+ if (tokens.length === 0) {
134
+ console.log("No Xano tokens found.");
135
+ console.log("Open your Xano workspace with the StateChange extension to create one.");
136
+ return;
137
+ }
138
+ // If instance specified, filter to that one
139
+ const instance = options.instance || (await resolveInstance({ apiKey: options.apiKey }));
140
+ const filtered = instance
141
+ ? tokens.filter((t) => (t.instanceId || t.instance_id) === instance)
142
+ : tokens;
143
+ const toShow = filtered.length > 0 ? filtered : tokens;
144
+ for (const token of toShow) {
145
+ const health = checkTokenHealth(token);
146
+ const id = token.instanceId || token.instance_id || "unknown";
147
+ const name = token.instanceName || token.instance_name;
148
+ const wsId = token.workspaceId || token.workspace_id;
149
+ console.log(`Instance: ${name || id}`);
150
+ if (wsId)
151
+ console.log(` Workspace: ${wsId}`);
152
+ const statusIcon = health.status === "fresh" ? "✅" :
153
+ health.status === "stale" ? "⚠️ " :
154
+ health.status === "expired" ? "❌" : "❓";
155
+ console.log(` Token status: ${statusIcon} ${health.status}`);
156
+ console.log(` Age: ${health.ageHours} hours`);
157
+ if (health.status === "fresh") {
158
+ console.log(` Expires in: ${health.remainingHours} hours`);
159
+ }
160
+ else if (health.status === "stale") {
161
+ console.log(` ${health.message}`);
162
+ console.log(` Open Xano with the StateChange extension to refresh.`);
163
+ }
164
+ else if (health.status === "expired") {
165
+ console.log(` ${health.message}`);
166
+ console.log(` Open your Xano workspace to refresh:`);
167
+ console.log(` https://app.xano.com`);
168
+ }
169
+ console.log("");
170
+ }
171
+ }
172
+ catch (e) {
173
+ console.error(`Error: ${e.message}`);
174
+ process.exit(1);
175
+ }
176
+ });
177
+ return auth;
178
+ }
179
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1F,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,MAAM,EAAE,EAAE;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE5E,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,eAAe,EAAE,EAAE,CAAC,CAAC;QACvD,eAAe;QACf,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,IAAI,SAAS,EAAE,YAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAC;gBAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACvB,oDAAoD;oBACpD,yDAAyD;oBACzD,MAAM,QAAQ,GAAG,KAAY,CAAC;oBAC9B,MAAM,UAAU,GACd,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC;oBAC3D,+EAA+E;oBAC/E,MAAM,YAAY,GAChB,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,aAAa,CAAC;oBAClD,iFAAiF;oBACjF,uEAAuE;oBACvE,+EAA+E;oBAC/E,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;oBAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,KAAK,CACX,uEAAuE,CACxE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,YAAY,EAAE,uDAAuD,CAAC;SAC/E,MAAM,CAAC,yBAAyB,EAAE,sBAAsB,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC;QACjC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACrD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,cAAc,eAAe,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YAErC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,QAAQ;gBACvB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC;gBACzE,CAAC,CAAC,MAAM,CAAC;YAEX,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAEvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,EAAE,GAAI,KAAa,CAAC,UAAU,IAAK,KAAa,CAAC,WAAW,IAAI,SAAS,CAAC;gBAChF,MAAM,IAAI,GAAI,KAAa,CAAC,YAAY,IAAK,KAAa,CAAC,aAAa,CAAC;gBACzE,MAAM,IAAI,GAAI,KAAa,CAAC,WAAW,IAAK,KAAa,CAAC,YAAY,CAAC;gBAEvE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;gBAE9C,MAAM,UAAU,GACd,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACjC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACnC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAE1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC;gBAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,cAAc,QAAQ,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACxE,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Health CLI Commands — Instance health & database management via api:master
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function createHealthCommand(program: Command): Command;
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,WAqGnD"}