vortex-cli 5.0.0__tar.gz → 6.0.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 (71) hide show
  1. {vortex_cli-5.0.0/vortex_cli.egg-info → vortex_cli-6.0.0}/PKG-INFO +123 -5
  2. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/README.md +122 -4
  3. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/pyproject.toml +1 -1
  4. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/cli.py +270 -19
  5. vortex_cli-6.0.0/vortex/commands/agenda.py +163 -0
  6. vortex_cli-6.0.0/vortex/commands/clean.py +213 -0
  7. vortex_cli-6.0.0/vortex/commands/clone.py +606 -0
  8. vortex_cli-6.0.0/vortex/commands/config.py +127 -0
  9. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/db.py +103 -3
  10. vortex_cli-6.0.0/vortex/commands/delete.py +127 -0
  11. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/execute.py +33 -1
  12. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/list.py +84 -9
  13. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/log.py +35 -4
  14. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/new.py +27 -0
  15. vortex_cli-6.0.0/vortex/commands/pull.py +398 -0
  16. vortex_cli-6.0.0/vortex/commands/push.py +132 -0
  17. vortex_cli-6.0.0/vortex/commands/render.py +77 -0
  18. vortex_cli-6.0.0/vortex/commands/status.py +86 -0
  19. vortex_cli-6.0.0/vortex/commands/undo.py +144 -0
  20. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/watch.py +79 -3
  21. vortex_cli-6.0.0/vortex/gateway.py +795 -0
  22. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/main.py +68 -3
  23. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/models.py +199 -2
  24. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/soap.py +59 -0
  25. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/templates/agent/AGENTS.md +43 -9
  26. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/templates/agent/skills/puakma-design-elements/SKILL.md +23 -8
  27. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/templates/agent/skills/puakma-overview/SKILL.md +23 -13
  28. vortex_cli-6.0.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +258 -0
  29. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/util.py +10 -0
  30. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/workspace.py +144 -14
  31. {vortex_cli-5.0.0 → vortex_cli-6.0.0/vortex_cli.egg-info}/PKG-INFO +123 -5
  32. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex_cli.egg-info/SOURCES.txt +7 -0
  33. vortex_cli-5.0.0/vortex/commands/clean.py +0 -58
  34. vortex_cli-5.0.0/vortex/commands/clone.py +0 -319
  35. vortex_cli-5.0.0/vortex/commands/config.py +0 -67
  36. vortex_cli-5.0.0/vortex/commands/delete.py +0 -83
  37. vortex_cli-5.0.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +0 -148
  38. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/LICENSE +0 -0
  39. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/setup.cfg +0 -0
  40. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/__init__.py +0 -0
  41. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/__main__.py +0 -0
  42. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/colour.py +0 -0
  43. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/__init__.py +0 -0
  44. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/agent.py +0 -0
  45. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/code.py +0 -0
  46. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/compile.py +0 -0
  47. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/copy.py +0 -0
  48. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/docs.py +0 -0
  49. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/export.py +0 -0
  50. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/find.py +0 -0
  51. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/grep.py +0 -0
  52. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/import_.py +0 -0
  53. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/libs.py +0 -0
  54. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/schema.py +0 -0
  55. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/commands/use.py +0 -0
  56. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/constants.py +0 -0
  57. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/docs/Blackbook v2.md +0 -0
  58. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/docs/Blackbook.pdf +0 -0
  59. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/docs/index.html +0 -0
  60. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/docs/marked.min.js +0 -0
  61. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/lib/puakma-6.0.40.jar +0 -0
  62. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/libs.py +0 -0
  63. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/logging.py +0 -0
  64. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/spinner.py +0 -0
  65. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/templates/agent/skills/puakma-database/SKILL.md +0 -0
  66. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/templates/agent/vortex.code-snippets +0 -0
  67. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex/webdesign.py +0 -0
  68. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
  69. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex_cli.egg-info/entry_points.txt +0 -0
  70. {vortex_cli-5.0.0 → vortex_cli-6.0.0}/vortex_cli.egg-info/requires.txt +0 -0
  71. {vortex_cli-5.0.0 → vortex_cli-6.0.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: 5.0.0
3
+ Version: 6.0.0
4
4
  Summary: Vortex CLI
5
5
  Author-email: Jordan Amos <jordan.amos@gmail.com>
6
6
  License: MIT License
@@ -95,16 +95,35 @@ While it is possible to use without it, this software has been purposefully desi
95
95
  [server1] ; This can be called whatever you want and can be referenced using the '--server' flag
96
96
  host = example.com
97
97
  port = 8080 ; we can overwrite the DEFAULT value
98
- puakma_db_conn_id = 13
99
98
  username = myuser ; Optional - Prompted at runtime if not provided
100
99
  password = mypassword ; Optional - Prompted at runtime if not provided
101
100
  ; Optional
101
+ puakma_db_conn_id = 13 ; Optional - discovered from the server when omitted
102
+ backend = soap ; 'soap' (default) or 'gateway' - see The Agent Gateway below
103
+ gateway_path = vortex/gateway.pma ; only used when backend = gateway
102
104
  clone_with_resources = html,css,js ; resources with these extensions are always cloned - 'clone --get-resources' still clones ALL resources
103
105
  lib_path = ; optional extra jars to add to the classpath (the server's own jars are downloaded automatically - see 'vortex libs')
106
+ workspace_folders = ~/dev/shared,notes ; extra folders to mount in the generated .code-workspace files. Relative paths resolve against the workspace root. Under [DEFAULT] they are added to every workspace; here they apply to this server's workspace (and the global one)
104
107
  java_home = /usr/lib/jvm/java-17-openjdk-amd64/ ; The local path to the JRE to use. Should be the same version running on your server
105
108
  java_environment_name = JavaSE-17 ; Java Execution Environment name https://docs.osgi.org/reference/eenames.html
106
109
  ```
107
110
 
111
+ ## Upgrading to 6.0
112
+
113
+ 6.0 is additive - **the default behaviour is unchanged**. Every server keeps using the SOAP
114
+ designer path unless you opt it in.
115
+
116
+ - **New optional backend: the agent gateway.** Set `backend = gateway` on a server definition
117
+ to route supported operations through the `vortex/gateway` Puakma application instead of
118
+ SOAPDesigner. The default is `backend = soap`, which never contacts the gateway at all - so
119
+ servers without it installed are unaffected. See [The Agent Gateway](#the-agent-gateway).
120
+ - **New commands**: `status`, `agenda`, `push`, `pull`, `render` and `undo`. `agenda`, `pull`,
121
+ `render` and `undo` require `backend = gateway`; `status` and `push` fall back to the
122
+ existing paths.
123
+ - **`puakma_db_conn_id` is now optional.** When omitted it is discovered from the server on
124
+ both backends. Existing configs that set it explicitly keep working.
125
+ - **`vortex list` gains Version and Last Modified columns** when run against a gateway server.
126
+
108
127
  ## Upgrading to 5.0
109
128
 
110
129
  5.0 changes some defaults you may rely on:
@@ -131,11 +150,23 @@ For a full list of commands see `--help`.
131
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).
132
151
  - `use`: Set the default server so you don't need to pass `--server` on every command. e.g. `vortex use production`
133
152
  - `list` (or `ls`): List Puakma Applications on the server or cloned locally. (`ls` is an alias for `vortex list --local`)
134
- - `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`) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`).
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).
135
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.
136
155
  - `clean`: Delete the locally cloned Puakma Application directories in the workspace.
