vortex-cli 6.1.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.1.0/vortex_cli.egg-info → vortex_cli-6.2.0}/PKG-INFO +1 -22
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/README.md +0 -21
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/pyproject.toml +1 -3
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/cli.py +0 -11
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/main.py +0 -7
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/workspace.py +0 -47
- {vortex_cli-6.1.0 → vortex_cli-6.2.0/vortex_cli.egg-info}/PKG-INFO +1 -22
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/SOURCES.txt +0 -7
- vortex_cli-6.1.0/vortex/commands/agent.py +0 -27
- vortex_cli-6.1.0/vortex/templates/agent/AGENTS.md +0 -100
- vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-database/SKILL.md +0 -108
- vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-design-elements/SKILL.md +0 -112
- vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-overview/SKILL.md +0 -77
- vortex_cli-6.1.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +0 -262
- vortex_cli-6.1.0/vortex/templates/agent/vortex.code-snippets +0 -437
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/LICENSE +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/setup.cfg +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/__init__.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/__main__.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/colour.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/__init__.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/agenda.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/clean.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/clone.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/code.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/compile.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/config.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/copy.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/db.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/delete.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/docs.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/execute.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/export.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/find.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/grep.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/import_.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/libs.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/list.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/log.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/new.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/pull.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/push.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/render.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/schema.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/status.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/undo.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/use.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/watch.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/constants.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook v2.md +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook.pdf +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/index.html +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/marked.min.js +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/gateway.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/lib/puakma-6.0.40.jar +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/libs.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/logging.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/models.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/soap.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/spinner.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/util.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/webdesign.py +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/entry_points.txt +0 -0
- {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/requires.txt +0 -0
- {vortex_cli-6.1.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
|
|
@@ -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
|
|
|
@@ -483,23 +482,3 @@ On a `backend = gateway` server the dictionary is reached through webdesign's vo
|
|
|
483
482
|
the gateway's `dictionary` endpoint (`GatewayDBRead` to read, `GatewayDBWrite` to change).
|
|
484
483
|
That API cannot record `--default` or `--position` (refused) nor the column half of `--ref`
|
|
485
484
|
(warned) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
|
|
486
|
-
|
|
487
|
-
### Agent Support Files
|
|
488
|
-
|
|
489
|
-
`vortex agent` copies bundled support files into the workspace `.vscode` directory so they are
|
|
490
|
-
included in the generated code-workspace: an `AGENTS.md` with Puakma ground rules for coding
|
|
491
|
-
agents (including pointers to the bundled Blackbook v2 architecture reference), a `CLAUDE.md`
|
|
492
|
-
that points Claude Code at `AGENTS.md`, a `.claude/skills/` library covering Puakma development
|
|
493
|
-
and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Java/HTML
|
|
494
|
-
snippets. Existing files are never overwritten, so they are safe to customise. These files are
|
|
495
|
-
also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
|
|
496
|
-
|
|
497
|
-
The guidance is backend-aware: on a `backend = gateway` server the skills teach the explicit
|
|
498
|
-
`vortex compile` + `vortex push` deploy loop (journaled, `undo`-recoverable, no workspace lock),
|
|
499
|
-
and the `vortex watch` save-to-deploy loop is scoped to `backend = soap`. Because existing files
|
|
500
|
-
are never overwritten, workspaces generated before 6.0.0 keep their old watch-centric copies -
|
|
501
|
-
delete a file (or the `.claude/skills` directory) and re-run `vortex agent` to pick up the
|
|
502
|
-
current version.
|
|
503
|
-
|
|
504
|
-
Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
|
|
505
|
-
never touched); the new `AGENTS.md` is simply added alongside it.
|
|
@@ -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
|
|
|
@@ -439,23 +438,3 @@ On a `backend = gateway` server the dictionary is reached through webdesign's vo
|
|
|
439
438
|
the gateway's `dictionary` endpoint (`GatewayDBRead` to read, `GatewayDBWrite` to change).
|
|
440
439
|
That API cannot record `--default` or `--position` (refused) nor the column half of `--ref`
|
|
441
440
|
(warned) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
|
|
442
|
-
|
|
443
|
-
### Agent Support Files
|
|
444
|
-
|
|
445
|
-
`vortex agent` copies bundled support files into the workspace `.vscode` directory so they are
|
|
446
|
-
included in the generated code-workspace: an `AGENTS.md` with Puakma ground rules for coding
|
|
447
|
-
agents (including pointers to the bundled Blackbook v2 architecture reference), a `CLAUDE.md`
|
|
448
|
-
that points Claude Code at `AGENTS.md`, a `.claude/skills/` library covering Puakma development
|
|
449
|
-
and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Java/HTML
|
|
450
|
-
snippets. Existing files are never overwritten, so they are safe to customise. These files are
|
|
451
|
-
also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
|
|
452
|
-
|
|
453
|
-
The guidance is backend-aware: on a `backend = gateway` server the skills teach the explicit
|
|
454
|
-
`vortex compile` + `vortex push` deploy loop (journaled, `undo`-recoverable, no workspace lock),
|
|
455
|
-
and the `vortex watch` save-to-deploy loop is scoped to `backend = soap`. Because existing files
|
|
456
|
-
are never overwritten, workspaces generated before 6.0.0 keep their old watch-centric copies -
|
|
457
|
-
delete a file (or the `.claude/skills` directory) and re-run `vortex agent` to pick up the
|
|
458
|
-
current version.
|
|
459
|
-
|
|
460
|
-
Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
|
|
461
|
-
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 = "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]
|
|
@@ -1199,17 +1199,6 @@ def add_compile_parser(command_parser: _SubParsersAction[ArgumentParser]) -> Non
|
|
|
1199
1199
|
_add_server_option(compile_parser)
|
|
1200
1200
|
|
|
1201
1201
|
|
|
1202
|
-
def add_agent_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
|
|
1203
|
-
command_parser.add_parser(
|
|
1204
|
-
"agent",
|
|
1205
|
-
help=(
|
|
1206
|
-
"Generate agent/editor support files in the workspace "
|
|
1207
|
-
"(AGENTS.md + CLAUDE.md pointer, Puakma skills, code snippets). "
|
|
1208
|
-
"Existing files are never overwritten"
|
|
1209
|
-
),
|
|
1210
|
-
)
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
1202
|
def add_execute_parser(command_parser: _SubParsersAction[ArgumentParser]) -> None:
|
|
1214
1203
|
execute_parser = command_parser.add_parser(
|
|
1215
1204
|
"execute",
|
|
@@ -14,7 +14,6 @@ from vortex import util
|
|
|
14
14
|
from vortex.colour import Colour
|
|
15
15
|
from vortex.commands.agenda import agenda
|
|
16
16
|
from vortex.commands.agenda import server_config
|
|
17
|
-
from vortex.commands.agent import agent
|
|
18
17
|
from vortex.commands.clean import clean
|
|
19
18
|
from vortex.commands.clone import clone
|
|
20
19
|
from vortex.commands.code import code
|
|
@@ -248,7 +247,6 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
248
247
|
cli.add_render_parser(command_parser)
|
|
249
248
|
cli.add_watch_parser(command_parser)
|
|
250
249
|
cli.add_docs_parser(command_parser)
|
|
251
|
-
cli.add_agent_parser(command_parser)
|
|
252
250
|
cli.add_compile_parser(command_parser)
|
|
253
251
|
cli.add_schema_parser(command_parser)
|
|
254
252
|
cli.add_execute_parser(command_parser)
|
|
@@ -291,12 +289,7 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
291
289
|
code_parser.print_help()
|
|
292
290
|
util.print_row_break()
|
|
293
291
|
remaining_args.insert(0, "--help")
|
|
294
|
-
# Ensure the agent/editor support files are mounted in the
|
|
295
|
-
# code-workspace before VS Code opens (never overwrites)
|
|
296
|
-
workspace.init_agent_files()
|
|
297
292
|
return code(workspace, remaining_args, server_name)
|
|
298
|
-
elif args.command == "agent":
|
|
299
|
-
return agent(workspace)
|
|
300
293
|
elif args.command == "docs":
|
|
301
294
|
return docs(args.serve, args.port)
|
|
302
295
|
elif args.command == "use":
|
|
@@ -186,8 +186,6 @@ class Workspace:
|
|
|
186
186
|
if not self.code_workspace_file.exists():
|
|
187
187
|
self.update_vscode_settings(reset=True)
|
|
188
188
|
|
|
189
|
-
self.init_agent_files()
|
|
190
|
-
|
|
191
189
|
logger.info(f"Initialised workspace {self.path}")
|
|
192
190
|
|
|
193
191
|
@property
|
|
@@ -570,51 +568,6 @@ class Workspace:
|
|
|
570
568
|
except (configparser.Error, ValueError) as e:
|
|
571
569
|
_error(f"Error reading server from config: {str(e)}")
|
|
572
570
|
|
|
573
|
-
# Claude Code reads CLAUDE.md rather than the agent-standard AGENTS.md.
|
|
574
|
-
# A pointer file keeps both tool families on the same instructions
|
|
575
|
-
CLAUDE_MD_POINTER = (
|
|
576
|
-
"The workspace instructions for coding agents live in @AGENTS.md - "
|
|
577
|
-
"follow that file.\n"
|
|
578
|
-
)
|
|
579
|
-
|
|
580
|
-
def init_agent_files(self) -> tuple[list[Path], list[Path]]:
|
|
581
|
-
"""
|
|
582
|
-
Copies the bundled agent/editor support files into the .vscode
|
|
583
|
-
directory: AGENTS.md (plus a CLAUDE.md pointing at it), the Puakma
|
|
584
|
-
.claude/skills library, and the vortex.code-snippets file
|
|
585
|
-
(folder-scoped, so VS Code picks it up via the .vscode workspace
|
|
586
|
-
folder). Existing files are NEVER overwritten.
|
|
587
|
-
Returns (written, skipped) paths.
|
|
588
|
-
"""
|
|
589
|
-
template_dir = Path(__file__).parent / "templates" / "agent"
|
|
590
|
-
written: list[Path] = []
|
|
591
|
-
skipped: list[Path] = []
|
|
592
|
-
for src in sorted(template_dir.rglob("*")):
|
|
593
|
-
if not src.is_file():
|
|
594
|
-
continue
|
|
595
|
-
rel = src.relative_to(template_dir)
|
|
596
|
-
if rel.parts[0] == "skills":
|
|
597
|
-
dest = self.vscode_dir / ".claude" / rel
|
|
598
|
-
elif src.suffix == ".code-snippets":
|
|
599
|
-
dest = self.vscode_dir / rel
|
|
600
|
-
else:
|
|
601
|
-
dest = self.vscode_dir / rel
|
|
602
|
-
if dest.exists():
|
|
603
|
-
skipped.append(dest)
|
|
604
|
-
continue
|
|
605
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
606
|
-
shutil.copyfile(src, dest)
|
|
607
|
-
written.append(dest)
|
|
608
|
-
|
|
609
|
-
claude_md = self.vscode_dir / "CLAUDE.md"
|
|
610
|
-
if claude_md.exists():
|
|
611
|
-
skipped.append(claude_md)
|
|
612
|
-
else:
|
|
613
|
-
claude_md.parent.mkdir(parents=True, exist_ok=True)
|
|
614
|
-
claude_md.write_text(self.CLAUDE_MD_POINTER)
|
|
615
|
-
written.append(claude_md)
|
|
616
|
-
return written, skipped
|
|
617
|
-
|
|
618
571
|
@staticmethod
|
|
619
572
|
def app_folder_name(app: PuakmaApplication) -> str:
|
|
620
573
|
"""
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -483,23 +482,3 @@ On a `backend = gateway` server the dictionary is reached through webdesign's vo
|
|
|
483
482
|
the gateway's `dictionary` endpoint (`GatewayDBRead` to read, `GatewayDBWrite` to change).
|
|
484
483
|
That API cannot record `--default` or `--position` (refused) nor the column half of `--ref`
|
|
485
484
|
(warned) - see [SOAP-free on backend = gateway](#soap-free-on-backend--gateway).
|
|
486
|
-
|
|
487
|
-
### Agent Support Files
|
|
488
|
-
|
|
489
|
-
`vortex agent` copies bundled support files into the workspace `.vscode` directory so they are
|
|
490
|
-
included in the generated code-workspace: an `AGENTS.md` with Puakma ground rules for coding
|
|
491
|
-
agents (including pointers to the bundled Blackbook v2 architecture reference), a `CLAUDE.md`
|
|
492
|
-
that points Claude Code at `AGENTS.md`, a `.claude/skills/` library covering Puakma development
|
|
493
|
-
and the vortex workflow, and a `vortex.code-snippets` file with common Puakma Java/HTML
|
|
494
|
-
snippets. Existing files are never overwritten, so they are safe to customise. These files are
|
|
495
|
-
also generated automatically on `vortex --init` and before `vortex code` opens the workspace.
|
|
496
|
-
|
|
497
|
-
The guidance is backend-aware: on a `backend = gateway` server the skills teach the explicit
|
|
498
|
-
`vortex compile` + `vortex push` deploy loop (journaled, `undo`-recoverable, no workspace lock),
|
|
499
|
-
and the `vortex watch` save-to-deploy loop is scoped to `backend = soap`. Because existing files
|
|
500
|
-
are never overwritten, workspaces generated before 6.0.0 keep their old watch-centric copies -
|
|
501
|
-
delete a file (or the `.claude/skills` directory) and re-run `vortex agent` to pick up the
|
|
502
|
-
current version.
|
|
503
|
-
|
|
504
|
-
Workspaces created before AGENTS.md existed keep their full `CLAUDE.md` (existing files are
|
|
505
|
-
never touched); the new `AGENTS.md` is simply added alongside it.
|
|
@@ -18,7 +18,6 @@ vortex/webdesign.py
|
|
|
18
18
|
vortex/workspace.py
|
|
19
19
|
vortex/commands/__init__.py
|
|
20
20
|
vortex/commands/agenda.py
|
|
21
|
-
vortex/commands/agent.py
|
|
22
21
|
vortex/commands/clean.py
|
|
23
22
|
vortex/commands/clone.py
|
|
24
23
|
vortex/commands/code.py
|
|
@@ -50,12 +49,6 @@ vortex/docs/Blackbook.pdf
|
|
|
50
49
|
vortex/docs/index.html
|
|
51
50
|
vortex/docs/marked.min.js
|
|
52
51
|
vortex/lib/puakma-6.0.40.jar
|
|
53
|
-
vortex/templates/agent/AGENTS.md
|
|
54
|
-
vortex/templates/agent/vortex.code-snippets
|
|
55
|
-
vortex/templates/agent/skills/puakma-database/SKILL.md
|
|
56
|
-
vortex/templates/agent/skills/puakma-design-elements/SKILL.md
|
|
57
|
-
vortex/templates/agent/skills/puakma-overview/SKILL.md
|
|
58
|
-
vortex/templates/agent/skills/vortex-workflow/SKILL.md
|
|
59
52
|
vortex_cli.egg-info/PKG-INFO
|
|
60
53
|
vortex_cli.egg-info/SOURCES.txt
|
|
61
54
|
vortex_cli.egg-info/dependency_links.txt
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import logging
|
|
4
|
-
|
|
5
|
-
from vortex.workspace import Workspace
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger("vortex")
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def agent(workspace: Workspace) -> int:
|
|
11
|
-
"""
|
|
12
|
-
Generates the agent/editor support files (AGENTS.md with a CLAUDE.md
|
|
13
|
-
pointer, Puakma skills, code snippets) in the workspace .vscode
|
|
14
|
-
directory. Existing files are never overwritten.
|
|
15
|
-
"""
|
|
16
|
-
written, skipped = workspace.init_agent_files()
|
|
17
|
-
for path in written:
|
|
18
|
-
logger.info(f"Created '{path}'")
|
|
19
|
-
for path in skipped:
|
|
20
|
-
logger.debug(f"Skipped existing '{path}'")
|
|
21
|
-
if not written:
|
|
22
|
-
logger.info(f"All {len(skipped)} agent file(s) already exist. Nothing to do.")
|
|
23
|
-
else:
|
|
24
|
-
logger.info(
|
|
25
|
-
f"Created {len(written)} file(s), kept {len(skipped)} existing file(s)."
|
|
26
|
-
)
|
|
27
|
-
return 0
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# Puakma / vortex workspace
|
|
2
|
-
|
|
3
|
-
This is a **vortex-cli workspace**: Puakma Tornado applications cloned from a live server into
|
|
4
|
-
`$VORTEX_HOME` as `{host}/{group}/{app}/` folders, edited locally and synced back with the
|
|
5
|
-
`vortex` CLI. There is **no git, no Maven/Gradle, no test framework** inside app folders - do not
|
|
6
|
-
look for them and do not scaffold them.
|
|
7
|
-
|
|
8
|
-
A skill library exists in `.claude/skills/`. **Load `puakma-overview` before doing anything
|
|
9
|
-
else** - it explains the Puakma mental model and routes to the specialist skills
|
|
10
|
-
(design elements, database, vortex workflow).
|
|
11
|
-
|
|
12
|
-
**Check every cloned app for its own documentation.** An app's `DOCUMENTATION/` design folder may
|
|
13
|
-
contain an `AGENTS.md`/`CLAUDE.md`, architecture notes, or run-books specific to that app - read
|
|
14
|
-
them before editing that app. App-specific instructions override the general rules here.
|
|
15
|
-
|
|
16
|
-
## Non-negotiable rules
|
|
17
|
-
|
|
18
|
-
1. **The server executes compiled bytes, not source.** A saved `.java` changes nothing on the
|
|
19
|
-
server until BOTH halves ship: the source, and the `.class` the local Java build produces in
|
|
20
|
-
`zbin/`. Two deploy paths exist - `vortex push <APP_ID>`, which uploads both halves in one
|
|
21
|
-
explicit step, and `vortex watch`, which uploads each on save. Which one applies depends on
|
|
22
|
-
the server's backend (see "Deploying a change" below). If the local build fails, the server
|
|
23
|
-
keeps running old bytecode with new source attached - silent drift. Wait for a clean build
|
|
24
|
-
and the `Upload DATA ...: OK` line.
|
|
25
|
-
2. **No nested/inner/anonymous classes (and no lambdas) in design-element Java.** The server
|
|
26
|
-
packages one class per design element; `Outer$Inner.class` never ships - it compiles locally
|
|
27
|
-
and fails on the server. Use `Object[]` tuples or separate top-level SHARED_CODE classes.
|
|
28
|
-
3. **Deploying is a deliberate step - never assume a watcher is running.** On a gateway
|
|
29
|
-
server nothing reaches the server until you run `vortex push`; a saved file is a local
|
|
30
|
-
file. On a SOAP server where the user is running `vortex watch`, the opposite holds - every
|
|
31
|
-
save while it runs IS a live deployment, across apps from ALL configured servers at once,
|
|
32
|
-
routed to the server each app was cloned from (upload lines are prefixed `[server]`).
|
|
33
|
-
Establish which situation you are in before editing, and confirm with the user before any
|
|
34
|
-
deliberate deploy step.
|
|
35
|
-
4. **Never print credentials.** `config/servers.ini` may hold plaintext server passwords
|
|
36
|
-
(they can also live in the OS keyring or env vars) and every `.pma` manifest is a pickle
|
|
37
|
-
embedding DB connection credentials - never `cat` either, never paste their contents.
|
|
38
|
-
5. **Production safety.** NEVER run any vortex command against a production server without
|
|
39
|
-
explicit user permission for that specific command - including read-only ones. Production
|
|
40
|
-
definitions should carry `protected = true` in servers.ini: writes then require the server
|
|
41
|
-
name typed back (`--yes` does not bypass it) and watch skips them unless
|
|
42
|
-
`--include-protected` - treat that as a backstop, not permission. Prefer one-off
|
|
43
|
-
`-s <prod-server>` over `vortex use <prod-server>` (which persists); treat any prod clone
|
|
44
|
-
directory as read-only outside a deliberate, confirmed promotion.
|
|
45
|
-
6. **`vortex clean` and `vortex delete` have no undo.** There is no git to recover from.
|
|
46
|
-
|
|
47
|
-
## Deploying a change
|
|
48
|
-
|
|
49
|
-
Check the server's backend before deploying - it decides which path works:
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
vortex config --check-gateway -s <server>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
That reports the configured backend, the negotiation result, the resolved identity and which
|
|
56
|
-
`Gateway*` roles it holds. `backend` is an explicit per-server setting with no auto mode: a
|
|
57
|
-
gateway refusal or outage is an error, never a silent fallback to SOAP.
|
|
58
|
-
|
|
59
|
-
- **`backend = gateway`** (the recommended setup): `vortex compile <APP_ID>` and require a clean
|
|
60
|
-
build, then `vortex push <APP_ID>` - or `vortex push <APP_ID> -n <NAME>` for a single
|
|
61
|
-
element.
|
|
62
|
-
`vortex watch`'s upload path runs over SOAP/webdesign, which a least-privilege gateway
|
|
63
|
-
identity has no access to, so watch cannot deploy on such a server.
|
|
64
|
-
- **`backend = soap`**: the `vortex watch` save-to-deploy loop remains correct - start it,
|
|
65
|
-
edit, and watch for the `Upload SOURCE ...: OK` / `Upload DATA ...: OK` pair.
|
|
66
|
-
|
|
67
|
-
On a gateway server prefer `push` even for a privileged identity: it is explicit rather than
|
|
68
|
-
incidental, journalled server-side so `vortex undo` can restore the previous version, ships
|
|
69
|
-
source and compiled class together, and takes no workspace-wide lock - which is why the
|
|
70
|
-
"stop `vortex watch` first" preamble attached to other commands does not apply to it.
|
|
71
|
-
|
|
72
|
-
Full loop, refusals and the two paths that are still SOAP-only: `.claude/skills/vortex-workflow`.
|
|
73
|
-
|
|
74
|
-
## Quick reference
|
|
75
|
-
|
|
76
|
-
- Deploy loops (push and watch), servers, creating elements, undo, prod promotion:
|
|
77
|
-
`.claude/skills/vortex-workflow`
|
|
78
|
-
- ACTION/PAGE/RESOURCE conventions and `<P@ ... @P>` merge tags: `.claude/skills/puakma-design-elements`
|
|
79
|
-
- TableManager vs raw JDBC, SQL escaping, connection release: `.claude/skills/puakma-database`
|
|
80
|
-
- Canonical code patterns: `.vscode/vortex.code-snippets` holds vetted scaffolds for
|
|
81
|
-
Open/Save/AJAX/Scheduled actions, TableManager and JDBC access, JSON responses,
|
|
82
|
-
logging, `<P@ ... @P>` page tags and AJAX JavaScript. When writing a new design
|
|
83
|
-
element or unsure of the idiomatic shape, start from the matching snippet body
|
|
84
|
-
(`pOpen`, `pSave`, `pAjax`, `pTMsave`, `pJDBC`, ...) instead of inventing a pattern.
|
|
85
|
-
- Verify changes by tailing the server log: `vortex log -n 20 -k`
|
|
86
|
-
|
|
87
|
-
## Architecture reference: the Blackbook v2
|
|
88
|
-
|
|
89
|
-
For server architecture, request lifecycle, the Puakma API surface, addins/tasks,
|
|
90
|
-
security model and anything not covered by the skills, consult the **Tornado Server
|
|
91
|
-
Blackbook v2** - it is the authoritative architecture reference and is bundled with
|
|
92
|
-
vortex:
|
|
93
|
-
|
|
94
|
-
- `docs/Blackbook v2.md` - markdown, readable/searchable directly (the `docs` folder
|
|
95
|
-
is mounted in the code-workspace)
|
|
96
|
-
- `vortex docs --serve` - serves it as a searchable local website
|
|
97
|
-
- `vortex docs` - opens the original Blackbook PDF
|
|
98
|
-
|
|
99
|
-
Prefer the Blackbook v2 markdown when answering architecture questions or designing
|
|
100
|
-
non-trivial features rather than guessing from code alone.
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: puakma-database
|
|
3
|
-
description: Data access in Puakma apps - TableManager for writes, raw JDBC for reads, SQL string
|
|
4
|
-
escaping, connection pool discipline, and the strict no-DDL rule. Use when writing or debugging
|
|
5
|
-
SQL or JDBC in a design element, choosing between TableManager and raw JDBC, diagnosing a
|
|
6
|
-
connection-pool leak or a server hang, or when asked to add a table/column/index.
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Puakma database access
|
|
10
|
-
|
|
11
|
-
Puakma apps use string-built SQL over server-pooled JDBC connections. There is no ORM, no
|
|
12
|
-
migration framework, and typically no transactions - follow the app's existing patterns.
|
|
13
|
-
|
|
14
|
-
## STRICT RULES
|
|
15
|
-
|
|
16
|
-
- **NEVER create, alter, or drop tables, columns, or indexes - no DDL, ever.** Not through
|
|
17
|
-
`vortex db`, not through code, not through TableManager. Schema changes are designed as SQL,
|
|
18
|
-
written into the app's changelog/run-book (check its `DOCUMENTATION/` folder), and run BY THE
|
|
19
|
-
USER by hand. If a task needs a schema change, write the SQL for the user and stop.
|
|
20
|
-
- **`vortex db` requires explicit user permission every time - no exceptions.** That includes
|
|
21
|
-
`--list`, `--schema`, and read-only SELECTs. Ask, show the exact command and SQL, and wait
|
|
22
|
-
for a clear yes before running it. `--update` (INSERT/UPDATE/DELETE) additionally requires
|
|
23
|
-
approval per statement, and on servers marked `protected = true` vortex itself will demand
|
|
24
|
-
the server name typed back - that backstop is not a substitute for asking.
|
|
25
|
-
- **Writes from code go through `TableManager`** (`setField`/`insertRow`/`updateRow`), never raw
|
|
26
|
-
`executeUpdate`. Reads may use raw JDBC.
|
|
27
|
-
- **Raw JDBC must release everything in `finally`**: `Util.closeJDBC(rs)`,
|
|
28
|
-
`Util.closeJDBC(stmt)`, `pSession.releaseDataConnection(cx)`. Connections are server-pooled;
|
|
29
|
-
one missed release leaks a pooled connection per request until the whole server hangs. Never
|
|
30
|
-
`return` before the `finally`.
|
|
31
|
-
- **Escape every string; parse every number.** Use the app's SQL-escape helper (commonly an
|
|
32
|
-
`escapeSQL` in a shared class - it doubles `'` but does not add the surrounding quotes) for
|
|
33
|
-
any string that reaches SQL; parse numerics to `long`/`double` before concatenation.
|
|
34
|
-
Unescaped concatenation is an injection.
|
|
35
|
-
- **Don't add transactions** unless the app already uses them. Existing apps follow
|
|
36
|
-
check-then-write and idempotent-upsert styles; imitate them.
|
|
37
|
-
- **Never hardcode connection names or table names** when the app defines constants for them -
|
|
38
|
-
look for `CONNECTION_NAME` / `TABLE_NAME` / `PK` style constants in SHARED_CODE.
|
|
39
|
-
|
|
40
|
-
## Pattern 1 - TableManager (single-row CRUD)
|
|
41
|
-
|
|
42
|
-
`puakma.addin.http.document.TableManager` acquires and releases its own connection - no
|
|
43
|
-
try/finally needed at call sites.
|
|
44
|
-
|
|
45
|
-
```java
|
|
46
|
-
// Insert
|
|
47
|
-
TableManager t = new TableManager(pSession, CONNECTION_NAME, "my_table");
|
|
48
|
-
t.setField("name", sName); // strings are escaped by TableManager
|
|
49
|
-
t.setField("created", new Date());
|
|
50
|
-
if (t.insertRow("my_table_id")) {
|
|
51
|
-
long lNewID = t.getLastInsertID();
|
|
52
|
-
} else {
|
|
53
|
-
pSession.getSystemContext().doError("Insert failed: " + t.getLastError(), this);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Update - always scope user-owned rows by the owner id, even with a PK match
|
|
57
|
-
t.setField("value", sValue);
|
|
58
|
-
t.updateRow("WHERE my_table_id = " + lID + " AND user_id = " + lUserID);
|
|
59
|
-
|
|
60
|
-
// Quick single-row read / form prefill
|
|
61
|
-
TableManager tm = new TableManager(pSession, CONNECTION_NAME, "");
|
|
62
|
-
tm.populateDocument("SELECT * FROM my_table WHERE my_table_id = " + lID);
|
|
63
|
-
String s = tm.getFieldString("name");
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Pattern 2 - raw JDBC (reads, multi-row)
|
|
67
|
-
|
|
68
|
-
```java
|
|
69
|
-
Connection cx = null;
|
|
70
|
-
Statement stmt = null;
|
|
71
|
-
ResultSet rs = null;
|
|
72
|
-
try {
|
|
73
|
-
cx = pSession.getDataConnection(CONNECTION_NAME);
|
|
74
|
-
stmt = cx.createStatement();
|
|
75
|
-
rs = stmt.executeQuery(sSQL);
|
|
76
|
-
while (rs.next()) {
|
|
77
|
-
// ...
|
|
78
|
-
}
|
|
79
|
-
} catch (Exception e) {
|
|
80
|
-
pSystem.doError(e.toString(), this);
|
|
81
|
-
} finally {
|
|
82
|
-
Util.closeJDBC(rs);
|
|
83
|
-
Util.closeJDBC(stmt);
|
|
84
|
-
pSession.releaseDataConnection(cx);
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Performance cautions
|
|
89
|
-
|
|
90
|
-
- Avoid `LIKE '%...%'` scans on large tables in hot paths (request handlers, polling ajax) -
|
|
91
|
-
they have caused production pool-starvation outages. Prefer indexed equality/prefix filters.
|
|
92
|
-
- Avoid N+1 query loops in request handlers; batch with `IN (...)` or a join.
|
|
93
|
-
- Every request handler shares one connection pool - a slow query under load stalls the server.
|
|
94
|
-
|
|
95
|
-
## Inspecting schema (read-only, ONLY with explicit user permission)
|
|
96
|
-
|
|
97
|
-
- `vortex db <dbname> --list` - tables in a database.
|
|
98
|
-
- `vortex db <dbname> --schema <table>` - columns, PKs, references.
|
|
99
|
-
- `vortex db <conn-id> --sql "SELECT ..."` - vortex appends a LIMIT if the query has none.
|
|
100
|
-
|
|
101
|
-
## Planning schema changes: vortex schema (dictionary only, never DDL)
|
|
102
|
-
|
|
103
|
-
`vortex schema <dbname> --add-table/--add-column/--update-column/--ddl ...` records
|
|
104
|
-
design-time table/column definitions in Puakma's data dictionary (PMATABLE/ATTRIBUTE) and
|
|
105
|
-
prints the matching DDL for the USER to run by hand - it never executes DDL itself, and
|
|
106
|
-
`vortex db --schema` reads this dictionary, so keeping it current keeps schema inspection
|
|
107
|
-
accurate. It still writes to the live server's system database, so like `vortex db` it
|
|
108
|
-
requires explicit user permission every time.
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: puakma-design-elements
|
|
3
|
-
description: Writing Puakma design elements - ACTION Java classes (the ActionRunner execute()
|
|
4
|
-
contract, Open*/Save*/ajax* conventions, reading requests, writing responses), PAGE templates
|
|
5
|
-
(<P@ ... @P> merge tags, ParentPage/OpenAction/SaveAction design params), RESOURCEs, and
|
|
6
|
-
SCHEDULED_ACTIONs. Use when adding or editing an endpoint, page, script/stylesheet, or
|
|
7
|
-
background job, when a page renders blank, a merge tag renders empty or literal, or an endpoint
|
|
8
|
-
answers "Action Done:" (either a handler that wrote nothing, or a stale compiled class).
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Puakma design elements
|
|
12
|
-
|
|
13
|
-
## ACTION classes
|
|
14
|
-
|
|
15
|
-
Every HTTP endpoint is a default-package Java class in `ACTION/` extending
|
|
16
|
-
`puakma.system.ActionRunner`. Inherited fields: `pSession` (`HTTPSessionContext`), `pSystem`
|
|
17
|
-
(`SystemContext`), `ActionDocument` (`HTMLDocument` - the request/response document). Override
|
|
18
|
-
`public String execute()`.
|
|
19
|
-
|
|
20
|
-
| `execute()` returns | Effect |
|
|
21
|
-
|---|---|
|
|
22
|
-
| `""` | Normal flow: OpenAction -> page merges and renders; SaveAction -> page redisplays |
|
|
23
|
-
| non-empty string | Redirect (relative page name or full URL) |
|
|
24
|
-
| `""` after `write()`/`setBuffer()` | The buffer is the whole response; page merge is skipped |
|
|
25
|
-
| `""` after `streamToClient()` | Raw bytes already sent |
|
|
26
|
-
|
|
27
|
-
If a directly-invoked action (`?OpenAction`) writes nothing and returns `""`, the server answers
|
|
28
|
-
`Action Done: <date>` - that body means the handler forgot to write.
|
|
29
|
-
|
|
30
|
-
`Action Done:` has a second cause worth knowing: if the *source* clearly writes a response, the
|
|
31
|
-
endpoint answers `Action Done:` anyway, other endpoints on the same app answer correctly and the
|
|
32
|
-
server log shows no exception, the server is running a **stale compiled class** for that element
|
|
33
|
-
- not a client bug and not an auth problem. Recompile and upload it (`vortex compile <APP_ID>`
|
|
34
|
-
then `vortex push <APP_ID> -n <NAME>`); the fix often needs no source change at all. Any session
|
|
35
|
-
that compiles locally without uploading leaves this trap behind.
|
|
36
|
-
|
|
37
|
-
**Naming conventions**: `Open<Page>` = page OpenAction; `Save<Page>` = page SaveAction;
|
|
38
|
-
`ajax<Area>` = POST endpoint dispatched on an `action` form item; lower-case names = direct
|
|
39
|
-
utility endpoints. Class name == design element name.
|
|
40
|
-
|
|
41
|
-
**Reading the request**: query string via `ActionDocument.getParameter(name)` /
|
|
42
|
-
`getParameterInteger`; POSTed form fields become document items -
|
|
43
|
-
`getItemValue/getItemIntegerValue/getItemNumericValue/getItemBooleanValue/getItemDateValue`;
|
|
44
|
-
HTTP metadata items are `@`-prefixed (`@Peer-IP`); server keywords via
|
|
45
|
-
`pSession.getKeywordValue(name)`.
|
|
46
|
-
|
|
47
|
-
**Writing the response**: `ActionDocument.setItemValue(name, value)` fills `<P@ ... @P>` tags;
|
|
48
|
-
`setItemChoices(name, choices)` fills lists (`"Display|value"` strings); `write(String)` appends
|
|
49
|
-
to the buffer; `setBuffer(byte[])` replaces it; `setContentType(...)` sets the type. Extra
|
|
50
|
-
headers: `ActionDocument.setExtraHeaderValue(name, value, true)`.
|
|
51
|
-
|
|
52
|
-
**Logging**: `pSystem.doInformation(msg, this)` / `doError` / `doDebug(0, msg, this)` - pass
|
|
53
|
-
`this` so log lines carry the action name. Stack traces: `Util.logStackTrace(e, pSystem, 999)`.
|
|
54
|
-
House style is catch-all `catch (Exception e)` + log + degrade gracefully.
|
|
55
|
-
|
|
56
|
-
**Common ajax contract**: many apps treat a response body starting `"ERROR:"` as failure and an
|
|
57
|
-
empty body as an error too - success paths should `write("OK")` or a payload. Check the app's
|
|
58
|
-
JS helpers before inventing a new contract.
|
|
59
|
-
|
|
60
|
-
## PAGE templates
|
|
61
|
-
|
|
62
|
-
A PAGE is an HTML **fragment** merged into a parent layout, substituting `<P@ ... @P>` tags from
|
|
63
|
-
document items set by its OpenAction. The wiring lives in server-side **design params**, not the
|
|
64
|
-
markup: `OpenAction` (runs before render), `SaveAction` (runs on `?SavePage` POST), `ParentPage`
|
|
65
|
-
(layout receiving the fragment), `AnonymousAccess=1` (no login required).
|
|
66
|
-
|
|
67
|
-
- Inspect wiring with `vortex find <name> --show-params` - never guess from markup.
|
|
68
|
-
- Common merge tags: `<P@Computed name="x" @P>` (server-set HTML/text), `<P@Page name @P>`
|
|
69
|
-
(include another page), `<P@ChildPage @P>` (layout slot), `<P@Text/Hidden/TextArea/Checkbox/
|
|
70
|
-
List ... @P>` (form inputs that round-trip via document items), `<P@HideStart/HideEnd
|
|
71
|
-
name="HideWhenX" @P>` (blocks stripped when the boolean item is true), `<P@Form @P>`,
|
|
72
|
-
`<P@Path @P>`.
|
|
73
|
-
- URLs: `page` or `page?OpenPage` renders; `action?OpenAction` runs an action directly;
|
|
74
|
-
`page?SavePage` posts to the page's SaveAction.
|
|
75
|
-
- A blank page usually means a leftover `write()` in the OpenAction or a pre-action chain.
|
|
76
|
-
- An empty `<P@Computed>` spot means an item-name mismatch with the `setItemValue` call.
|
|
77
|
-
- Apps often run a global pre-action (security/gating) before every request, named in
|
|
78
|
-
app-level params invisible in the clone - unexpected redirects usually come from there.
|
|
79
|
-
|
|
80
|
-
## RESOURCEs
|
|
81
|
-
|
|
82
|
-
JS/CSS/images served to the browser. Locally the files carry a double extension
|
|
83
|
-
(`app_v1.js.js`) - reference them by design-element name (`app_v1.js`), never the local
|
|
84
|
-
filename. Many apps version resources by filename (`_v1.28`) for cache busting: adding a
|
|
85
|
-
version means creating a new element and updating the includes, not editing in place.
|
|
86
|
-
|
|
87
|
-
## SCHEDULED_ACTIONs
|
|
88
|
-
|
|
89
|
-
Background jobs extending `ActionRunner`, same `execute()` contract, run by the server's agenda
|
|
90
|
-
scheduler - the **schedule lives server-side**, not in the clone. Conventions: log start/finish
|
|
91
|
-
with `pSystem.doInformation`; long loops should check `shouldQuit()` and exit cleanly; design
|
|
92
|
-
jobs to be rerun-safe (they will be force-run during debugging: `vortex execute --run` runs the
|
|
93
|
-
job FOR REAL). View schedules with `vortex agenda` (decoded schedule, last and next run,
|
|
94
|
-
overdue flag - gateway only) or `vortex execute --schedule` via the console.
|
|
95
|
-
|
|
96
|
-
## New-element checklist
|
|
97
|
-
|
|
98
|
-
1. `vortex new object -t <type> --app-id <APP_ID> -n <Name>`. Pages: wire
|
|
99
|
-
`--parent-page/--open-action/--save-action` at creation. `new` takes the app's lock, so if a
|
|
100
|
-
`vortex watch` is watching that app it fails with `WorkspaceInUseError` - stop that watch,
|
|
101
|
-
create, restart it.
|
|
102
|
-
2. Write the code, starting from the matching scaffold in `.vscode/vortex.code-snippets`
|
|
103
|
-
(`pOpen`, `pSave`, `pAjax`, `pScheduled`, ...) when one exists.
|
|
104
|
-
3. Deploy it - a new local file leaves the server-side element empty until something uploads it.
|
|
105
|
-
On `backend = gateway`: `vortex compile <APP_ID>` for a clean build, then
|
|
106
|
-
`vortex push <APP_ID>` (both SOURCE and the compiled class ship in that one step). On
|
|
107
|
-
`backend = soap`: save under a running `vortex watch` and wait for both `Upload ...: OK`
|
|
108
|
-
lines. See vortex-workflow for the full loop.
|
|
109
|
-
4. Consider gating: does the app have a global security pre-action, premium/admin arrays, or an
|
|
110
|
-
`AnonymousAccess` requirement? Check the app's DOCUMENTATION and existing similar elements.
|
|
111
|
-
5. Verify by exercising the URL while tailing `vortex log -k`, or render the page server-side
|
|
112
|
-
with `vortex render <APP> <PAGE>`.
|