vortex-cli 6.0.0__tar.gz → 6.2.0__tar.gz

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 (68) hide show
  1. {vortex_cli-6.0.0/vortex_cli.egg-info → vortex_cli-6.2.0}/PKG-INFO +75 -33
  2. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/README.md +74 -32
  3. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/pyproject.toml +1 -3
  4. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/cli.py +22 -17
  5. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/clean.py +14 -13
  6. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/clone.py +73 -49
  7. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/compile.py +7 -2
  8. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/config.py +1 -2
  9. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/copy.py +29 -4
  10. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/db.py +99 -11
  11. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/delete.py +24 -10
  12. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/export.py +16 -4
  13. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/new.py +51 -17
  14. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/pull.py +1 -1
  15. vortex_cli-6.2.0/vortex/commands/schema.py +669 -0
  16. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/watch.py +44 -7
  17. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/gateway.py +64 -0
  18. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/main.py +35 -8
  19. vortex_cli-6.2.0/vortex/webdesign.py +653 -0
  20. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/workspace.py +0 -47
  21. {vortex_cli-6.0.0 → vortex_cli-6.2.0/vortex_cli.egg-info}/PKG-INFO +75 -33
  22. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/SOURCES.txt +0 -7
  23. vortex_cli-6.0.0/vortex/commands/agent.py +0 -27
  24. vortex_cli-6.0.0/vortex/commands/schema.py +0 -400
  25. vortex_cli-6.0.0/vortex/templates/agent/AGENTS.md +0 -100
  26. vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-database/SKILL.md +0 -108
  27. vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-design-elements/SKILL.md +0 -112
  28. vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-overview/SKILL.md +0 -77
  29. vortex_cli-6.0.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +0 -258
  30. vortex_cli-6.0.0/vortex/templates/agent/vortex.code-snippets +0 -437
  31. vortex_cli-6.0.0/vortex/webdesign.py +0 -120
  32. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/LICENSE +0 -0
  33. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/setup.cfg +0 -0
  34. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/__init__.py +0 -0
  35. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/__main__.py +0 -0
  36. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/colour.py +0 -0
  37. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/__init__.py +0 -0
  38. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/agenda.py +0 -0
  39. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/code.py +0 -0
  40. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/docs.py +0 -0
  41. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/execute.py +0 -0
  42. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/find.py +0 -0
  43. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/grep.py +0 -0
  44. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/import_.py +0 -0
  45. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/libs.py +0 -0
  46. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/list.py +0 -0
  47. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/log.py +0 -0
  48. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/push.py +0 -0
  49. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/render.py +0 -0
  50. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/status.py +0 -0
  51. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/undo.py +0 -0
  52. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/use.py +0 -0
  53. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/constants.py +0 -0
  54. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook v2.md +0 -0
  55. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook.pdf +0 -0
  56. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/index.html +0 -0
  57. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/marked.min.js +0 -0
  58. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/lib/puakma-6.0.40.jar +0 -0
  59. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/libs.py +0 -0
  60. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/logging.py +0 -0
  61. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/models.py +0 -0
  62. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/soap.py +0 -0
  63. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/spinner.py +0 -0
  64. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/util.py +0 -0
  65. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
  66. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/entry_points.txt +0 -0
  67. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/requires.txt +0 -0
  68. {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vortex_cli
3
- Version: 6.0.0
3
+ Version: 6.2.0
4
4
  Summary: Vortex CLI
5
5
  Author-email: Jordan Amos <jordan.amos@gmail.com>
6
6
  License: MIT License
@@ -150,15 +150,15 @@ For a full list of commands see `--help`.
150
150
  - `code`: Open the workspace in Visual Studio Code (`-s <server>` opens that server's own workspace with exactly its jars on the Java classpath).
151
151
  - `use`: Set the default server so you don't need to pass `--server` on every command. e.g. `vortex use production`
152
152
  - `list` (or `ls`): List Puakma Applications on the server or cloned locally. (`ls` is an alias for `vortex list --local`)
153
- - `clone`: Clone Puakma Applications and their design objects into the workspace. Apps can be referenced by ID (`vortex clone 13`), by TemplateName (`vortex clone bettrackr_app`), or by group/name (`vortex clone bettrackr/app`). A bare application group clones **every** application in it (`vortex clone BetTrackr`) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`, `dev:BetTrackr`). See [Cloning a whole group](#cloning-a-whole-group).
153
+ - `clone`: Clone Puakma Applications and their design objects into the workspace. Apps can be referenced by ID (`vortex clone 13`), by TemplateName (`vortex clone bettrackr_app`), or by group/name (`vortex clone bettrackr/app`). A bare application group clones every active, non-inherited application in it (`vortex clone BetTrackr`; add `--all`/`-a` for the disabled and inherited ones too) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`, `dev:BetTrackr`). `--reclone` re-clones what is already cloned: every server's clones, or one server's with `--server`. See [Cloning a whole group](#cloning-a-whole-group).
154
154
  - `watch`: Watch the workspace for changes to Design Objects and automatically upload them to the server each app was cloned from. Watches all servers at once unless `--server` is given.
155
155
  - `clean`: Delete the locally cloned Puakma Application directories in the workspace.
156
156
  Takes optional `APP_ID`s to clean just those clones (all of the server's, if none are
157
- given). Refuses to delete a clone holding local changes the server doesn't have -
158
- naming each file - unless `--force` is given. Verifying that asks the server for its
159
- design element hashes, so a non-forced `clean` needs a reachable `backend=gateway`
160
- server; a clone it can't verify is refused, not silently deleted (`--force` needs no
161
- network).
157
+ given). Deletes immediately and needs no network - there is no undo. With `--check`
158
+ it first asks the server for its design element hashes and refuses to delete a clone
159
+ holding local changes the server doesn't have, naming each file; that needs a
160
+ reachable `backend=gateway` server, and a clone it can't verify is refused rather
161
+ than silently deleted.
162
162
  - `config`: View and manage configuration. `--check-gateway` reports the agent gateway negotiation and which gateway roles your identity holds.