137
- - `config`: View and manage configuration.
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).
162
+ - `config`: View and manage configuration. `--check-gateway` reports the agent gateway negotiation and which gateway roles your identity holds.
138
163
  - `log`: View the server log.
164
+ - `status`: Show the server status - via the agent gateway when available, otherwise the raw console `status` output.
165
+ - `agenda`: List every scheduled action with its decoded schedule, last and next run, and whether it is overdue (read-only, gateway only).
166
+ - `push`: Upload local design files (source, compiled classes, pages, resources) to the server without a watch session - journaled and deploy-confirmed when routed via the gateway.
167
+ - `pull`: Refresh cloned applications in place via the gateway's incremental sync - only elements changed since the last sync are downloaded. Refuses to overwrite locally modified files without `--force`.
168
+ - `render`: Render a PAGE server-side as your identity and print it (or `--out FILE`) - see a change without a browser login (gateway only).
169
+ - `undo`: The server-side undo journal. No arguments lists journal entries; with an entry id it dry-runs a restore, and `--confirm` writes the journaled version back (gateway only).
139
170
  - `find`: Find Design Objects of cloned applications by name.
140
171
  - `grep`: Search the contents of cloned Design Objects using a Regular Expression.
141
172
  - `new`: Create new Design Objects, Applications, or Keywords. Use `--update <ID>` to update instead. Run without flags to launch an interactive wizard.
