@objectstack/cli 4.0.4 → 4.1.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 (269) hide show
  1. package/README.md +44 -25
  2. package/dist/commands/build.d.ts +5 -0
  3. package/dist/commands/build.d.ts.map +1 -0
  4. package/dist/commands/build.js +6 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/cloud/login.d.ts +16 -0
  7. package/dist/commands/cloud/login.d.ts.map +1 -0
  8. package/dist/commands/cloud/login.js +166 -0
  9. package/dist/commands/cloud/login.js.map +1 -0
  10. package/dist/commands/cloud/logout.d.ts +15 -0
  11. package/dist/commands/cloud/logout.d.ts.map +1 -0
  12. package/dist/commands/cloud/logout.js +51 -0
  13. package/dist/commands/cloud/logout.js.map +1 -0
  14. package/dist/commands/cloud/whoami.d.ts +15 -0
  15. package/dist/commands/cloud/whoami.d.ts.map +1 -0
  16. package/dist/commands/cloud/whoami.js +81 -0
  17. package/dist/commands/cloud/whoami.js.map +1 -0
  18. package/dist/commands/compile.d.ts +3 -0
  19. package/dist/commands/compile.d.ts.map +1 -1
  20. package/dist/commands/compile.js +128 -6
  21. package/dist/commands/compile.js.map +1 -1
  22. package/dist/commands/create.js +1 -1
  23. package/dist/commands/data/create.js +2 -2
  24. package/dist/commands/data/create.js.map +1 -1
  25. package/dist/commands/data/delete.js +2 -2
  26. package/dist/commands/data/delete.js.map +1 -1
  27. package/dist/commands/data/get.js +2 -2
  28. package/dist/commands/data/get.js.map +1 -1
  29. package/dist/commands/data/query.js +2 -2
  30. package/dist/commands/data/query.js.map +1 -1
  31. package/dist/commands/data/update.js +2 -2
  32. package/dist/commands/data/update.js.map +1 -1
  33. package/dist/commands/dev.d.ts +9 -0
  34. package/dist/commands/dev.d.ts.map +1 -1
  35. package/dist/commands/dev.js +116 -22
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/generate.js +9 -9
  38. package/dist/commands/generate.js.map +1 -1
  39. package/dist/commands/i18n/check.d.ts +18 -0
  40. package/dist/commands/i18n/check.d.ts.map +1 -0
  41. package/dist/commands/i18n/check.js +153 -0
  42. package/dist/commands/i18n/check.js.map +1 -0
  43. package/dist/commands/init.js +2 -2
  44. package/dist/commands/lint.d.ts +3 -0
  45. package/dist/commands/lint.d.ts.map +1 -1
  46. package/dist/commands/lint.js +24 -0
  47. package/dist/commands/lint.js.map +1 -1
  48. package/dist/commands/login.d.ts +17 -0
  49. package/dist/commands/login.d.ts.map +1 -0
  50. package/dist/commands/login.js +313 -0
  51. package/dist/commands/login.js.map +1 -0
  52. package/dist/commands/logout.d.ts.map +1 -0
  53. package/dist/commands/{auth/logout.js → logout.js} +14 -2
  54. package/dist/commands/logout.js.map +1 -0
  55. package/dist/commands/meta/delete.js +2 -2
  56. package/dist/commands/meta/delete.js.map +1 -1
  57. package/dist/commands/meta/get.js +2 -2
  58. package/dist/commands/meta/get.js.map +1 -1
  59. package/dist/commands/meta/list.js +2 -2
  60. package/dist/commands/meta/list.js.map +1 -1
  61. package/dist/commands/meta/register.js +2 -2
  62. package/dist/commands/meta/register.js.map +1 -1
  63. package/dist/commands/package/publish.d.ts +32 -0
  64. package/dist/commands/package/publish.d.ts.map +1 -0
  65. package/dist/commands/package/publish.js +324 -0
  66. package/dist/commands/package/publish.js.map +1 -0
  67. package/dist/commands/projects/bind.d.ts +30 -0
  68. package/dist/commands/projects/bind.d.ts.map +1 -0
  69. package/dist/commands/projects/bind.js +132 -0
  70. package/dist/commands/projects/bind.js.map +1 -0
  71. package/dist/commands/projects/create.d.ts +28 -0
  72. package/dist/commands/projects/create.d.ts.map +1 -0
  73. package/dist/commands/projects/create.js +120 -0
  74. package/dist/commands/projects/create.js.map +1 -0
  75. package/dist/commands/projects/list.d.ts +21 -0
  76. package/dist/commands/projects/list.d.ts.map +1 -0
  77. package/dist/commands/projects/list.js +79 -0
  78. package/dist/commands/projects/list.js.map +1 -0
  79. package/dist/commands/projects/projects.test.d.ts +2 -0
  80. package/dist/commands/projects/projects.test.d.ts.map +1 -0
  81. package/dist/commands/projects/projects.test.js +56 -0
  82. package/dist/commands/projects/projects.test.js.map +1 -0
  83. package/dist/commands/projects/show.d.ts +21 -0
  84. package/dist/commands/projects/show.d.ts.map +1 -0
  85. package/dist/commands/projects/show.js +72 -0
  86. package/dist/commands/projects/show.js.map +1 -0
  87. package/dist/commands/projects/switch.d.ts +24 -0
  88. package/dist/commands/projects/switch.d.ts.map +1 -0
  89. package/dist/commands/projects/switch.js +64 -0
  90. package/dist/commands/projects/switch.js.map +1 -0
  91. package/dist/commands/publish.d.ts +17 -0
  92. package/dist/commands/publish.d.ts.map +1 -0
  93. package/dist/commands/publish.js +135 -0
  94. package/dist/commands/publish.js.map +1 -0
  95. package/dist/commands/{auth/login.d.ts → register.d.ts} +3 -2
  96. package/dist/commands/register.d.ts.map +1 -0
  97. package/dist/commands/{auth/login.js → register.js} +44 -61
  98. package/dist/commands/register.js.map +1 -0
  99. package/dist/commands/rollback.d.ts +13 -0
  100. package/dist/commands/rollback.d.ts.map +1 -0
  101. package/dist/commands/rollback.js +77 -0
  102. package/dist/commands/rollback.js.map +1 -0
  103. package/dist/commands/serve.d.ts +22 -0
  104. package/dist/commands/serve.d.ts.map +1 -1
  105. package/dist/commands/serve.js +1173 -58
  106. package/dist/commands/serve.js.map +1 -1
  107. package/dist/commands/start.d.ts +18 -0
  108. package/dist/commands/start.d.ts.map +1 -0
  109. package/dist/commands/start.js +112 -0
  110. package/dist/commands/start.js.map +1 -0
  111. package/dist/commands/whoami.d.ts.map +1 -0
  112. package/dist/commands/{auth/whoami.js → whoami.js} +5 -5
  113. package/dist/commands/whoami.js.map +1 -0
  114. package/dist/index.d.ts +11 -4
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +14 -5
  117. package/dist/index.js.map +1 -1
  118. package/dist/utils/account.d.ts +31 -0
  119. package/dist/utils/account.d.ts.map +1 -0
  120. package/dist/utils/account.js +154 -0
  121. package/dist/utils/account.js.map +1 -0
  122. package/dist/utils/api-client.d.ts +10 -4
  123. package/dist/utils/api-client.d.ts.map +1 -1
  124. package/dist/utils/api-client.js +13 -7
  125. package/dist/utils/api-client.js.map +1 -1
  126. package/dist/utils/auth-config.d.ts +6 -0
  127. package/dist/utils/auth-config.d.ts.map +1 -1
  128. package/dist/utils/auth-config.js.map +1 -1
  129. package/dist/utils/auth-flows.d.ts +31 -0
  130. package/dist/utils/auth-flows.d.ts.map +1 -0
  131. package/dist/utils/auth-flows.js +151 -0
  132. package/dist/utils/auth-flows.js.map +1 -0
  133. package/dist/utils/build-runtime.d.ts +45 -0
  134. package/dist/utils/build-runtime.d.ts.map +1 -0
  135. package/dist/utils/build-runtime.js +154 -0
  136. package/dist/utils/build-runtime.js.map +1 -0
  137. package/dist/utils/cloud-config.d.ts +24 -0
  138. package/dist/utils/cloud-config.d.ts.map +1 -0
  139. package/dist/utils/cloud-config.js +75 -0
  140. package/dist/utils/cloud-config.js.map +1 -0
  141. package/dist/utils/config.d.ts.map +1 -1
  142. package/dist/utils/config.js +17 -2
  143. package/dist/utils/config.js.map +1 -1
  144. package/dist/utils/console.d.ts +33 -0
  145. package/dist/utils/console.d.ts.map +1 -0
  146. package/dist/utils/console.js +172 -0
  147. package/dist/utils/console.js.map +1 -0
  148. package/dist/utils/extract-hook-body.d.ts +13 -0
  149. package/dist/utils/extract-hook-body.d.ts.map +1 -0
  150. package/dist/utils/extract-hook-body.js +175 -0
  151. package/dist/utils/extract-hook-body.js.map +1 -0
  152. package/dist/utils/format.d.ts +8 -0
  153. package/dist/utils/format.d.ts.map +1 -1
  154. package/dist/utils/format.js +15 -2
  155. package/dist/utils/format.js.map +1 -1
  156. package/dist/utils/i18n-coverage.d.ts +61 -0
  157. package/dist/utils/i18n-coverage.d.ts.map +1 -0
  158. package/dist/utils/i18n-coverage.js +176 -0
  159. package/dist/utils/i18n-coverage.js.map +1 -0
  160. package/dist/utils/lower-callables.d.ts +17 -0
  161. package/dist/utils/lower-callables.d.ts.map +1 -0
  162. package/dist/utils/lower-callables.js +181 -0
  163. package/dist/utils/lower-callables.js.map +1 -0
  164. package/dist/utils/plugin-detection.d.ts +1 -0
  165. package/dist/utils/plugin-detection.d.ts.map +1 -1
  166. package/dist/utils/plugin-detection.js +41 -0
  167. package/dist/utils/plugin-detection.js.map +1 -1
  168. package/dist/utils/studio.d.ts +1 -0
  169. package/dist/utils/studio.d.ts.map +1 -1
  170. package/dist/utils/studio.js +24 -9
  171. package/dist/utils/studio.js.map +1 -1
  172. package/package.json +60 -22
  173. package/.turbo/turbo-build.log +0 -4
  174. package/CHANGELOG.md +0 -821
  175. package/bin/run-dev.js +0 -5
  176. package/dist/commands/auth/login.d.ts.map +0 -1
  177. package/dist/commands/auth/login.js.map +0 -1
  178. package/dist/commands/auth/logout.d.ts.map +0 -1
  179. package/dist/commands/auth/logout.js.map +0 -1
  180. package/dist/commands/auth/whoami.d.ts.map +0 -1
  181. package/dist/commands/auth/whoami.js.map +0 -1
  182. package/dist/commands/codemod/v2-to-v3.d.ts +0 -10
  183. package/dist/commands/codemod/v2-to-v3.d.ts.map +0 -1
  184. package/dist/commands/codemod/v2-to-v3.js +0 -145
  185. package/dist/commands/codemod/v2-to-v3.js.map +0 -1
  186. package/dist/commands/plugin/add.d.ts +0 -22
  187. package/dist/commands/plugin/add.d.ts.map +0 -1
  188. package/dist/commands/plugin/add.js +0 -93
  189. package/dist/commands/plugin/add.js.map +0 -1
  190. package/dist/commands/plugin/build.d.ts +0 -29
  191. package/dist/commands/plugin/build.d.ts.map +0 -1
  192. package/dist/commands/plugin/build.js +0 -170
  193. package/dist/commands/plugin/build.js.map +0 -1
  194. package/dist/commands/plugin/info.d.ts +0 -10
  195. package/dist/commands/plugin/info.d.ts.map +0 -1
  196. package/dist/commands/plugin/info.js +0 -65
  197. package/dist/commands/plugin/info.js.map +0 -1
  198. package/dist/commands/plugin/list.d.ts +0 -13
  199. package/dist/commands/plugin/list.d.ts.map +0 -1
  200. package/dist/commands/plugin/list.js +0 -78
  201. package/dist/commands/plugin/list.js.map +0 -1
  202. package/dist/commands/plugin/publish.d.ts +0 -27
  203. package/dist/commands/plugin/publish.d.ts.map +0 -1
  204. package/dist/commands/plugin/publish.js +0 -152
  205. package/dist/commands/plugin/publish.js.map +0 -1
  206. package/dist/commands/plugin/remove.d.ts +0 -20
  207. package/dist/commands/plugin/remove.d.ts.map +0 -1
  208. package/dist/commands/plugin/remove.js +0 -79
  209. package/dist/commands/plugin/remove.js.map +0 -1
  210. package/dist/commands/plugin/validate.d.ts +0 -23
  211. package/dist/commands/plugin/validate.d.ts.map +0 -1
  212. package/dist/commands/plugin/validate.js +0 -251
  213. package/dist/commands/plugin/validate.js.map +0 -1
  214. package/src/bin.ts +0 -13
  215. package/src/commands/auth/login.ts +0 -188
  216. package/src/commands/auth/logout.ts +0 -51
  217. package/src/commands/auth/whoami.ts +0 -85
  218. package/src/commands/codemod/v2-to-v3.ts +0 -171
  219. package/src/commands/compile.ts +0 -114
  220. package/src/commands/create.ts +0 -281
  221. package/src/commands/data/create.ts +0 -110
  222. package/src/commands/data/delete.ts +0 -84
  223. package/src/commands/data/get.ts +0 -84
  224. package/src/commands/data/query.ts +0 -127
  225. package/src/commands/data/update.ts +0 -114
  226. package/src/commands/dev.ts +0 -83
  227. package/src/commands/diff.ts +0 -294
  228. package/src/commands/doctor.ts +0 -572
  229. package/src/commands/explain.ts +0 -412
  230. package/src/commands/generate.ts +0 -924
  231. package/src/commands/info.ts +0 -124
  232. package/src/commands/init.ts +0 -327
  233. package/src/commands/lint.ts +0 -315
  234. package/src/commands/meta/delete.ts +0 -79
  235. package/src/commands/meta/get.ts +0 -73
  236. package/src/commands/meta/list.ts +0 -105
  237. package/src/commands/meta/register.ts +0 -97
  238. package/src/commands/plugin/add.ts +0 -112
  239. package/src/commands/plugin/build.ts +0 -193
  240. package/src/commands/plugin/info.ts +0 -79
  241. package/src/commands/plugin/list.ts +0 -93
  242. package/src/commands/plugin/publish.ts +0 -176
  243. package/src/commands/plugin/remove.ts +0 -97
  244. package/src/commands/plugin/validate.ts +0 -268
  245. package/src/commands/serve.ts +0 -411
  246. package/src/commands/studio.ts +0 -52
  247. package/src/commands/test.ts +0 -135
  248. package/src/commands/validate.ts +0 -143
  249. package/src/index.ts +0 -22
  250. package/src/utils/api-client.ts +0 -88
  251. package/src/utils/auth-config.ts +0 -107
  252. package/src/utils/config.ts +0 -80
  253. package/src/utils/format.ts +0 -267
  254. package/src/utils/output-formatter.ts +0 -91
  255. package/src/utils/plugin-detection.ts +0 -16
  256. package/src/utils/plugin-helpers.ts +0 -37
  257. package/src/utils/studio.ts +0 -350
  258. package/test/commands.test.ts +0 -128
  259. package/test/create.test.ts +0 -25
  260. package/test/plugin-commands.test.ts +0 -44
  261. package/test/plugin.test.ts +0 -169
  262. package/test/remote-api-commands.test.ts +0 -188
  263. package/test/remote-api-utils.test.ts +0 -196
  264. package/test/serve-host-config.test.ts +0 -77
  265. package/tsconfig.build.json +0 -20
  266. package/tsconfig.json +0 -25
  267. package/tsup.config.ts +0 -23
  268. /package/dist/commands/{auth/logout.d.ts → logout.d.ts} +0 -0
  269. /package/dist/commands/{auth/whoami.d.ts → whoami.d.ts} +0 -0
