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.
- {vortex_cli-6.0.0/vortex_cli.egg-info → vortex_cli-6.2.0}/PKG-INFO +75 -33
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/README.md +74 -32
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/pyproject.toml +1 -3
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/cli.py +22 -17
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/clean.py +14 -13
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/clone.py +73 -49
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/compile.py +7 -2
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/config.py +1 -2
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/copy.py +29 -4
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/db.py +99 -11
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/delete.py +24 -10
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/export.py +16 -4
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/new.py +51 -17
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/pull.py +1 -1
- vortex_cli-6.2.0/vortex/commands/schema.py +669 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/watch.py +44 -7
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/gateway.py +64 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/main.py +35 -8
- vortex_cli-6.2.0/vortex/webdesign.py +653 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/workspace.py +0 -47
- {vortex_cli-6.0.0 → vortex_cli-6.2.0/vortex_cli.egg-info}/PKG-INFO +75 -33
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/SOURCES.txt +0 -7
- vortex_cli-6.0.0/vortex/commands/agent.py +0 -27
- vortex_cli-6.0.0/vortex/commands/schema.py +0 -400
- vortex_cli-6.0.0/vortex/templates/agent/AGENTS.md +0 -100
- vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-database/SKILL.md +0 -108
- vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-design-elements/SKILL.md +0 -112
- vortex_cli-6.0.0/vortex/templates/agent/skills/puakma-overview/SKILL.md +0 -77
- vortex_cli-6.0.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +0 -258
- vortex_cli-6.0.0/vortex/templates/agent/vortex.code-snippets +0 -437
- vortex_cli-6.0.0/vortex/webdesign.py +0 -120
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/LICENSE +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/setup.cfg +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/__init__.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/__main__.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/colour.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/__init__.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/agenda.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/code.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/docs.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/execute.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/find.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/grep.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/import_.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/libs.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/list.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/log.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/push.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/render.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/status.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/undo.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/commands/use.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/constants.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook v2.md +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook.pdf +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/index.html +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/docs/marked.min.js +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/lib/puakma-6.0.40.jar +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/libs.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/logging.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/models.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/soap.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/spinner.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex/util.py +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/entry_points.txt +0 -0
- {vortex_cli-6.0.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
|
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).
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
server
|
|
161
|
-
|
|
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`)
|
|
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.
|
|
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
|
|
317
|
-
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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
|
|
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).
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
server
|
|
117
|
-
|
|
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`)
|
|
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.
|
|
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
|
|
273
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
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.
|
|
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=
|
|
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.
|
|
508
|
-
"
|
|
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
|
-
"--
|
|
542
|
+
"--check",
|
|
529
543
|
action="store_true",
|
|
530
544
|
help=(
|
|
531
|
-
"
|
|
532
|
-
"
|
|
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
|
|
13
|
-
clean refuses to delete a clone holding local
|
|
14
|
-
have, naming each file
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
128
|
+
if check and cloned_apps:
|
|
128
129
|
if _apply_gate(workspace, cloned_apps):
|
|
129
130
|
return 1
|
|
130
131
|
|