@@ -149,6 +180,31 @@ For a full list of commands see `--help`.
149
180
  - `docs`: Open the Tornado Server Blackbook.
150
181
  - `execute`: Execute a command on the server.
151
182
 
183
+ ### Cloning a whole group
184
+
185
+ `vortex clone` takes an ID, a TemplateName, an application group, or `group/name`:
186
+
187
+ ```
188
+ vortex clone 13 # by ID
189
+ vortex clone bettrackr_app # by TemplateName
190
+ vortex clone bettrackr/app # by group/name
191
+ vortex clone BetTrackr # every application in the BetTrackr group
192
+ vortex clone dev:BetTrackr # ... on the 'dev' server
193
+ vortex clone --group BetTrackr # explicitly a group, never a TemplateName
194
+ ```
195
+
196
+ Groups are matched the way `vortex list --group` matches them - a
197
+ case-insensitive substring - except that an exact (case-insensitive) group name
198
+ always wins, so cloning `BetTrackr` never drags in `BetTrackrLegacy`. If a
199
+ partial name still spans several groups, vortex stops and lists them rather
200
+ than cloning the lot.
201
+
202
+ A bare word is looked up as **both** a TemplateName and a group. In the rare
203
+ case that it is genuinely both, vortex refuses to guess: use `--group NAME` for
204
+ 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.
207
+
152
208
  ### Working with Multiple Servers
153
209
 
154
210
  Each section in `servers.ini` defines a server (hosts must be unique across
@@ -172,7 +228,9 @@ apps from several servers at the same time:
172
228
  watcher doesn't know about). Finer-grained commands that alter design
173
229
  elements (`delete`, `copy`, `new`, `compile --upload`) lock
174
230
  per-application: they are refused for apps a watch is watching and run
175
- concurrently otherwise.
231
+ concurrently otherwise. `push` and `pull` lock the same way - per
232
+ application, never workspace-wide - so they can run against one app while
233
+ a watch holds others.
176
234
  - In VS Code, app folders are listed in per-server blocks (`dev: group/app`,
177
235
  ...) with the server's jars on the Java classpath (see them in the Java
178
236
  Projects view). vscode-java's classpath settings are
@@ -215,6 +273,59 @@ hard to change by accident:
215
273
  - `vortex watch` skips protected servers unless `--include-protected` is
216
274
  given, so saving a file can never hot-deploy to production by accident.
217
275
 
