@objectstack/cli 4.0.5 → 4.1.1

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 (67) hide show
  1. package/README.md +32 -0
  2. package/dist/commands/cloud/login.d.ts +16 -0
  3. package/dist/commands/cloud/login.d.ts.map +1 -0
  4. package/dist/commands/cloud/login.js +166 -0
  5. package/dist/commands/cloud/login.js.map +1 -0
  6. package/dist/commands/cloud/logout.d.ts +15 -0
  7. package/dist/commands/cloud/logout.d.ts.map +1 -0
  8. package/dist/commands/cloud/logout.js +51 -0
  9. package/dist/commands/cloud/logout.js.map +1 -0
  10. package/dist/commands/cloud/whoami.d.ts +15 -0
  11. package/dist/commands/cloud/whoami.d.ts.map +1 -0
  12. package/dist/commands/cloud/whoami.js +81 -0
  13. package/dist/commands/cloud/whoami.js.map +1 -0
  14. package/dist/commands/dev.d.ts +6 -0
  15. package/dist/commands/dev.d.ts.map +1 -1
  16. package/dist/commands/dev.js +79 -14
  17. package/dist/commands/dev.js.map +1 -1
  18. package/dist/commands/i18n/extract.d.ts +28 -0
  19. package/dist/commands/i18n/extract.d.ts.map +1 -0
  20. package/dist/commands/i18n/extract.js +148 -0
  21. package/dist/commands/i18n/extract.js.map +1 -0
  22. package/dist/commands/login.js +2 -2
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/package/publish.d.ts +32 -0
  25. package/dist/commands/package/publish.d.ts.map +1 -0
  26. package/dist/commands/package/publish.js +324 -0
  27. package/dist/commands/package/publish.js.map +1 -0
  28. package/dist/commands/publish.d.ts +3 -0
  29. package/dist/commands/publish.d.ts.map +1 -1
  30. package/dist/commands/publish.js +55 -11
  31. package/dist/commands/publish.js.map +1 -1
  32. package/dist/commands/rollback.d.ts +13 -0
  33. package/dist/commands/rollback.d.ts.map +1 -0
  34. package/dist/commands/rollback.js +77 -0
  35. package/dist/commands/rollback.js.map +1 -0
  36. package/dist/commands/serve.d.ts +14 -0
  37. package/dist/commands/serve.d.ts.map +1 -1
  38. package/dist/commands/serve.js +583 -30
  39. package/dist/commands/serve.js.map +1 -1
  40. package/dist/commands/start.d.ts +8 -1
  41. package/dist/commands/start.d.ts.map +1 -1
  42. package/dist/commands/start.js +80 -11
  43. package/dist/commands/start.js.map +1 -1
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/utils/auth-flows.d.ts +31 -0
  49. package/dist/utils/auth-flows.d.ts.map +1 -0
  50. package/dist/utils/auth-flows.js +151 -0
  51. package/dist/utils/auth-flows.js.map +1 -0
  52. package/dist/utils/cloud-config.d.ts +24 -0
  53. package/dist/utils/cloud-config.d.ts.map +1 -0
  54. package/dist/utils/cloud-config.js +75 -0
  55. package/dist/utils/cloud-config.js.map +1 -0
  56. package/dist/utils/console.d.ts +1 -0
  57. package/dist/utils/console.d.ts.map +1 -1
  58. package/dist/utils/console.js +7 -4
  59. package/dist/utils/console.js.map +1 -1
  60. package/dist/utils/i18n-extract.d.ts +102 -0
  61. package/dist/utils/i18n-extract.d.ts.map +1 -0
  62. package/dist/utils/i18n-extract.js +332 -0
  63. package/dist/utils/i18n-extract.js.map +1 -0
  64. package/dist/utils/studio.d.ts.map +1 -1
  65. package/dist/utils/studio.js +5 -6
  66. package/dist/utils/studio.js.map +1 -1
  67. package/package.json +40 -36
package/README.md CHANGED
@@ -254,6 +254,38 @@ os projects bind <id> --artifact dist/objectstack.json # 8. Bind to a Cloud Pro
254
254
  └── package.json # oclif config under "oclif" key