package/README.md CHANGED
@@ -63,12 +63,7 @@ Available generate types: `object`, `view`, `action`, `flow`, `agent`, `dashboar
63
63
 
64
64
  ### Plugin Management
65
65
 
66
- | Command | Description |
67
- |---------|-------------|
68
- | `os plugin list [config]` | List plugins defined in configuration (alias: `os plugin ls`) |
69
- | `os plugin info <name> [config]` | Show detailed plugin information |
70
- | `os plugin add <package>` | Add a plugin import and entry to config |
71
- | `os plugin remove <name>` | Remove a plugin from config (alias: `os plugin rm`) |
66
+ Runtime plugins (declared in `objectstack.config.ts` `plugins`) are loaded automatically by `os serve` / `os dev`. There is no `os plugin` command group in v1; project-level dependency management and marketplace distribution will arrive with the Cloud Projects model. To distribute a build today, use `os build` (or `os compile`) and bind the artifact via `os projects bind <id> --artifact dist/objectstack.json`.
72
67
 
73
68
  ### Quality
74
69
 
@@ -144,18 +139,9 @@ export default defineStack({
144
139
 
145
140
  - `-d, --dir <directory>` — Override target directory
146
141
 
147
- ### `os plugin list`
148
-
149
- - `--json` — Output as JSON
150
-
151
- ### `os plugin add`
152
-
153
- - `-d, --dev` — Add as a dev-only plugin
154
- - `-c, --config <path>` — Configuration file path
142
+ ### `os plugins` (oclif)
155
143
 
156
- ### `os plugin remove`
157
-
158
- - `-c, --config <path>` — Configuration file path
144
+ `os plugins install`, `os plugins uninstall`, `os plugins update`, and friends come from `@oclif/plugin-plugins`. They install third-party CLI extensions (oclif plugins), not runtime plugins for an ObjectStack project. See [oclif's plugin docs](https://oclif.io/docs/plugins) for the full surface.
159
145
 
160
146
  ### `os info`
161
147
 
@@ -237,10 +223,10 @@ os init # 1. Create project
237
223
  os generate object customer # 2. Add a Customer object
238
224
  os generate object order # 3. Add an Order object
239
225
  os generate view customer # 4. Add a list view
240
- os plugin add @objectstack/plugin-auth # 5. Add auth plugin
241
- os validate # 6. Validate everything
242
- os dev # 7. Start dev server
243
- os compile # 8. Build for production
226
+ os validate # 5. Validate everything
227
+ os dev # 6. Start dev server
228
+ os compile # 7. Build for production
229
+ os projects bind <id> --artifact dist/objectstack.json # 8. Bind to a Cloud Project
244
230
  ```