276
+ ### The Agent Gateway
277
+
278
+ The **agent gateway** is a JSON API served by the Puakma server itself - a companion Puakma
279
+ application (`vortex/gateway`) that you deploy to a server. Where SOAPDesigner is a transport,
280
+ the gateway is a transport *plus* the guarantees only server-side code can enforce:
281
+
282
+ - **Role-gated operations** - every endpoint requires one declared application role, checked on
283
+ the server. Roles are rows in *that server's* copy of the app, so a grant on dev confers
284
+ nothing on prod.
285
+ - **An undo journal** - destructive design writes snapshot the element first (bytes, metadata,
286
+ design params). `vortex undo` lists those snapshots and restores any of them; deleted
287
+ elements are recreatable.
288
+ - **Dry-run by default** - `undo`, element deletes, single-statement DML and whole-server
289
+ refresh do nothing without an explicit confirmation.
290
+ - **Deploy confirmation** - writes reply with the sizes and hashes of what is really on the
291
+ server now.
292
+ - **Database guardrails** - the Puakma system database is unreachable through it, and DDL is
293
+ never executed, only generated as text.
294
+
295
+ Opt in per server:
296
+
297
+ ```ini
298
+ [dev]
299
+ host = dev.example.com
300
+ backend = gateway ; default is 'soap', which never contacts the gateway
301
+ ; gateway_path = vortex/gateway.pma (this is the default)
302
+ ```
303
+
304
+ With `backend = gateway`, `watch`/`push` uploads, `delete`, `log`, `status`, `db`, `execute`
305
+ 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:
307
+
308
+ ```
309
+ vortex config --check-gateway -s dev
310
+ ```
311
+
312
+ **There is no fallback in either direction, by design.** A gateway refusal (for example, your
313
+ identity lacks the required role) is reported as an error - vortex never quietly retries the
314
+ same operation over SOAP, because that would let anyone with SOAP access bypass every role,
315
+ 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.
318
+
319
+ The gateway application is **not bundled with this CLI** - deploy it to a server with
320
+ `vortex export` / `vortex import`, then run its `Setup` scheduled action. It ships its own
321
+ `API.md`, `README.md` and `DECISIONS.md` as DOCUMENTATION design elements, so once installed
322
+ the running server documents its own endpoints, roles and setup steps.
323
+
324
+ > **Note:** the gateway's roles are only a real boundary for an identity whose *sole* route to
325
+ > the server is the gateway. Any identity that can reach `system/webdesign` or deploy code can
326
+ > grant itself any role. Keep webdesign access for operators; agent identities should not have
327
+ > it.
328
+
218
329
  ### Interactive Wizards
219
330
 
220
331
  Run `vortex new object` or `vortex new app` without any flags to launch a step-by-step wizard:
@@ -320,5 +431,12 @@ and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Ja
320
431
  snippets. Existing files are never overwritten, so they are safe to customise. These files are
321
432
  also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
322
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
+
323
441
  Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
324
442
  never touched); the new `AGENTS.md` is simply added alongside it.
@@ -51,16 +51,35 @@ While it is possible to use without it, this software has been purposefully desi
51
51
  [server1] ; This can be called whatever you want and can be referenced using the '--server' flag
52
52
  host = example.com
53
53
  port = 8080 ; we can overwrite the DEFAULT value
54
- puakma_db_conn_id = 13
55
54
  username = myuser ; Optional - Prompted at runtime if not provided
56
55
  password = mypassword ; Optional - Prompted at runtime if not provided
57
56
  ; Optional
57
+ puakma_db_conn_id = 13 ; Optional - discovered from the server when omitted
58
+ backend = soap ; 'soap' (default) or 'gateway' - see The Agent Gateway below
59
+ gateway_path = vortex/gateway.pma ; only used when backend = gateway
58
60
  clone_with_resources = html,css,js ; resources with these extensions are always cloned - 'clone --get-resources' still clones ALL resources
