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.
Files changed (66) hide show
  1. {vortex_cli-6.1.0/vortex_cli.egg-info → vortex_cli-6.2.0}/PKG-INFO +1 -22
  2. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/README.md +0 -21
  3. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/pyproject.toml +1 -3
  4. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/cli.py +0 -11
  5. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/main.py +0 -7
  6. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/workspace.py +0 -47
  7. {vortex_cli-6.1.0 → vortex_cli-6.2.0/vortex_cli.egg-info}/PKG-INFO +1 -22
  8. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/SOURCES.txt +0 -7
  9. vortex_cli-6.1.0/vortex/commands/agent.py +0 -27
  10. vortex_cli-6.1.0/vortex/templates/agent/AGENTS.md +0 -100
  11. vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-database/SKILL.md +0 -108
  12. vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-design-elements/SKILL.md +0 -112
  13. vortex_cli-6.1.0/vortex/templates/agent/skills/puakma-overview/SKILL.md +0 -77
  14. vortex_cli-6.1.0/vortex/templates/agent/skills/vortex-workflow/SKILL.md +0 -262
  15. vortex_cli-6.1.0/vortex/templates/agent/vortex.code-snippets +0 -437
  16. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/LICENSE +0 -0
  17. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/setup.cfg +0 -0
  18. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/__init__.py +0 -0
  19. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/__main__.py +0 -0
  20. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/colour.py +0 -0
  21. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/__init__.py +0 -0
  22. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/agenda.py +0 -0
  23. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/clean.py +0 -0
  24. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/clone.py +0 -0
  25. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/code.py +0 -0
  26. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/compile.py +0 -0
  27. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/config.py +0 -0
  28. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/copy.py +0 -0
  29. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/db.py +0 -0
  30. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/delete.py +0 -0
  31. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/docs.py +0 -0
  32. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/execute.py +0 -0
  33. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/export.py +0 -0
  34. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/find.py +0 -0
  35. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/grep.py +0 -0
  36. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/import_.py +0 -0
  37. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/libs.py +0 -0
  38. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/list.py +0 -0
  39. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/log.py +0 -0
  40. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/new.py +0 -0
  41. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/pull.py +0 -0
  42. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/push.py +0 -0
  43. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/render.py +0 -0
  44. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/schema.py +0 -0
  45. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/status.py +0 -0
  46. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/undo.py +0 -0
  47. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/use.py +0 -0
  48. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/commands/watch.py +0 -0
  49. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/constants.py +0 -0
  50. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook v2.md +0 -0
  51. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/Blackbook.pdf +0 -0
  52. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/index.html +0 -0
  53. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/docs/marked.min.js +0 -0
  54. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/gateway.py +0 -0
  55. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/lib/puakma-6.0.40.jar +0 -0
  56. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/libs.py +0 -0
  57. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/logging.py +0 -0
  58. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/models.py +0 -0
  59. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/soap.py +0 -0
  60. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/spinner.py +0 -0
  61. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/util.py +0 -0
  62. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex/webdesign.py +0 -0
  63. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/dependency_links.txt +0 -0
  64. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/entry_points.txt +0 -0
  65. {vortex_cli-6.1.0 → vortex_cli-6.2.0}/vortex_cli.egg-info/requires.txt +0 -0
  66. {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.1.0
3
+ Version: 6.2.0
4
4
  Summary: Vortex CLI
5
5
  Author-email: Jordan Amos <jordan.amos@gmail.com>
6
6
  License: MIT License
@@ -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.1.0"
8
+ version = "6.2.0"
9
9
  description = "Vortex CLI"
10
10
  requires-python = ">=3.10"
11
11
  readme = { file = "README.md", content-type = "text/markdown" }
@@ -41,8 +41,6 @@ vortex = [
41
41
  "docs/Blackbook v2.md",
42
42
  "docs/index.html",
43
43
  "docs/marked.min.js",
44
- "templates/agent/*",
45
- "templates/agent/skills/*/*",
46
44
  ]
47
45
 
48
46
  [tool.mypy]
@@ -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.1.0
3
+ Version: 6.2.0
4
4
  Summary: Vortex CLI
5
5
  Author-email: Jordan Amos <jordan.amos@gmail.com>
6
6
  License: MIT License
@@ -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>`.