245
231
 
246
232
  ## Architecture
@@ -255,11 +241,12 @@ os compile # 8. Build for production
255
241
  │ ├── compile.ts # os compile
256
242
  │ ├── validate.ts # os validate
257
243
  │ ├── generate.ts # os generate (alias: g)
258
- │ ├── plugin/ # os plugin <subcommand>
244
+ │ ├── projects/ # os projects <subcommand>
259
245
  │ │ ├── list.ts
260
- │ │ ├── info.ts
261
- │ │ ├── add.ts
262
- │ │ └── remove.ts
246
+ │ │ ├── show.ts
247
+ │ │ ├── create.ts
248
+ │ │ ├── switch.ts
249
+ │ │ └── bind.ts
263
250
  │ ├── codemod/ # os codemod <subcommand>
264
251
  │ │ └── v2-to-v3.ts
265
252
  │ └── ...
@@ -267,6 +254,38 @@ os compile # 8. Build for production
267
254
  └── package.json # oclif config under "oclif" key
268
255
  ```
269
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
+
270
289
  ## License
271
290
 
272
291
  Apache-2.0
@@ -0,0 +1,5 @@
1
+ import Compile from './compile.js';
2
+ export default class Build extends Compile {
3
+ static description: string;
4
+ }
5
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA4E;CACxG"}
@@ -0,0 +1,6 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import Compile from './compile.js';
3
+ export default class Build extends Compile {
4
+ static description = 'Compile ObjectStack configuration to JSON artifact (alias for compile)';
5
+ }
6
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,wEAAwE,CAAC"}
@@ -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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"}
@@ -7,6 +7,9 @@ export default class Compile extends Command {
7
7
  static flags: {
8
8
  output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ 'strict-body': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ 'runtime-bundle': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ 'no-runtime-bundle': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
13
  };
11
14
  run(): Promise<void>;
12
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAmBnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAwD;IAEnF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgF3B"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAqBnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAwD;IAEnF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;MAoBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2L3B"}