255
255
  ```
256
256
 
257
+
258
+ ## Default capability slate (always-on)
259
+
260
+ `objectstack serve` (and `os dev`) auto-mount a baseline slate of
261
+ service plugins for every preset **except** `--preset minimal`:
262
+
263
+ | Capability | Plugin | Why default |
264
+ |-------------|------------------------------|--------------------------------------------------------------|
265
+ | `queue` | `QueueServicePlugin` | Background retries (mail, audit batching) need a queue. |
266
+ | `job` | `JobServicePlugin` | Scheduled jobs (cleanup, reports, cron). |
267
+ | `cache` | `CacheServicePlugin` | In-memory adapter; performance baseline. |
268
+ | `settings` | `SettingsServicePlugin` | Mail / storage / branding / feature-flag UI + persistence. |
269
+ | `email` | `EmailServicePlugin` | Auth callbacks (verify, reset, magic-link) hard-depend. |
270
+ | `storage` | `StorageServicePlugin` | Avatars, attachments, exports. Local fallback in dev. |
271
+
272
+ Apps no longer need to list these in `requires: [...]`.
273
+
274
+ **Opt-out:** run `objectstack serve --preset minimal` to skip the slate
275
+ and only load core + your explicit `requires`.
276
+
277
+ **Built-in Settings manifests:** `mail`, `storage`, `branding`,
278
+ `feature_flags` are pre-registered. Both `mail` and `storage` expose a
279
+ "Test connection" action that exercises the live transport / adapter
280
+ end-to-end. Switching the storage adapter does **not** migrate
281
+ previously uploaded files — the plugin logs a warning on every swap.
282
+
283
+ **Storage warning:** when no `storage:` block is configured the plugin
284
+ falls back to the local driver under `.objectstack/data/uploads/`. In
285
+ non-dev mode a single `console.warn` fires at boot — switch to S3/GCS/
286
+ Azure for production by setting `config.storage`, `OS_STORAGE_*` env,
287
+ or via the Settings hub (`namespace=storage`).
288
+
257
289
  ## License
258
290
 
259
291
  Apache-2.0
@@ -0,0 +1,16 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class CloudLogin extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ url: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'no-browser': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ private fallbackPasswordPrompt;
15
+ }
16
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/login.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAoD7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,OAAgB,WAAW,SACgG;IAE3H,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,KAAK;;;;;;;MAmBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAqEZ,sBAAsB;CAQrC"}
@@ -0,0 +1,166 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * `objectstack cloud login` — authenticate against the ObjectStack Cloud
4
+ * package registry (`https://cloud.objectos.app` by default).
5
+ *
6
+ * This is distinct from `os login`, which authenticates against your
7
+ * *runtime* ObjectOS instance. Cloud credentials are persisted to
8
+ * `~/.objectstack/cloud.json` and consumed by `os package publish`,
9
+ * `os package install`, and any future marketplace commands.
10
+ */
11
+ import * as readline from 'node:readline/promises';
12
+ import { stdin as input, stdout as output } from 'node:process';
13
+ import { Command, Flags } from '@oclif/core';
14
+ import { printHeader, printKV, printSuccess, printError } from '../../utils/format.js';
15
+ import { loginWithBrowser, loginWithPassword } from '../../utils/auth-flows.js';
16
+ import { DEFAULT_CLOUD_URL, readCloudConfig, writeCloudConfig } from '../../utils/cloud-config.js';
17
+ async function promptPassword(promptText) {
18
+ if (!process.stdin.isTTY) {
19
+ const rl = readline.createInterface({ input, output });
20
+ const answer = await rl.question(promptText);
21
+ rl.close();
22
+ return answer;
23
+ }
24
+ return new Promise((resolve) => {
25
+ const chars = [];
26
+ process.stdout.write(promptText);
27
+ process.stdin.setRawMode(true);
28
+ process.stdin.resume();
29
+ process.stdin.setEncoding('utf8');
30
+ const cleanup = () => {
31
+ process.stdin.setRawMode(false);
32
+ process.stdin.pause();
33
+ process.stdin.removeListener('data', handler);
34
+ process.stdout.write('\n');
35
+ };
36
+ const handler = (char) => {
37
+ switch (char) {
38
+ case '\u0003':
39
+ cleanup();
40
+ process.kill(process.pid, 'SIGINT');
41
+ break;
42
+ case '\r':
43
+ case '\n':
44
+ cleanup();
45
+ resolve(chars.join(''));
46
+ break;
47
+ case '\u007f':
48
+ if (chars.length > 0) {
49
+ chars.pop();
50
+ process.stdout.clearLine(0);
51
+ process.stdout.cursorTo(0);
52
+ process.stdout.write(promptText + '*'.repeat(chars.length));
53
+ }
54
+ break;
55
+ default:
56
+ chars.push(char);
57
+ process.stdout.write('*');
58
+ }
59
+ };
60
+ process.stdin.on('data', handler);
61
+ });
62
+ }
63
+ export default class CloudLogin extends Command {
64
+ static description = 'Authenticate against ObjectStack Cloud (the hosted package registry). Stores credentials in ~/.objectstack/cloud.json.';
65
+ static examples = [
66
+ '$ os cloud login',
67
+ '$ os cloud login --email me@acme.com --password secret',
68
+ '$ os cloud login --no-browser',
69
+ '$ os cloud login --url https://cloud.objectos.app # default',
70
+ ];
71
+ static flags = {
72
+ url: Flags.string({
73
+ char: 'u',
74
+ description: 'ObjectStack Cloud URL (override for self-hosted control planes)',
75
+ default: DEFAULT_CLOUD_URL,
76
+ env: 'OS_CLOUD_URL',
77
+ }),
78
+ email: Flags.string({ char: 'e', description: 'Email address (skips browser flow)' }),
79
+ password: Flags.string({ char: 'p', description: 'Password (skips browser flow)' }),
80
+ 'no-browser': Flags.boolean({
81
+ description: 'Print the verification URL without opening a browser',
82
+ default: false,
83
+ }),
84
+ force: Flags.boolean({
85
+ char: 'f',
86
+ description: 'Re-authenticate even if cloud credentials already exist',
87
+ default: false,
88
+ }),
89
+ json: Flags.boolean({ description: 'Output as JSON' }),
90
+ };
91
+ async run() {
92
+ const { flags } = await this.parse(CloudLogin);
93
+ try {
94
+ if (!flags.force) {
95
+ try {
96
+ const existing = await readCloudConfig();
97
+ if (existing?.token) {
98
+ if (flags.json) {
99
+ console.log(JSON.stringify({ success: false, error: 'Already logged in', email: existing.email, url: existing.url }));
100
+ }
101
+ else {
102
+ printSuccess(`Already logged in to ${existing.url} as ${existing.email || existing.userId}`);
103
+ console.log('');
104
+ console.log(' Run `os cloud logout` to switch accounts, or use --force to re-authenticate.');
105
+ console.log('');
106
+ }
107
+ return;
108
+ }
109
+ }
110
+ catch {
111
+ // No stored credentials — proceed
112
+ }
113
+ }
114
+ const url = flags.url.replace(/\/+$/, '');
115
+ if (!flags.json) {
116
+ printHeader('ObjectStack Cloud Login');
117
+ printKV('Server', url);
118
+ console.log('');
119
+ }
120
+ const result = flags.email && flags.password
121
+ ? await loginWithPassword(url, flags.email, flags.password)
122
+ : process.stdin.isTTY && !flags.email && !flags.password
123
+ ? await loginWithBrowser(url, { noBrowser: flags['no-browser'], silent: flags.json })
124
+ : await this.fallbackPasswordPrompt(url, flags.email);
125
+ await writeCloudConfig({
126
+ url,
127
+ token: result.token,
128
+ email: result.user?.email,
129
+ userId: result.user?.id,
130
+ createdAt: new Date().toISOString(),
131
+ });
132
+ if (flags.json) {
133
+ console.log(JSON.stringify({ success: true, email: result.user?.email, userId: result.user?.id, url }, null, 2));
134
+ }
135
+ else {
136
+ printSuccess('Cloud authentication successful');
137
+ if (result.user?.email)
138
+ printKV('Email', result.user.email);
139
+ if (result.user?.id)
140
+ printKV('User ID', result.user.id);
141
+ console.log('');
142
+ console.log(' Credentials stored in ~/.objectstack/cloud.json');
143
+ console.log(' Next: `os package publish` to push a package, `os cloud whoami` to verify.');
144
+ console.log('');
145
+ }
146
+ }
147
+ catch (error) {
148
+ if (flags.json) {
149
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
150
+ this.exit(1);
151
+ }
152
+ printError(error.message || String(error));
153
+ this.exit(1);
154
+ }
155
+ }
156
+ async fallbackPasswordPrompt(url, providedEmail) {
157
+ const rl = readline.createInterface({ input, output });
158
+ const email = providedEmail ?? (await rl.question('Email: '));
159
+ rl.close();
160
+ const password = await promptPassword('Password: ');
161
+ if (!email || !password)
162
+ throw new Error('Email and password are required');
163
+ return loginWithPassword(url, email, password);
164
+ }
165
+ }
166
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/cloud/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `objectstack cloud logout` — clear cloud credentials from
3
+ * ~/.objectstack/cloud.json (and best-effort revoke the session on the
4
+ * cloud control plane).
5
+ */
6
+ import { Command } from '@oclif/core';
7
+ export default class CloudLogout extends Command {
8
+ static description: string;
9
+ static examples: string[];
10
+ static flags: {
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/logout.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC3B"}
@@ -0,0 +1,51 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * `objectstack cloud logout` — clear cloud credentials from
4
+ * ~/.objectstack/cloud.json (and best-effort revoke the session on the
5
+ * cloud control plane).
6
+ */
7
+ import { Command, Flags } from '@oclif/core';
8
+ import { ObjectStackClient } from '@objectstack/client';
9
+ import { printHeader, printSuccess, printError } from '../../utils/format.js';
10
+ import { deleteCloudConfig, tryReadCloudConfig } from '../../utils/cloud-config.js';
11
+ export default class CloudLogout extends Command {
12
+ static description = 'Clear stored ObjectStack Cloud credentials';
13
+ static examples = ['$ os cloud logout'];
14
+ static flags = {
15
+ json: Flags.boolean({ description: 'Output as JSON' }),
16
+ };
17
+ async run() {
18
+ const { flags } = await this.parse(CloudLogout);
19
+ try {
20
+ if (!flags.json)
21
+ printHeader('ObjectStack Cloud Logout');
22
+ const config = await tryReadCloudConfig();
23
+ if (config?.token && config?.url) {
24
+ try {
25
+ const client = new ObjectStackClient({ baseUrl: config.url, token: config.token });
26
+ await client.auth.logout();
27
+ }
28
+ catch {
29
+ // Best-effort
30
+ }
31
+ }
32
+ await deleteCloudConfig();
33
+ if (flags.json) {
34
+ console.log(JSON.stringify({ success: true, message: 'Cloud credentials cleared' }, null, 2));
35
+ }
36
+ else {
37
+ printSuccess('Cloud credentials cleared');
38
+ console.log('');
39
+ }
40
+ }
41
+ catch (error) {
42
+ if (flags.json) {
43
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
44
+ this.exit(1);
45
+ }
46
+ printError(error.message || String(error));
47
+ this.exit(1);
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/cloud/logout.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAU,WAAW,GAAG,4CAA4C,CAAC;IAE3E,MAAM,CAAU,QAAQ,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjD,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;KACvD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC1C,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBACnF,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc;gBAChB,CAAC;YACH,CAAC;YAED,MAAM,iBAAiB,EAAE,CAAC;YAE1B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `objectstack cloud whoami` — display the active ObjectStack Cloud
3
+ * identity (read from ~/.objectstack/cloud.json) and verify the token
4
+ * with a /get-session call against the cloud control plane.
5
+ */
6
+ import { Command } from '@oclif/core';
7
+ export default class CloudWhoami extends Command {
8
+ static description: string;
9
+ static examples: string[];
10
+ static flags: {
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/whoami.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2D3B"}
@@ -0,0 +1,81 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * `objectstack cloud whoami` — display the active ObjectStack Cloud
4
+ * identity (read from ~/.objectstack/cloud.json) and verify the token
5
+ * with a /get-session call against the cloud control plane.
6
+ */
7
+ import { Command, Flags } from '@oclif/core';
8
+ import { printHeader, printKV, printSuccess, printError } from '../../utils/format.js';
9
+ import { tryReadCloudConfig } from '../../utils/cloud-config.js';
10
+ export default class CloudWhoami extends Command {
11
+ static description = 'Show the active ObjectStack Cloud identity';
12
+ static examples = ['$ os cloud whoami'];
13
+ static flags = {
14
+ json: Flags.boolean({ description: 'Output as JSON' }),
15
+ };
16
+ async run() {
17
+ const { flags } = await this.parse(CloudWhoami);
18
+ try {
19
+ const config = await tryReadCloudConfig();
20
+ if (!config?.token) {
21
+ if (flags.json) {
22
+ console.log(JSON.stringify({ logged_in: false }, null, 2));
23
+ }
24
+ else {
25
+ printError('Not logged in to ObjectStack Cloud. Run `os cloud login` first.');
26
+ }
27
+ this.exit(1);
28
+ return;
29
+ }
30
+ // Verify token with /get-session
31
+ let sessionUser;
32
+ try {
33
+ const res = await globalThis.fetch(`${config.url}/api/v1/auth/get-session`, {
34
+ headers: { Authorization: `Bearer ${config.token}` },
35
+ });
36
+ if (res.ok) {
37
+ const data = (await res.json());
38
+ const u = data?.user ?? data?.data?.user;
39
+ if (u)
40
+ sessionUser = { id: u.id, email: u.email };
41
+ }
42
+ }
43
+ catch {
44
+ // Network failure — fall through to local-only view
45
+ }
46
+ const email = sessionUser?.email ?? config.email;
47
+ const userId = sessionUser?.id ?? config.userId;
48
+ const valid = !!sessionUser;
49
+ if (flags.json) {
50
+ console.log(JSON.stringify({ logged_in: true, valid, url: config.url, email, userId }, null, 2));
51
+ }
52
+ else {
53
+ printHeader('ObjectStack Cloud Identity');
54
+ printKV('Server', config.url);
55
+ if (email)
56
+ printKV('Email', email);
57
+ if (userId)
58
+ printKV('User ID', userId);
59
+ if (config.activeOrgId)
60
+ printKV('Org', config.activeOrgId);
61
+ console.log('');
62
+ if (valid) {
63
+ printSuccess('Session valid');
64
+ }
65
+ else {
66
+ printError('Could not verify session with cloud. Token may be expired — try `os cloud login --force`.');
67
+ }
68
+ console.log('');
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (flags.json) {
73
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
74
+ this.exit(1);
75
+ }
76
+ printError(error.message || String(error));
77
+ this.exit(1);
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/cloud/whoami.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,12 @@ export default class Dev extends Command {
11
11
  port: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
12
  preset: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
13
  compile: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ artifact: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'project-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ database: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ 'database-driver': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'database-auth-token': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'auth-secret': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
20
  };
15
21
  run(): Promise<void>;
16
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;MAanB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsF3B"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;MAwCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqH3B"}
@@ -19,10 +19,36 @@ export default class Dev extends Command {
19
19
  description: 'Plugin tier preset forwarded to `serve`: minimal | default | full',
20
20
  }),
21
21
  compile: Flags.boolean({
22
- description: 'Compile objectstack.config.ts to dist/objectstack.json before starting (auto if artifact missing)',
22
+ description: 'Compile objectstack.config.ts to dist/objectstack.json before starting (auto if artifact missing). Ignored when --artifact is set.',
23
23
  default: false,
24
24
  allowNo: true,
25
25
  }),
26
+ // ── Runtime overrides (mirror `os start`) ────────────────────────
27
+ // These let `os dev` consume a pre-built artifact and arbitrary
28
+ // storage/auth without an `objectstack.config.ts` in the cwd. When
29
+ // `--artifact` is set the auto-compile path is skipped — there's no
30
+ // source to compile from. All flags override the matching env var.
31
+ artifact: Flags.string({
32
+ char: 'a',
33
+ description: 'Path or http(s):// URL to a compiled objectstack.json (skips auto-compile; overrides $OS_ARTIFACT_PATH)',
34
+ }),
35
+ 'project-id': Flags.string({
36
+ description: 'Project identifier (overrides $OS_PROJECT_ID, default proj_local)',
37
+ }),
38
+ database: Flags.string({
39
+ char: 'd',
40
+ description: 'Database URL: file:./db.sqlite | libsql://... | postgres://... | mongodb://... | memory:// (overrides $OS_DATABASE_URL)',
41
+ }),
42
+ 'database-driver': Flags.string({
43
+ description: 'Force driver kind: sqlite | turso | postgres | mongodb | memory (overrides $OS_DATABASE_DRIVER)',
44
+ options: ['sqlite', 'turso', 'postgres', 'mongodb', 'memory'],
45
+ }),
46
+ 'database-auth-token': Flags.string({
47
+ description: 'Auth token for libsql/Turso connections (overrides $OS_DATABASE_AUTH_TOKEN / $TURSO_AUTH_TOKEN)',
48
+ }),
49
+ 'auth-secret': Flags.string({
50
+ description: 'Secret for @objectstack/plugin-auth (overrides $AUTH_SECRET; dev mode injects an insecure default if neither is set)',
51
+ }),
26
52
  };
27
53
  async run() {
28
54
  const { args, flags } = await this.parse(Dev);
@@ -30,13 +56,30 @@ export default class Dev extends Command {
30
56
  printHeader('Development Mode');
31
57
  // ── Single-Project Mode ──────────────────────────────────────────────────
32
58
  const configPath = path.resolve(process.cwd(), 'objectstack.config.ts');
33
- if (packageName === 'all' && fs.existsSync(configPath)) {
34
- printKV('Config', configPath, '📂');
35
- const artifactPath = process.env.OS_ARTIFACT_PATH
36
- ?? path.resolve(process.cwd(), 'dist/objectstack.json');
37
- // Auto-compile when artifact is missing or --compile is explicitly requested.
38
- const needsCompile = flags.compile || !fs.existsSync(artifactPath);
59
+ const configExists = fs.existsSync(configPath);
60
+ // `--artifact` lets `os dev` boot a pre-built artifact without any
61
+ // local config — semantically the same as `os start` but with the
62
+ // dev conveniences (NODE_ENV=development, dev-fallback AUTH_SECRET,
63
+ // --ui default-on, dev-mode error formatting).
64
+ const isUrl = !!flags.artifact && /^https?:\/\//i.test(flags.artifact);
65
+ const inferredArtifact = flags.artifact
66
+ ?? process.env.OS_ARTIFACT_PATH
67
+ ?? path.resolve(process.cwd(), 'dist/objectstack.json');
68
+ const artifactPath = isUrl ? flags.artifact : path.resolve(process.cwd(), inferredArtifact);
69
+ const useArtifactDirect = !!flags.artifact || !configExists;
70
+ if (packageName === 'all' && (configExists || flags.artifact)) {
71
+ if (configExists && !flags.artifact) {
72
+ printKV('Config', configPath, '📂');
73
+ }
74
+ // Auto-compile only when we have a config AND no explicit artifact.
75
+ // Explicit `--artifact` means "use this, don't rebuild".
76
+ const needsCompile = !flags.artifact && (flags.compile || !fs.existsSync(artifactPath));
39
77
  if (needsCompile) {
78
+ if (!configExists) {
79
+ printError('No objectstack.config.ts and no --artifact given — nothing to start.');
80
+ console.error(chalk.yellow(' Run `objectstack init`, `objectstack build`, or pass `--artifact <path|url>`.'));
81
+ process.exit(1);
82
+ }
40
83
  printStep('Compiling objectstack.config.ts → dist/objectstack.json...');
41
84
  const binPath = process.argv[1];
42
85
  const compileResult = spawnSync(process.execPath, [binPath, 'compile', '--output', artifactPath], { stdio: 'inherit', env: { ...process.env, NODE_ENV: 'development' } });
@@ -46,15 +89,29 @@ export default class Dev extends Command {
46
89
  }
47
90
  }
48
91
  printStep('Starting dev server (local mode)...');
92
+ const projectId = flags['project-id'] ?? process.env.OS_PROJECT_ID ?? 'proj_local';
93
+ // NOTE: Do NOT set NODE_ENV='development' here. Oclif's tsx-based
94
+ // TypeScript source loader (activated when NODE_ENV is 'test' or
95
+ // 'development') currently mis-handles `.json` requires inside
96
+ // CommonJS deps (e.g. dotenv's `require('../package.json')` is
97
+ // transformed as JS, then JSON.parse fails) — which causes the
98
+ // child process to report `command serve not found`. The `--dev`
99
+ // flag below already opts the serve command into dev semantics,
100
+ // and serve.ts will set NODE_ENV='development' internally before
101
+ // any runtime modules are imported.
49
102
  const localEnv = {
50
103
  ...process.env,
51
- NODE_ENV: 'development',
52
- // Defaults for local mode — user's .env / existing env takes precedence.
53
- OS_PROJECT_ID: process.env.OS_PROJECT_ID ?? 'proj_local',
54
- OS_ARTIFACT_PATH: process.env.OS_ARTIFACT_PATH ?? artifactPath,
104
+ OS_PROJECT_ID: projectId,
105
+ OS_ARTIFACT_PATH: artifactPath,
106
+ ...(flags.database ? { OS_DATABASE_URL: flags.database } : {}),
107
+ ...(flags['database-driver'] ? { OS_DATABASE_DRIVER: flags['database-driver'] } : {}),
108
+ ...(flags['database-auth-token'] ? { OS_DATABASE_AUTH_TOKEN: flags['database-auth-token'] } : {}),
109
+ ...(flags['auth-secret'] ? { AUTH_SECRET: flags['auth-secret'] } : {}),
55
110
  };
56
- printKV('Project ID', localEnv.OS_PROJECT_ID, '🎯');
57
- printKV('Artifact', path.relative(process.cwd(), localEnv.OS_ARTIFACT_PATH), '📦');
111
+ printKV('Project ID', projectId, '🎯');
112
+ printKV('Artifact', isUrl ? artifactPath : path.relative(process.cwd(), artifactPath), '📦');
113
+ if (flags.database)
114
+ printKV('Database', redactDbUrl(flags.database), '🗄️');
58
115
  const port = flags.port ?? process.env.PORT;
59
116
  const binPath = process.argv[1];
60
117
  spawn(process.execPath, [
@@ -75,7 +132,7 @@ export default class Dev extends Command {
75
132
  const isWorkspaceRoot = fs.existsSync(workspaceConfigPath);
76
133
  if (packageName === 'all' && !isWorkspaceRoot) {
77
134
  printError(`Config file not found in ${cwd}`);
78
- console.error(chalk.yellow(' Run in a directory with objectstack.config.ts, or from the monorepo root.'));
135
+ console.error(chalk.yellow(' Run in a directory with objectstack.config.ts, pass --artifact <path|url>, or run from the monorepo root.'));
79
136
  process.exit(1);
80
137
  }
81
138
  const filter = packageName === 'all' ? '' : `--filter ${packageName}`;
@@ -93,4 +150,12 @@ export default class Dev extends Command {
93
150
  }
94
151
  }
95
152
  }
153
+ function redactDbUrl(url) {
154
+ try {
155
+ return url.replace(/(\/\/[^/@:]+):[^/@]+@/, '$1:****@');
156
+ }
157
+ catch {
158
+ return url;
159
+ }
160
+ }
96
161
  //# sourceMappingURL=dev.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}