163
163
  - `log`: View the server log.
164
164
  - `status`: Show the server status - via the agent gateway when available, otherwise the raw console `status` output.
@@ -176,7 +176,6 @@ For a full list of commands see `--help`.
176
176
  - `schema`: Manage the Puakma data dictionary (PMATABLE/ATTRIBUTE): record table/column definitions and print the DDL to run by hand. Never executes DDL.
177
177
  - `compile` (or `build`): Compile an application's Java Design Objects into `zbin/` using the Eclipse compiler (ecj).
178
178
  - `libs`: Show or refresh the per-server Java library cache (each server's `puakma.jar` and shared libraries, downloaded from the server itself).
179
- - `agent`: Generate agent/editor support files (CLAUDE.md, Puakma skills, code snippets) in the workspace.
180
179
  - `docs`: Open the Tornado Server Blackbook.
181
180
  - `execute`: Execute a command on the server.
182
181
 
@@ -188,11 +187,16 @@ For a full list of commands see `--help`.
188
187
  vortex clone 13 # by ID
189
188
  vortex clone bettrackr_app # by TemplateName
190
189
  vortex clone bettrackr/app # by group/name
191
- vortex clone BetTrackr # every application in the BetTrackr group
190
+ vortex clone BetTrackr # every active application in the BetTrackr group
191
+ vortex clone -a BetTrackr # ... including its disabled and inherited ones
192
192
  vortex clone dev:BetTrackr # ... on the 'dev' server
193
193
  vortex clone --group BetTrackr # explicitly a group, never a TemplateName
194
194
  ```
195
195
 
196
+ A group clone skips disabled and inherited applications (the ones `vortex list`
197
+ hides by default) unless `--all`/`-a` is given. An application you name outright -
198
+ by ID, TemplateName or `group/name` - is always cloned, whatever its state.
199
+
196
200
  Groups are matched the way `vortex list --group` matches them - a
197
201
  case-insensitive substring - except that an exact (case-insensitive) group name
198
202
  always wins, so cloning `BetTrackr` never drags in `BetTrackrLegacy`. If a
@@ -202,8 +206,8 @@ than cloning the lot.
202
206
  A bare word is looked up as **both** a TemplateName and a group. In the rare
203
207
  case that it is genuinely both, vortex refuses to guess: use `--group NAME` for
204
208
  the group, or the ID / `group/name` for the single application. Every flag
205
- (`--reclone`, `--get-resources`, `--open-urls`, `--timeout`, `--server`) applies
206
- to group clones as it does to single apps.
209
+ (`--reclone`, `--all`, `--get-resources`, `--open-urls`, `--timeout`, `--server`)
210
+ applies to group clones as it does to single apps.
207
211
 
208
212
  ### Working with Multiple Servers
209
213
 
@@ -303,7 +307,10 @@ backend = gateway ; default is 'soap', which never contacts the gatew
303
307
 
304
308
  With `backend = gateway`, `watch`/`push` uploads, `delete`, `log`, `status`, `db`, `execute`
305
309
  and the journal commands route through it, and `agenda`, `pull`, `render` and `undo` become
306
- available. Check what you are talking to and what you may do:
310
+ available. Everything the gateway does not offer goes to the **webdesign vortex API** (the
311
+ JSON action served by `system/webdesign`) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
312
+ A `backend = gateway` server never talks to SOAPDesigner at all. Check what you are talking
313
+ to and what you may do:
307
314
 
308
315
  ```
309
316
  vortex config --check-gateway -s dev
@@ -313,8 +320,9 @@ vortex config --check-gateway -s dev
313
320
  identity lacks the required role) is reported as an error - vortex never quietly retries the