59
61
  lib_path = ; optional extra jars to add to the classpath (the server's own jars are downloaded automatically - see 'vortex libs')
62
+ workspace_folders = ~/dev/shared,notes ; extra folders to mount in the generated .code-workspace files. Relative paths resolve against the workspace root. Under [DEFAULT] they are added to every workspace; here they apply to this server's workspace (and the global one)
60
63
  java_home = /usr/lib/jvm/java-17-openjdk-amd64/ ; The local path to the JRE to use. Should be the same version running on your server
61
64
  java_environment_name = JavaSE-17 ; Java Execution Environment name https://docs.osgi.org/reference/eenames.html
62
65
  ```
63
66
 
67
+ ## Upgrading to 6.0
68
+
69
+ 6.0 is additive - **the default behaviour is unchanged**. Every server keeps using the SOAP
70
+ designer path unless you opt it in.
71
+
72
+ - **New optional backend: the agent gateway.** Set `backend = gateway` on a server definition
73
+ to route supported operations through the `vortex/gateway` Puakma application instead of
74
+ SOAPDesigner. The default is `backend = soap`, which never contacts the gateway at all - so
75
+ servers without it installed are unaffected. See [The Agent Gateway](#the-agent-gateway).
76
+ - **New commands**: `status`, `agenda`, `push`, `pull`, `render` and `undo`. `agenda`, `pull`,
77
+ `render` and `undo` require `backend = gateway`; `status` and `push` fall back to the
78
+ existing paths.
79
+ - **`puakma_db_conn_id` is now optional.** When omitted it is discovered from the server on
80
+ both backends. Existing configs that set it explicitly keep working.
81
+ - **`vortex list` gains Version and Last Modified columns** when run against a gateway server.
82
+
64
83
  ## Upgrading to 5.0
65
84
 
66
85
  5.0 changes some defaults you may rely on:
@@ -87,11 +106,23 @@ For a full list of commands see `--help`.
87
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).
88
107
  - `use`: Set the default server so you don't need to pass `--server` on every command. e.g. `vortex use production`
89
108
  - `list` (or `ls`): List Puakma Applications on the server or cloned locally. (`ls` is an alias for `vortex list --local`)
90
- - `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`) - all optionally server-qualified (`dev:13`, `dev:bettrackr/app`).
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).
91
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.
92
111
  - `clean`: Delete the locally cloned Puakma Application directories in the workspace.
93
- - `config`: View and manage configuration.
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).
118
+ - `config`: View and manage configuration. `--check-gateway` reports the agent gateway negotiation and which gateway roles your identity holds.
94
119
  - `log`: View the server log.
120
+ - `status`: Show the server status - via the agent gateway when available, otherwise the raw console `status` output.
121
+ - `agenda`: List every scheduled action with its decoded schedule, last and next run, and whether it is overdue (read-only, gateway only).
122
+ - `push`: Upload local design files (source, compiled classes, pages, resources) to the server without a watch session - journaled and deploy-confirmed when routed via the gateway.
123
+ - `pull`: Refresh cloned applications in place via the gateway's incremental sync - only elements changed since the last sync are downloaded. Refuses to overwrite locally modified files without `--force`.
124
+ - `render`: Render a PAGE server-side as your identity and print it (or `--out FILE`) - see a change without a browser login (gateway only).
125
+ - `undo`: The server-side undo journal. No arguments lists journal entries; with an entry id it dry-runs a restore, and `--confirm` writes the journaled version back (gateway only).
95
126
  - `find`: Find Design Objects of cloned applications by name.
96
127
  - `grep`: Search the contents of cloned Design Objects using a Regular Expression.
97
128
  - `new`: Create new Design Objects, Applications, or Keywords. Use `--update <ID>` to update instead. Run without flags to launch an interactive wizard.
@@ -105,6 +136,31 @@ For a full list of commands see `--help`.
105
136
  - `docs`: Open the Tornado Server Blackbook.
106
137
  - `execute`: Execute a command on the server.
107
138
 
139
+ ### Cloning a whole group
140
+
141
+ `vortex clone` takes an ID, a TemplateName, an application group, or `group/name`:
142
+
143
+ ```
144
+ vortex clone 13 # by ID
145
+ vortex clone bettrackr_app # by TemplateName
146
+ vortex clone bettrackr/app # by group/name
147
+ vortex clone BetTrackr # every application in the BetTrackr group
148
+ vortex clone dev:BetTrackr # ... on the 'dev' server
149
+ vortex clone --group BetTrackr # explicitly a group, never a TemplateName
150
+ ```
151
+
152
+ Groups are matched the way `vortex list --group` matches them - a
153
+ case-insensitive substring - except that an exact (case-insensitive) group name
154
+ always wins, so cloning `BetTrackr` never drags in `BetTrackrLegacy`. If a
155
+ partial name still spans several groups, vortex stops and lists them rather
156
+ than cloning the lot.
157
+
158
+ A bare word is looked up as **both** a TemplateName and a group. In the rare
159
+ case that it is genuinely both, vortex refuses to guess: use `--group NAME` for
160
+ 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.
163
+
108
164
  ### Working with Multiple Servers
109
165
 
110
166
  Each section in `servers.ini` defines a server (hosts must be unique across
@@ -128,7 +184,9 @@ apps from several servers at the same time:
128
184
  watcher doesn't know about). Finer-grained commands that alter design
129
185
  elements (`delete`, `copy`, `new`, `compile --upload`) lock
130
186
  per-application: they are refused for apps a watch is watching and run
131
- concurrently otherwise.
187
+ concurrently otherwise. `push` and `pull` lock the same way - per
188
+ application, never workspace-wide - so they can run against one app while
189
+ a watch holds others.
132
190
  - In VS Code, app folders are listed in per-server blocks (`dev: group/app`,
133
191
  ...) with the server's jars on the Java classpath (see them in the Java
134
192
  Projects view). vscode-java's classpath settings are
@@ -171,6 +229,59 @@ hard to change by accident:
171
229
  - `vortex watch` skips protected servers unless `--include-protected` is
172
230
  given, so saving a file can never hot-deploy to production by accident.
173
231
 
232
+ ### The Agent Gateway
233
+
234
+ The **agent gateway** is a JSON API served by the Puakma server itself - a companion Puakma
235
+ application (`vortex/gateway`) that you deploy to a server. Where SOAPDesigner is a transport,
236
+ the gateway is a transport *plus* the guarantees only server-side code can enforce:
237
+
238
+ - **Role-gated operations** - every endpoint requires one declared application role, checked on
239
+ the server. Roles are rows in *that server's* copy of the app, so a grant on dev confers
240
+ nothing on prod.
241
+ - **An undo journal** - destructive design writes snapshot the element first (bytes, metadata,
242
+ design params). `vortex undo` lists those snapshots and restores any of them; deleted
243
+ elements are recreatable.
244
+ - **Dry-run by default** - `undo`, element deletes, single-statement DML and whole-server
245
+ refresh do nothing without an explicit confirmation.
246
+ - **Deploy confirmation** - writes reply with the sizes and hashes of what is really on the
247
+ server now.
248
+ - **Database guardrails** - the Puakma system database is unreachable through it, and DDL is
249
+ never executed, only generated as text.
250
+
251
+ Opt in per server:
252
+
253
+ ```ini
254
+ [dev]
255
+ host = dev.example.com
256
+ backend = gateway ; default is 'soap', which never contacts the gateway
257
+ ; gateway_path = vortex/gateway.pma (this is the default)
258
+ ```
259
+
260
+ With `backend = gateway`, `watch`/`push` uploads, `delete`, `log`, `status`, `db`, `execute`
261
+ 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:
263
+
264
+ ```
265
+ vortex config --check-gateway -s dev
266
+ ```
267
+
268
+ **There is no fallback in either direction, by design.** A gateway refusal (for example, your
269
+ identity lacks the required role) is reported as an error - vortex never quietly retries the
270
+ same operation over SOAP, because that would let anyone with SOAP access bypass every role,
271
+ 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.
274
+
275
+ The gateway application is **not bundled with this CLI** - deploy it to a server with
276
+ `vortex export` / `vortex import`, then run its `Setup` scheduled action. It ships its own
277
+ `API.md`, `README.md` and `DECISIONS.md` as DOCUMENTATION design elements, so once installed
278
+ the running server documents its own endpoints, roles and setup steps.
279
+
280
+ > **Note:** the gateway's roles are only a real boundary for an identity whose *sole* route to
281
+ > the server is the gateway. Any identity that can reach `system/webdesign` or deploy code can
282
+ > grant itself any role. Keep webdesign access for operators; agent identities should not have
283
+ > it.
284
+
174
285
  ### Interactive Wizards
175
286
 
176
287
  Run `vortex new object` or `vortex new app` without any flags to launch a step-by-step wizard:
@@ -276,5 +387,12 @@ and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Ja
276
387
  snippets. Existing files are never overwritten, so they are safe to customise. These files are
277
388
  also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
278
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
+
279
397
  Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
280
398
  never touched); the new `AGENTS.md` is simply added alongside it.
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "vortex_cli"
8
- version = "5.0.0"
8
+ version = "6.0.0"
9
9
  description = "Vortex CLI"
10
10
  requires-python = ">=3.10"
11
11
  readme = { file = "README.md", content-type = "text/markdown" }