314
321
  same operation over SOAP, because that would let anyone with SOAP access bypass every role,
315
322
  journal and guardrail above. Likewise `backend = soap` never contacts the gateway. The one
316
- deliberate exception is the gateway application's *own* deployments, which always use SOAP so
317
- that a broken gateway deploy never needs the gateway to fix itself.
323
+ deliberate exception is the gateway application's *own* deployments, which never go through
324
+ the gateway (webdesign on `backend = gateway`, SOAP on `backend = soap`) so that a broken
325
+ gateway deploy never needs the gateway to fix itself.
318
326
 
319
327
  The gateway application is **not bundled with this CLI** - deploy it to a server with
320
328
  `vortex export` / `vortex import`, then run its `Setup` scheduled action. It ships its own
@@ -326,6 +334,55 @@ the running server documents its own endpoints, roles and setup steps.
326
334
  > grant itself any role. Keep webdesign access for operators; agent identities should not have
327
335
  > it.
328
336
 
337
+ ### SOAP-free on `backend = gateway`
338
+
339
+ SOAPDesigner is legacy. On a `backend = gateway` server the commands the gateway does not
340
+ cover use the JSON API of `system/webdesign`'s `vortex` action instead - with the same
341
+ credentials, and the webdesign app's own ACL. SOAP is used only when a server is explicitly
342
+ `backend = soap`. The data dictionary (`schema`, `db --list/--schema`) is the exception that
343
+ proves the rule: the gateway's `dictionary` endpoint runs that same webdesign `vortex` action
344
+ server-side behind `GatewayDBRead`/`GatewayDBWrite`, so an agent identity with no webdesign
345
+ access gets a clean role answer rather than a login page, and a change to `vortex.java`
346
+ needs no change to the gateway.
347
+
348
+ | Command | `backend = gateway` | `backend = soap` |
349
+ |---|---|---|
350
+ | `push`, `watch` (modify), `compile --upload` | gateway `upload` (journalled); the gateway app itself: webdesign `PUT design` | SOAP `uploadDesign` |
351
+ | `watch` (create / delete) | webdesign `POST` / `DELETE design` | SOAP |
352
+ | `delete` | gateway `delete` (journalled); the gateway app itself: webdesign | SOAP |
353
+ | `copy`, `new object` | webdesign `POST`/`PUT design`, `PUT design/params` | SOAP |
354
+ | `new app` | webdesign `POST vortex` | SOAP `saveApplication` |
355
+ | `new keyword` | gateway `keyword` (upsert) | SOAP `saveKeyword` |
356
+ | `schema`, `db --list`, `db --schema` | gateway `dictionary` (webdesign's `database`/`table`/`column` routes run server-side; `GatewayDBRead`/`GatewayDBWrite`) | SOAP SQL + `savePuakma*` |
357
+ | `export` | webdesign `ExportPMX` action | SOAP `downloadPmx` |
358
+ | `import` | **still SOAP** - webdesign has no import route yet | SOAP `uploadPmx` |
359
+ | `db --sql`, `list`, `log`, `execute`, `status`, `clone`, `pull` | gateway | SOAP |
360
+
361
+ Where the webdesign API behaves differently from SOAP, the CLI compensates so the commands
362
+ behave as they did. The differences that remain visible:
363
+
364
+ - **Design element writes are whole-row.** The CLI reads the row back first and re-sends what
365
+ it does not model (the other blob, `Options`), so a `DATA`-only upload never wipes source.
366
+ One consequence: every write is one extra `GET`.
367
+ - **Renaming with `new object --update --name` does not rewrite references.** SOAP's
368
+ `updateDesignObject` also updated design params in the app that referred to the old name;
369
+ the webdesign route does not. Fix `OpenAction`/`ParentPage`-style params by hand after a rename.
370
+ - **`schema` cannot record `--default`, `--position` or the column half of `--ref`.** The
371
+ webdesign column write has no `DefaultValue`/`Position`/`RefColumn` fields (SOAP's
372
+ `savePuakmaAttribute2` had them). `--default`/`--position` are refused with a message;
373
+ `--ref TABLE.COLUMN` records the table and warns. Updates leave existing values untouched.
374
+ Extend `POST`/`PUT .../column` in webdesign's `vortex.java` to lift this.
375
+ - **Every write flushes the application's design cache**, where SOAP flushed one element.
376
+ - **No per-application `Developer` role check** - the webdesign app's ACL is the boundary. An
377
+ identity that can reach `system/webdesign` can edit every application through it.
378
+ - **`db --list` orders by table name** (SOAP's `SELECT DISTINCT` had no order); `--schema`
379
+ output is identical.
380
+ - **Database-name resolution is app-scoped.** `schema`/`db --list` find the connection whose
381
+ dictionary holds the tables (as SOAP did by `pmatable` count), asking locally cloned
382
+ applications first and scanning the server inventory only if none of them has it.
383
+ - **`import` remains SOAP** on every backend until webdesign gains a PMX import route
384
+ (`SaveImportPMX` is a multipart UI form, not an API).
385
+
329
386
  ### Interactive Wizards
330
387
 
331
388
  Run `vortex new object` or `vortex new app` without any flags to launch a step-by-step wizard:
@@ -421,22 +478,7 @@ vortex schema mydb --add-column invoice customer_id --type BIGINT --ref customer
421
478
  vortex schema mydb --ddl invoice # print CREATE TABLE from the dictionary
422
479
  ```
423
480
 
424
- ### Agent Support Files
425
-
426
- `vortex agent` copies bundled support files into the workspace `.vscode` directory so they are
427
- included in the generated code-workspace: an `AGENTS.md` with Puakma ground rules for coding
428
- agents (including pointers to the bundled Blackbook v2 architecture reference), a `CLAUDE.md`
429
- that points Claude Code at `AGENTS.md`, a `.claude/skills/` library covering Puakma development
430
- and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Java/HTML
431
- snippets. Existing files are never overwritten, so they are safe to customise. These files are
432
- also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
433
-
434
- The guidance is backend-aware: on a `backend = gateway` server the skills teach the explicit
435
- `vortex compile` + `vortex push` deploy loop (journaled, `undo`-recoverable, no workspace lock),
436
- and the `vortex watch` save-to-deploy loop is scoped to `backend = soap`. Because existing files
437
- are never overwritten, workspaces generated before 6.0.0 keep their old watch-centric copies -
438
- delete a file (or the `.claude/skills` directory) and re-run `vortex agent` to pick up the
439
- current version.
440
-
441
- Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
442
- never touched); the new `AGENTS.md` is simply added alongside it.
481
+ On a `backend = gateway` server the dictionary is reached through webdesign's vortex API via
482
+ the gateway's `dictionary` endpoint (`GatewayDBRead` to read, `GatewayDBWrite` to change).
483
+ That API cannot record `--default` or `--position` (refused) nor the column half of `--ref`
484
+ (warned) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
@@ -106,15 +106,15 @@ For a full list of commands see `--help`.
106
106
  - `code`: Open the workspace in Visual Studio Code (`-s <server>` opens that server's own workspace with exactly its jars on the Java classpath).
107
107
  - `use`: Set the default server so you don't need to pass `--server` on every command. e.g. `vortex use production`
108
108
  - `list` (or `ls`): List Puakma Applications on the server or cloned locally. (`ls` is an alias for `vortex list --local`)
109
- - `clone`: Clone Puakma Applications and their design objects into the workspace. Apps can be referenced by ID (`vortex clone 13`), by TemplateName (`vortex clone bettrackr_app`), or by group/name (`vortex clone bettrackr/app`). A bare application group clones **every** application in it (`vortex clone BetTrackr`) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`, `dev:BetTrackr`). See [Cloning a whole group](#cloning-a-whole-group).
109
+ - `clone`: Clone Puakma Applications and their design objects into the workspace. Apps can be referenced by ID (`vortex clone 13`), by TemplateName (`vortex clone bettrackr_app`), or by group/name (`vortex clone bettrackr/app`). A bare application group clones every active, non-inherited application in it (`vortex clone BetTrackr`; add `--all`/`-a` for the disabled and inherited ones too) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`, `dev:BetTrackr`). `--reclone` re-clones what is already cloned: every server's clones, or one server's with `--server`. See [Cloning a whole group](#cloning-a-whole-group).
110
110
  - `watch`: Watch the workspace for changes to Design Objects and automatically upload them to the server each app was cloned from. Watches all servers at once unless `--server` is given.
111
111
  - `clean`: Delete the locally cloned Puakma Application directories in the workspace.
112
112
  Takes optional `APP_ID`s to clean just those clones (all of the server's, if none are
113
- given). Refuses to delete a clone holding local changes the server doesn't have -
114
- naming each file - unless `--force` is given. Verifying that asks the server for its
115
- design element hashes, so a non-forced `clean` needs a reachable `backend=gateway`
116
- server; a clone it can't verify is refused, not silently deleted (`--force` needs no
117
- network).
113
+ given). Deletes immediately and needs no network - there is no undo. With `--check`
114
+ it first asks the server for its design element hashes and refuses to delete a clone
115
+ holding local changes the server doesn't have, naming each file; that needs a
116
+ reachable `backend=gateway` server, and a clone it can't verify is refused rather
117
+ than silently deleted.
118
118
  - `config`: View and manage configuration. `--check-gateway` reports the agent gateway negotiation and which gateway roles your identity holds.
119
119
  - `log`: View the server log.
120
120
  - `status`: Show the server status - via the agent gateway when available, otherwise the raw console `status` output.
@@ -132,7 +132,6 @@ For a full list of commands see `--help`.
132
132
  - `schema`: Manage the Puakma data dictionary (PMATABLE/ATTRIBUTE): record table/column definitions and print the DDL to run by hand. Never executes DDL.
133
133
  - `compile` (or `build`): Compile an application's Java Design Objects into `zbin/` using the Eclipse compiler (ecj).
134
134
  - `libs`: Show or refresh the per-server Java library cache (each server's `puakma.jar` and shared libraries, downloaded from the server itself).
135
- - `agent`: Generate agent/editor support files (CLAUDE.md, Puakma skills, code snippets) in the workspace.
136
135
  - `docs`: Open the Tornado Server Blackbook.
137
136
  - `execute`: Execute a command on the server.
138
137
 
@@ -144,11 +143,16 @@ For a full list of commands see `--help`.
144
143
  vortex clone 13 # by ID
145
144
  vortex clone bettrackr_app # by TemplateName
146
145
  vortex clone bettrackr/app # by group/name
147
- vortex clone BetTrackr # every application in the BetTrackr group
146
+ vortex clone BetTrackr # every active application in the BetTrackr group
147
+ vortex clone -a BetTrackr # ... including its disabled and inherited ones
148
148
  vortex clone dev:BetTrackr # ... on the 'dev' server
149
149
  vortex clone --group BetTrackr # explicitly a group, never a TemplateName
150
150
  ```
151
151
 
152
+ A group clone skips disabled and inherited applications (the ones `vortex list`
153
+ hides by default) unless `--all`/`-a` is given. An application you name outright -
154
+ by ID, TemplateName or `group/name` - is always cloned, whatever its state.
155
+
152
156
  Groups are matched the way `vortex list --group` matches them - a
153
157
  case-insensitive substring - except that an exact (case-insensitive) group name
154
158
  always wins, so cloning `BetTrackr` never drags in `BetTrackrLegacy`. If a
@@ -158,8 +162,8 @@ than cloning the lot.
158
162
  A bare word is looked up as **both** a TemplateName and a group. In the rare
159
163
  case that it is genuinely both, vortex refuses to guess: use `--group NAME` for
160
164
  the group, or the ID / `group/name` for the single application. Every flag
161
- (`--reclone`, `--get-resources`, `--open-urls`, `--timeout`, `--server`) applies
162
- to group clones as it does to single apps.
165
+ (`--reclone`, `--all`, `--get-resources`, `--open-urls`, `--timeout`, `--server`)
166
+ applies to group clones as it does to single apps.
163
167
 
164
168
  ### Working with Multiple Servers
165
169
 
@@ -259,7 +263,10 @@ backend = gateway ; default is 'soap', which never contacts the gatew
259
263
 
260
264
  With `backend = gateway`, `watch`/`push` uploads, `delete`, `log`, `status`, `db`, `execute`
261
265
  and the journal commands route through it, and `agenda`, `pull`, `render` and `undo` become
262
- available. Check what you are talking to and what you may do:
266
+ available. Everything the gateway does not offer goes to the **webdesign vortex API** (the
267
+ JSON action served by `system/webdesign`) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
268
+ A `backend = gateway` server never talks to SOAPDesigner at all. Check what you are talking
269
+ to and what you may do:
263
270
 
264
271
  ```
265
272
  vortex config --check-gateway -s dev
@@ -269,8 +276,9 @@ vortex config --check-gateway -s dev
269
276
  identity lacks the required role) is reported as an error - vortex never quietly retries the
270
277
  same operation over SOAP, because that would let anyone with SOAP access bypass every role,
271
278
  journal and guardrail above. Likewise `backend = soap` never contacts the gateway. The one
272
- deliberate exception is the gateway application's *own* deployments, which always use SOAP so
273
- that a broken gateway deploy never needs the gateway to fix itself.
279
+ deliberate exception is the gateway application's *own* deployments, which never go through
280
+ the gateway (webdesign on `backend = gateway`, SOAP on `backend = soap`) so that a broken
281
+ gateway deploy never needs the gateway to fix itself.
274
282
 
275
283
  The gateway application is **not bundled with this CLI** - deploy it to a server with
276
284
  `vortex export` / `vortex import`, then run its `Setup` scheduled action. It ships its own
@@ -282,6 +290,55 @@ the running server documents its own endpoints, roles and setup steps.
282
290
  > grant itself any role. Keep webdesign access for operators; agent identities should not have
283
291
  > it.
284
292
 
293
+ ### SOAP-free on `backend = gateway`
294
+
295
+ SOAPDesigner is legacy. On a `backend = gateway` server the commands the gateway does not
296
+ cover use the JSON API of `system/webdesign`'s `vortex` action instead - with the same
297
+ credentials, and the webdesign app's own ACL. SOAP is used only when a server is explicitly
298
+ `backend = soap`. The data dictionary (`schema`, `db --list/--schema`) is the exception that
299
+ proves the rule: the gateway's `dictionary` endpoint runs that same webdesign `vortex` action
300
+ server-side behind `GatewayDBRead`/`GatewayDBWrite`, so an agent identity with no webdesign
301
+ access gets a clean role answer rather than a login page, and a change to `vortex.java`
302
+ needs no change to the gateway.
303
+
304
+ | Command | `backend = gateway` | `backend = soap` |
305
+ |---|---|---|
306
+ | `push`, `watch` (modify), `compile --upload` | gateway `upload` (journalled); the gateway app itself: webdesign `PUT design` | SOAP `uploadDesign` |
307
+ | `watch` (create / delete) | webdesign `POST` / `DELETE design` | SOAP |
308
+ | `delete` | gateway `delete` (journalled); the gateway app itself: webdesign | SOAP |
309
+ | `copy`, `new object` | webdesign `POST`/`PUT design`, `PUT design/params` | SOAP |
310
+ | `new app` | webdesign `POST vortex` | SOAP `saveApplication` |
311
+ | `new keyword` | gateway `keyword` (upsert) | SOAP `saveKeyword` |
312
+ | `schema`, `db --list`, `db --schema` | gateway `dictionary` (webdesign's `database`/`table`/`column` routes run server-side; `GatewayDBRead`/`GatewayDBWrite`) | SOAP SQL + `savePuakma*` |
313
+ | `export` | webdesign `ExportPMX` action | SOAP `downloadPmx` |
314
+ | `import` | **still SOAP** - webdesign has no import route yet | SOAP `uploadPmx` |
315
+ | `db --sql`, `list`, `log`, `execute`, `status`, `clone`, `pull` | gateway | SOAP |
316
+
317
+ Where the webdesign API behaves differently from SOAP, the CLI compensates so the commands
318
+ behave as they did. The differences that remain visible:
319
+
320
+ - **Design element writes are whole-row.** The CLI reads the row back first and re-sends what
321
+ it does not model (the other blob, `Options`), so a `DATA`-only upload never wipes source.
322
+ One consequence: every write is one extra `GET`.
323
+ - **Renaming with `new object --update --name` does not rewrite references.** SOAP's
324
+ `updateDesignObject` also updated design params in the app that referred to the old name;
325
+ the webdesign route does not. Fix `OpenAction`/`ParentPage`-style params by hand after a rename.
326
+ - **`schema` cannot record `--default`, `--position` or the column half of `--ref`.** The
327
+ webdesign column write has no `DefaultValue`/`Position`/`RefColumn` fields (SOAP's
328
+ `savePuakmaAttribute2` had them). `--default`/`--position` are refused with a message;
329
+ `--ref TABLE.COLUMN` records the table and warns. Updates leave existing values untouched.
330
+ Extend `POST`/`PUT .../column` in webdesign's `vortex.java` to lift this.
331
+ - **Every write flushes the application's design cache**, where SOAP flushed one element.
332
+ - **No per-application `Developer` role check** - the webdesign app's ACL is the boundary. An
333
+ identity that can reach `system/webdesign` can edit every application through it.
334
+ - **`db --list` orders by table name** (SOAP's `SELECT DISTINCT` had no order); `--schema`
335
+ output is identical.
336
+ - **Database-name resolution is app-scoped.** `schema`/`db --list` find the connection whose
337
+ dictionary holds the tables (as SOAP did by `pmatable` count), asking locally cloned
338
+ applications first and scanning the server inventory only if none of them has it.
339
+ - **`import` remains SOAP** on every backend until webdesign gains a PMX import route
340
+ (`SaveImportPMX` is a multipart UI form, not an API).
341
+
285
342
  ### Interactive Wizards
286
343
 
287
344
  Run `vortex new object` or `vortex new app` without any flags to launch a step-by-step wizard:
@@ -377,22 +434,7 @@ vortex schema mydb --add-column invoice customer_id --type BIGINT --ref customer
377
434
  vortex schema mydb --ddl invoice # print CREATE TABLE from the dictionary
378
435
  ```
379
436
 
380
- ### Agent Support Files
381
-
382
- `vortex agent` copies bundled support files into the workspace `.vscode` directory so they are
383
- included in the generated code-workspace: an `AGENTS.md` with Puakma ground rules for coding
384
- agents (including pointers to the bundled Blackbook v2 architecture reference), a `CLAUDE.md`
385
- that points Claude Code at `AGENTS.md`, a `.claude/skills/` library covering Puakma development
386
- and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Java/HTML
387
- snippets. Existing files are never overwritten, so they are safe to customise. These files are
388
- also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
389
-
390
- The guidance is backend-aware: on a `backend = gateway` server the skills teach the explicit
391
- `vortex compile` + `vortex push` deploy loop (journaled, `undo`-recoverable, no workspace lock),
392
- and the `vortex watch` save-to-deploy loop is scoped to `backend = soap`. Because existing files
393
- are never overwritten, workspaces generated before 6.0.0 keep their old watch-centric copies -
394
- delete a file (or the `.claude/skills` directory) and re-run `vortex agent` to pick up the
395
- current version.
396
-
397
- Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
398
- never touched); the new `AGENTS.md` is simply added alongside it.
437
+ On a `backend = gateway` server the dictionary is reached through webdesign's vortex API via
438
+ the gateway's `dictionary` endpoint (`GatewayDBRead` to read, `GatewayDBWrite` to change).
439
+ That API cannot record `--default` or `--position` (refused) nor the column half of `--ref`
440
+ (warned) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "vortex_cli"
8
- version = "6.0.0"
8
+ version = "6.2.0"
9
9
  description = "Vortex CLI"
10
10
  requires-python = ">=3.10"
11
11
  readme = { file = "README.md", content-type = "text/markdown" }
@@ -41,8 +41,6 @@ vortex = [
41
41
  "docs/Blackbook v2.md",
42
42
  "docs/index.html",
43
43
  "docs/marked.min.js",
44
- "templates/agent/*",
45
- "templates/agent/skills/*/*",
46
44
  ]
47
45
 
48
46
  [tool.mypy]
@@ -410,9 +410,23 @@ def add_clone_parser(
410
410
  )
411
411
  clone_parser.add_argument(
412
412
  "--reclone",
413
- help="Reclone locally cloned applications",
413
+ help=(
414
+ "Reclone the locally cloned applications: every server's "
415
+ "clones, or only those of the given --server"
416
+ ),
414
417
  action="store_true",
415
418
  )
419
+ clone_parser.add_argument(
420
+ "--all",
421
+ "-a",
422
+ dest="include_all",
423
+ action="store_true",
424
+ help=(
425
+ "When cloning a group, also clone its disabled and inherited "
426
+ "applications (skipped by default). An application named "
427
+ "outright is always cloned"
428
+ ),
429
+ )
416
430
  clone_parser.add_argument(
417
431
  "--get-resources",
418
432
  "-r",
@@ -504,8 +518,8 @@ def add_clean_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
504
518
  "clean",
505
519
  help=(
506
520
  "Delete the cloned Puakma Application directories in the "
507
- "workspace. Refuses to delete a clone holding local changes "
508
- "the server doesn't have, without --force"
521
+ "workspace. There is no undo; --check first asks the server "
522
+ "whether a clone holds local changes it doesn't have"
509
523
  ),
510
524
  )
511
525
  clean_parser.add_argument(
@@ -525,11 +539,13 @@ def add_clean_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
525
539
  action="store_true",
526
540
  )
527
541
  clean_parser.add_argument(
528
- "--force",
542
+ "--check",
529
543
  action="store_true",
530
544
  help=(
531
- "Delete even clones with local changes the server doesn't "
532
- "have (or that can't be verified against it). There is no undo"
545
+ "Before deleting, verify each clone against the server's design "
546
+ "element hashes and refuse any holding local changes the server "
547
+ "doesn't have (or that can't be verified). Needs a reachable "
548
+ "backend=gateway server"
533
549
  ),
534
550
  )
535
551
  clean_parser.add_argument(
@@ -1183,17 +1199,6 @@ def add_compile_parser(command_parser: _SubParsersAction[ArgumentParser]) -> Non
1183
1199
  _add_server_option(compile_parser)
1184
1200
 
1185
1201
 
1186
- def add_agent_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
1187
- command_parser.add_parser(
1188
- "agent",
1189
- help=(
1190
- "Generate agent/editor support files in the workspace "
1191
- "(AGENTS.md + CLAUDE.md pointer, Puakma skills, code snippets). "
1192
- "Existing files are never overwritten"
1193
- ),
1194
- )
1195
-
1196
-
1197
1202
  def add_execute_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
1198
1203
  execute_parser = command_parser.add_parser(
1199
1204
  "execute",
@@ -9,20 +9,21 @@ the same 'app_ids: list[int] | None' convention 'vortex pull' and
9
9
  'vortex push' use, APPLICATION ids, not the design-element ids
10
10
  'vortex delete' takes - narrows it to those clones.
11
11
 
12
- THE SAFETY GATE. There is no undo and no git inside an app folder, so
13
- clean refuses to delete a clone holding local work the server does not
14
- have, naming each file, unless --force is given. Deciding that is the
12
+ THE OPT-IN SAFETY GATE. There is no undo and no git inside an app
13
+ folder. With --check, clean refuses to delete a clone holding local
14
+ work the server does not have, naming each file. Deciding that is the
15
15
  same three-way comparison pull makes (see pull.local_modifications)
16
16
  and it CANNOT be done offline: 'vortex push' does not move the
17
17
  manifest baseline, so after a push the local file differs from the
18
18
  baseline while matching the server. Telling 'already pushed, safe'
19
- from 'unsaved work' needs the server's hashes, which makes a
20
- non-forced clean a network operation. When the server can't answer -
21
- unreachable, refusing, or backend=soap, which has no hash endpoint at
22
- all - the clone is UNVERIFIABLE and clean refuses it rather than
23
- silently skipping the gate exactly when it matters; --force is the
24
- escape hatch (as is 'vortex clean --force' for an offline machine).
25
- --force needs no network at all.
19
+ from 'unsaved work' needs the server's hashes, which makes --check a
20
+ network operation - one round trip per clone, and slow on a workspace
21
+ with many. That is why it is opt-in: a plain 'vortex clean' deletes
22
+ without asking the server anything (and so works offline). When
23
+ --check is given and the server can't answer - unreachable, refusing,
24
+ or backend=soap, which has no hash endpoint at all - the clone is
25
+ UNVERIFIABLE and clean refuses it rather than silently skipping the
26
+ gate exactly when it was asked for.
26
27
  """
27
28
 
28
29
  from __future__ import annotations
@@ -100,7 +101,7 @@ def _apply_gate(
100
101
  logger.error(
101
102
  f"{len(blocked)} application(s) hold unsaved local work (or could "
102
103
  "not be verified against the server) - push or pull them, or "
103
- "re-run with --force to discard them. There is no undo"
104
+ "re-run without --check to discard them. There is no undo"
104
105
  )
105
106
  return blocked
106
107
 
@@ -112,7 +113,7 @@ def clean(
112
113
  include_libs: bool = False,
113
114
  app_ids: list[int] | None = None,
114
115
  *,
115
- force: bool = False,
116
+ check: bool = False,
116
117
  ) -> int:
117
118
  cloned_apps = workspace.listapps(None if include_all else server)
118
119
 
@@ -124,7 +125,7 @@ def clean(
124
125
  return 1
125
126
  cloned_apps = [app for app in cloned_apps if app.id in wanted]
126
127
 
127
- if not force and cloned_apps:
128
+ if check and cloned_apps:
128
129
  if _apply_gate(workspace, cloned_apps):
129
130
  return 1
130
131