Round 501-510: Testing frameworks, code quality, doc generators, embedded, FPGA, HPC (200 commands)

ober

572c127ea81d08303f24eaa305407b2f11de1b25

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 511ddc6..6acd7db 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,256 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 510 — Lmod, Singularity, Apptainer, Charliecloud
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `lmod-load` | :orange_circle: Scaffolded | Lmod: load module |
+| `lmod-avail` | :orange_circle: Scaffolded | Lmod: available modules |
+| `lmod-spider` | :orange_circle: Scaffolded | Lmod: spider search |
+| `lmod-list` | :orange_circle: Scaffolded | Lmod: list loaded |
+| `lmod-save` | :orange_circle: Scaffolded | Lmod: save collection |
+| `singularity-build` | :orange_circle: Scaffolded | Singularity: build image |
+| `singularity-run` | :orange_circle: Scaffolded | Singularity: run container |
+| `singularity-exec` | :orange_circle: Scaffolded | Singularity: exec command |
+| `singularity-shell` | :orange_circle: Scaffolded | Singularity: shell into |
+| `singularity-pull` | :orange_circle: Scaffolded | Singularity: pull image |
+| `apptainer-build` | :orange_circle: Scaffolded | Apptainer: build image |
+| `apptainer-run` | :orange_circle: Scaffolded | Apptainer: run container |
+| `apptainer-exec` | :orange_circle: Scaffolded | Apptainer: exec command |
+| `apptainer-shell` | :orange_circle: Scaffolded | Apptainer: shell into |
+| `apptainer-pull` | :orange_circle: Scaffolded | Apptainer: pull image |
+| `charliecloud-build` | :orange_circle: Scaffolded | Charliecloud: build image |
+| `charliecloud-run` | :orange_circle: Scaffolded | Charliecloud: run container |
+| `charliecloud-pull` | :orange_circle: Scaffolded | Charliecloud: pull image |
+| `charliecloud-push` | :orange_circle: Scaffolded | Charliecloud: push image |
+| `charliecloud-list` | :orange_circle: Scaffolded | Charliecloud: list images |
+
+### Round 509 — CUDA ext, OpenCL, Spack, EasyBuild
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `cuda-compile` | :orange_circle: Scaffolded | CUDA: compile kernel |
+| `cuda-profile` | :orange_circle: Scaffolded | CUDA: profile execution |
+| `cuda-memcheck` | :orange_circle: Scaffolded | CUDA: memory check |
+| `cuda-debug` | :orange_circle: Scaffolded | CUDA: debug session |
+| `cuda-info` | :orange_circle: Scaffolded | CUDA: device info |
+| `opencl-info` | :orange_circle: Scaffolded | OpenCL: platform info |
+| `opencl-compile` | :orange_circle: Scaffolded | OpenCL: compile kernel |
+| `opencl-profile` | :orange_circle: Scaffolded | OpenCL: profile execution |
+| `opencl-platform` | :orange_circle: Scaffolded | OpenCL: platform selection |
+| `opencl-device` | :orange_circle: Scaffolded | OpenCL: device selection |
+| `spack-install` | :orange_circle: Scaffolded | Spack: install package |
+| `spack-find` | :orange_circle: Scaffolded | Spack: find packages |
+| `spack-env` | :orange_circle: Scaffolded | Spack: environment |
+| `spack-spec` | :orange_circle: Scaffolded | Spack: spec resolution |
+| `spack-develop` | :orange_circle: Scaffolded | Spack: develop mode |
+| `easybuild-install` | :orange_circle: Scaffolded | EasyBuild: install |
+| `easybuild-search` | :orange_circle: Scaffolded | EasyBuild: search |
+| `easybuild-robot` | :orange_circle: Scaffolded | EasyBuild: robot path |
+| `easybuild-config` | :orange_circle: Scaffolded | EasyBuild: configuration |
+| `easybuild-test` | :orange_circle: Scaffolded | EasyBuild: test build |
+
+### Round 508 — Icarus Verilog, GTKWave, SLURM ext, MPI
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `iverilog-compile` | :orange_circle: Scaffolded | Icarus Verilog: compile |
+| `iverilog-simulate` | :orange_circle: Scaffolded | Icarus Verilog: simulate |
+| `iverilog-dump` | :orange_circle: Scaffolded | Icarus Verilog: dump signals |
+| `iverilog-module` | :orange_circle: Scaffolded | Icarus Verilog: module info |
+| `iverilog-vpi` | :orange_circle: Scaffolded | Icarus Verilog: VPI interface |
+| `gtkwave-open` | :orange_circle: Scaffolded | GTKWave: open waveform |
+| `gtkwave-zoom` | :orange_circle: Scaffolded | GTKWave: zoom control |
+| `gtkwave-marker` | :orange_circle: Scaffolded | GTKWave: set marker |
+| `gtkwave-signal` | :orange_circle: Scaffolded | GTKWave: add signal |
+| `gtkwave-export` | :orange_circle: Scaffolded | GTKWave: export view |
+| `slurm-submit` | :orange_circle: Scaffolded | SLURM: submit job |
+| `slurm-queue` | :orange_circle: Scaffolded | SLURM: view queue |
+| `slurm-cancel` | :orange_circle: Scaffolded | SLURM: cancel job |
+| `slurm-info` | :orange_circle: Scaffolded | SLURM: job info |
+| `slurm-partition` | :orange_circle: Scaffolded | SLURM: partition info |
+| `mpi-run` | :orange_circle: Scaffolded | MPI: run program |
+| `mpi-compile` | :orange_circle: Scaffolded | MPI: compile program |
+| `mpi-info` | :orange_circle: Scaffolded | MPI: implementation info |
+| `mpi-hostfile` | :orange_circle: Scaffolded | MPI: manage hostfile |
+| `mpi-debug` | :orange_circle: Scaffolded | MPI: debug session |
+
+### Round 507 — PlatformIO ext, Yosys, nextpnr, Verilator
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `platformio-build` | :orange_circle: Scaffolded | PlatformIO: build firmware |
+| `platformio-upload` | :orange_circle: Scaffolded | PlatformIO: upload firmware |
+| `platformio-monitor` | :orange_circle: Scaffolded | PlatformIO: serial monitor |
+| `platformio-test` | :orange_circle: Scaffolded | PlatformIO: run tests |
+| `platformio-check` | :orange_circle: Scaffolded | PlatformIO: static analysis |
+| `yosys-synth` | :orange_circle: Scaffolded | Yosys: synthesize design |
+| `yosys-read` | :orange_circle: Scaffolded | Yosys: read source |
+| `yosys-write` | :orange_circle: Scaffolded | Yosys: write output |
+| `yosys-script` | :orange_circle: Scaffolded | Yosys: run script |
+| `yosys-show` | :orange_circle: Scaffolded | Yosys: show design |
+| `nextpnr-place` | :orange_circle: Scaffolded | nextpnr: place design |
+| `nextpnr-route` | :orange_circle: Scaffolded | nextpnr: route design |
+| `nextpnr-pack` | :orange_circle: Scaffolded | nextpnr: pack design |
+| `nextpnr-timing` | :orange_circle: Scaffolded | nextpnr: timing analysis |
+| `nextpnr-gui` | :orange_circle: Scaffolded | nextpnr: GUI viewer |
+| `verilator-lint` | :orange_circle: Scaffolded | Verilator: lint check |
+| `verilator-compile` | :orange_circle: Scaffolded | Verilator: compile |
+| `verilator-trace` | :orange_circle: Scaffolded | Verilator: trace signals |
+| `verilator-coverage` | :orange_circle: Scaffolded | Verilator: coverage |
+| `verilator-threads` | :orange_circle: Scaffolded | Verilator: multi-thread |
+
+### Round 506 — OpenOCD, GDB Server, J-Link, ST-Link
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `openocd-flash` | :orange_circle: Scaffolded | OpenOCD: flash firmware |
+| `openocd-debug` | :orange_circle: Scaffolded | OpenOCD: debug session |
+| `openocd-reset` | :orange_circle: Scaffolded | OpenOCD: reset target |
+| `openocd-halt` | :orange_circle: Scaffolded | OpenOCD: halt target |
+| `openocd-telnet` | :orange_circle: Scaffolded | OpenOCD: telnet interface |
+| `gdb-server-connect` | :orange_circle: Scaffolded | GDB Server: connect |
+| `gdb-server-monitor` | :orange_circle: Scaffolded | GDB Server: monitor command |
+| `gdb-server-load` | :orange_circle: Scaffolded | GDB Server: load firmware |
+| `gdb-server-break` | :orange_circle: Scaffolded | GDB Server: set breakpoint |
+| `gdb-server-step` | :orange_circle: Scaffolded | GDB Server: step execution |
+| `jlink-flash` | :orange_circle: Scaffolded | J-Link: flash firmware |
+| `jlink-erase` | :orange_circle: Scaffolded | J-Link: erase chip |
+| `jlink-reset` | :orange_circle: Scaffolded | J-Link: reset target |
+| `jlink-rtt` | :orange_circle: Scaffolded | J-Link: RTT viewer |
+| `jlink-swd` | :orange_circle: Scaffolded | J-Link: SWD interface |
+| `stlink-flash` | :orange_circle: Scaffolded | ST-Link: flash firmware |
+| `stlink-erase` | :orange_circle: Scaffolded | ST-Link: erase chip |
+| `stlink-reset` | :orange_circle: Scaffolded | ST-Link: reset target |
+| `stlink-info` | :orange_circle: Scaffolded | ST-Link: probe info |
+| `stlink-probe` | :orange_circle: Scaffolded | ST-Link: detect probes |
+
+### Round 505 — MkDocs, Docusaurus, Hugo ext, Gatsby
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `mkdocs-build` | :orange_circle: Scaffolded | MkDocs: build site |
+| `mkdocs-serve` | :orange_circle: Scaffolded | MkDocs: serve locally |
+| `mkdocs-deploy` | :orange_circle: Scaffolded | MkDocs: deploy |
+| `mkdocs-new` | :orange_circle: Scaffolded | MkDocs: new project |
+| `mkdocs-gh-deploy` | :orange_circle: Scaffolded | MkDocs: GitHub Pages deploy |
+| `docusaurus-start` | :orange_circle: Scaffolded | Docusaurus: start dev server |
+| `docusaurus-build` | :orange_circle: Scaffolded | Docusaurus: build site |
+| `docusaurus-deploy` | :orange_circle: Scaffolded | Docusaurus: deploy |
+| `docusaurus-swizzle` | :orange_circle: Scaffolded | Docusaurus: swizzle component |
+| `docusaurus-clear` | :orange_circle: Scaffolded | Docusaurus: clear cache |
+| `hugo-build` | :orange_circle: Scaffolded | Hugo: build site |
+| `hugo-serve` | :orange_circle: Scaffolded | Hugo: serve locally |
+| `hugo-new` | :orange_circle: Scaffolded | Hugo: new content |
+| `hugo-deploy` | :orange_circle: Scaffolded | Hugo: deploy site |
+| `hugo-mod` | :orange_circle: Scaffolded | Hugo: module management |
+| `gatsby-build` | :orange_circle: Scaffolded | Gatsby: build site |
+| `gatsby-develop` | :orange_circle: Scaffolded | Gatsby: develop server |
+| `gatsby-serve` | :orange_circle: Scaffolded | Gatsby: serve production |
+| `gatsby-clean` | :orange_circle: Scaffolded | Gatsby: clean cache |
+| `gatsby-repl` | :orange_circle: Scaffolded | Gatsby: REPL |
+
+### Round 504 — Coveralls, Codecov, Snyk ext, Sphinx ext
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `coveralls-upload` | :orange_circle: Scaffolded | Coveralls: upload coverage |
+| `coveralls-config` | :orange_circle: Scaffolded | Coveralls: configuration |
+| `coveralls-parallel` | :orange_circle: Scaffolded | Coveralls: parallel builds |
+| `coveralls-badge` | :orange_circle: Scaffolded | Coveralls: badge URL |
+| `coveralls-webhook` | :orange_circle: Scaffolded | Coveralls: webhook |
+| `codecov-upload` | :orange_circle: Scaffolded | Codecov: upload coverage |
+| `codecov-flags` | :orange_circle: Scaffolded | Codecov: flags |
+| `codecov-report` | :orange_circle: Scaffolded | Codecov: report |
+| `codecov-graph` | :orange_circle: Scaffolded | Codecov: coverage graph |
+| `codecov-notify` | :orange_circle: Scaffolded | Codecov: notifications |
+| `snyk-ignore` | :orange_circle: Scaffolded | Snyk: ignore vulnerability |
+| `snyk-protect` | :orange_circle: Scaffolded | Snyk: protect packages |
+| `snyk-wizard` | :orange_circle: Scaffolded | Snyk: setup wizard |
+| `snyk-auth` | :orange_circle: Scaffolded | Snyk: authenticate |
+| `snyk-policy` | :orange_circle: Scaffolded | Snyk: policy management |
+| `sphinx-build` | :orange_circle: Scaffolded | Sphinx: build docs |
+| `sphinx-apidoc` | :orange_circle: Scaffolded | Sphinx: API documentation |
+| `sphinx-autobuild` | :orange_circle: Scaffolded | Sphinx: auto-rebuild |
+| `sphinx-intl` | :orange_circle: Scaffolded | Sphinx: internationalization |
+| `sphinx-linkcheck` | :orange_circle: Scaffolded | Sphinx: check links |
+
+### Round 503 — PHPUnit ext, Minitest ext, SonarQube ext, CodeClimate
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `phpunit-config` | :orange_circle: Scaffolded | PHPUnit: configuration |
+| `phpunit-coverage` | :orange_circle: Scaffolded | PHPUnit: coverage |
+| `phpunit-filter` | :orange_circle: Scaffolded | PHPUnit: filter tests |
+| `phpunit-group` | :orange_circle: Scaffolded | PHPUnit: test groups |
+| `phpunit-bootstrap` | :orange_circle: Scaffolded | PHPUnit: bootstrap |
+| `minitest-run` | :orange_circle: Scaffolded | Minitest: run tests |
+| `minitest-focus` | :orange_circle: Scaffolded | Minitest: focus test |
+| `minitest-parallel` | :orange_circle: Scaffolded | Minitest: parallel |
+| `minitest-reporter` | :orange_circle: Scaffolded | Minitest: reporter |
+| `minitest-benchmark` | :orange_circle: Scaffolded | Minitest: benchmark |
+| `sonarqube-gate` | :orange_circle: Scaffolded | SonarQube: quality gate |
+| `sonarqube-profile` | :orange_circle: Scaffolded | SonarQube: quality profile |
+| `sonarqube-rule` | :orange_circle: Scaffolded | SonarQube: manage rules |
+| `sonarqube-webhook` | :orange_circle: Scaffolded | SonarQube: webhooks |
+| `sonarqube-quality` | :orange_circle: Scaffolded | SonarQube: quality report |
+| `codeclimate-analyze` | :orange_circle: Scaffolded | CodeClimate: analyze |
+| `codeclimate-prepare` | :orange_circle: Scaffolded | CodeClimate: prepare |
+| `codeclimate-validate` | :orange_circle: Scaffolded | CodeClimate: validate config |
+| `codeclimate-engines` | :orange_circle: Scaffolded | CodeClimate: engines |
+| `codeclimate-diff` | :orange_circle: Scaffolded | CodeClimate: diff analysis |
+
+### Round 502 — Vitest ext, Pytest ext, RSpec ext, JUnit ext
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `vitest-typecheck` | :orange_circle: Scaffolded | Vitest: type checking |
+| `vitest-workspace` | :orange_circle: Scaffolded | Vitest: workspace |
+| `vitest-list` | :orange_circle: Scaffolded | Vitest: list tests |
+| `vitest-related` | :orange_circle: Scaffolded | Vitest: related tests |
+| `vitest-config` | :orange_circle: Scaffolded | Vitest: configuration |
+| `pytest-fixture` | :orange_circle: Scaffolded | Pytest: fixtures |
+| `pytest-mark` | :orange_circle: Scaffolded | Pytest: markers |
+| `pytest-parametrize` | :orange_circle: Scaffolded | Pytest: parametrize |
+| `pytest-capture` | :orange_circle: Scaffolded | Pytest: capture output |
+| `pytest-plugin` | :orange_circle: Scaffolded | Pytest: plugins |
+| `rspec-format` | :orange_circle: Scaffolded | RSpec: format output |
+| `rspec-tag` | :orange_circle: Scaffolded | RSpec: tag tests |
+| `rspec-profile` | :orange_circle: Scaffolded | RSpec: profile slow tests |
+| `rspec-bisect` | :orange_circle: Scaffolded | RSpec: bisect failures |
+| `rspec-doc` | :orange_circle: Scaffolded | RSpec: documentation format |
+| `junit-runner` | :orange_circle: Scaffolded | JUnit: test runner |
+| `junit-suite` | :orange_circle: Scaffolded | JUnit: test suite |
+| `junit-param` | :orange_circle: Scaffolded | JUnit: parameterized tests |
+| `junit-extension` | :orange_circle: Scaffolded | JUnit: extensions |
+| `junit-report` | :orange_circle: Scaffolded | JUnit: test report |
+
+### Round 501 — Jest ext, Mocha ext, Cypress ext, Playwright ext
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| `jest-config` | :orange_circle: Scaffolded | Jest: configuration |
+| `jest-coverage` | :orange_circle: Scaffolded | Jest: coverage report |
+| `jest-snapshot` | :orange_circle: Scaffolded | Jest: snapshot testing |
+| `jest-watch` | :orange_circle: Scaffolded | Jest: watch mode |
+| `jest-cache` | :orange_circle: Scaffolded | Jest: cache management |
+| `mocha-config` | :orange_circle: Scaffolded | Mocha: configuration |
+| `mocha-grep` | :orange_circle: Scaffolded | Mocha: grep tests |
+| `mocha-reporter` | :orange_circle: Scaffolded | Mocha: reporter |
+| `mocha-parallel` | :orange_circle: Scaffolded | Mocha: parallel execution |
+| `mocha-retry` | :orange_circle: Scaffolded | Mocha: retry failed |
+| `cypress-verify` | :orange_circle: Scaffolded | Cypress: verify installation |
+| `cypress-cache` | :orange_circle: Scaffolded | Cypress: cache management |
+| `cypress-info` | :orange_circle: Scaffolded | Cypress: system info |
+| `cypress-screenshot` | :orange_circle: Scaffolded | Cypress: screenshot |
+| `cypress-component` | :orange_circle: Scaffolded | Cypress: component testing |
+| `playwright-show` | :orange_circle: Scaffolded | Playwright: show report |
+| `playwright-install` | :orange_circle: Scaffolded | Playwright: install browsers |
+| `playwright-report` | :orange_circle: Scaffolded | Playwright: HTML report |
+| `playwright-pdf` | :orange_circle: Scaffolded | Playwright: PDF generation |
+| `playwright-video` | :orange_circle: Scaffolded | Playwright: video recording |
+
 ### Round 500 — Vite ext, Webpack ext, Rollup ext, Parcel ext
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 50653bd..fe8f52c 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -32716,3 +32716,409 @@
 (def (cmd-parcel-reporter app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Parcel: reporter plugins")))
+
+;; Round 502: Vitest ext, Pytest ext, RSpec ext, JUnit ext (20 commands)
+(def (cmd-vitest-typecheck app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Vitest: type checking")))
+
+(def (cmd-vitest-workspace app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Vitest: workspace")))
+
+(def (cmd-vitest-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Vitest: list tests")))
+
+(def (cmd-vitest-related app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Vitest: related tests")))
+
+(def (cmd-vitest-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Vitest: configuration")))
+
+(def (cmd-pytest-fixture app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pytest: fixtures")))
+
+(def (cmd-pytest-mark app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pytest: markers")))
+
+(def (cmd-pytest-parametrize app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pytest: parametrize")))
+
+(def (cmd-pytest-capture app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pytest: capture output")))
+
+(def (cmd-pytest-plugin app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pytest: plugins")))
+
+(def (cmd-rspec-format app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "RSpec: format output")))
+
+(def (cmd-rspec-tag app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "RSpec: tag tests")))
+
+(def (cmd-rspec-profile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "RSpec: profile slow tests")))
+
+(def (cmd-rspec-bisect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "RSpec: bisect failures")))
+
+(def (cmd-rspec-doc app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "RSpec: documentation format")))
+
+(def (cmd-junit-runner app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "JUnit: test runner")))
+
+(def (cmd-junit-suite app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "JUnit: test suite")))
+
+(def (cmd-junit-param app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "JUnit: parameterized tests")))
+
+(def (cmd-junit-extension app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "JUnit: extensions")))
+
+(def (cmd-junit-report app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "JUnit: test report")))
+
+;; Round 504: Coveralls, Codecov, Snyk ext, Sphinx ext (20 commands)
+(def (cmd-coveralls-upload app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Coveralls: upload coverage")))
+
+(def (cmd-coveralls-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Coveralls: configuration")))
+
+(def (cmd-coveralls-parallel app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Coveralls: parallel builds")))
+
+(def (cmd-coveralls-badge app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Coveralls: badge URL")))
+
+(def (cmd-coveralls-webhook app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Coveralls: webhook")))
+
+(def (cmd-codecov-upload app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Codecov: upload coverage")))
+
+(def (cmd-codecov-flags app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Codecov: flags")))
+
+(def (cmd-codecov-report app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Codecov: report")))
+
+(def (cmd-codecov-graph app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Codecov: coverage graph")))
+
+(def (cmd-codecov-notify app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Codecov: notifications")))
+
+(def (cmd-snyk-ignore app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Snyk: ignore vulnerability")))
+
+(def (cmd-snyk-protect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Snyk: protect packages")))
+
+(def (cmd-snyk-wizard app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Snyk: setup wizard")))
+
+(def (cmd-snyk-auth app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Snyk: authenticate")))
+
+(def (cmd-snyk-policy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Snyk: policy management")))
+
+(def (cmd-sphinx-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Sphinx: build docs")))
+
+(def (cmd-sphinx-apidoc app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Sphinx: API documentation")))
+
+(def (cmd-sphinx-autobuild app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Sphinx: auto-rebuild")))
+
+(def (cmd-sphinx-intl app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Sphinx: internationalization")))
+
+(def (cmd-sphinx-linkcheck app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Sphinx: check links")))
+
+;; Round 505 batch 2: Hugo ext, Gatsby (10 commands)
+(def (cmd-hugo-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hugo: build site")))
+
+(def (cmd-hugo-serve app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hugo: serve locally")))
+
+(def (cmd-hugo-new app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hugo: new content")))
+
+(def (cmd-hugo-deploy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hugo: deploy site")))
+
+(def (cmd-hugo-mod app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hugo: module management")))
+
+(def (cmd-gatsby-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Gatsby: build site")))
+
+(def (cmd-gatsby-develop app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Gatsby: develop server")))
+
+(def (cmd-gatsby-serve app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Gatsby: serve production")))
+
+(def (cmd-gatsby-clean app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Gatsby: clean cache")))
+
+(def (cmd-gatsby-repl app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Gatsby: REPL")))
+
+;; Round 507: PlatformIO ext, Yosys, nextpnr, Verilator (20 commands)
+(def (cmd-platformio-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PlatformIO: build firmware")))
+
+(def (cmd-platformio-upload app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PlatformIO: upload firmware")))
+
+(def (cmd-platformio-monitor app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PlatformIO: serial monitor")))
+
+(def (cmd-platformio-test app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PlatformIO: run tests")))
+
+(def (cmd-platformio-check app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PlatformIO: static analysis")))
+
+(def (cmd-yosys-synth app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Yosys: synthesize design")))
+
+(def (cmd-yosys-read app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Yosys: read source")))
+
+(def (cmd-yosys-write app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Yosys: write output")))
+
+(def (cmd-yosys-script app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Yosys: run script")))
+
+(def (cmd-yosys-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Yosys: show design")))
+
+(def (cmd-nextpnr-place app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "nextpnr: place design")))
+
+(def (cmd-nextpnr-route app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "nextpnr: route design")))
+
+(def (cmd-nextpnr-pack app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "nextpnr: pack design")))
+
+(def (cmd-nextpnr-timing app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "nextpnr: timing analysis")))
+
+(def (cmd-nextpnr-gui app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "nextpnr: GUI viewer")))
+
+(def (cmd-verilator-lint app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Verilator: lint check")))
+
+(def (cmd-verilator-compile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Verilator: compile")))
+
+(def (cmd-verilator-trace app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Verilator: trace signals")))
+
+(def (cmd-verilator-coverage app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Verilator: coverage")))
+
+(def (cmd-verilator-threads app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Verilator: multi-thread")))
+
+;; Round 509: CUDA ext, OpenCL, Spack, EasyBuild (20 commands)
+(def (cmd-cuda-compile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUDA: compile kernel")))
+
+(def (cmd-cuda-profile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUDA: profile execution")))
+
+(def (cmd-cuda-memcheck app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUDA: memory check")))
+
+(def (cmd-cuda-debug app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUDA: debug session")))
+
+(def (cmd-cuda-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CUDA: device info")))
+
+(def (cmd-opencl-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenCL: platform info")))
+
+(def (cmd-opencl-compile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenCL: compile kernel")))
+
+(def (cmd-opencl-profile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenCL: profile execution")))
+
+(def (cmd-opencl-platform app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenCL: platform selection")))
+
+(def (cmd-opencl-device app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenCL: device selection")))
+
+(def (cmd-spack-install app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Spack: install package")))
+
+(def (cmd-spack-find app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Spack: find packages")))
+
+(def (cmd-spack-env app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Spack: environment")))
+
+(def (cmd-spack-spec app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Spack: spec resolution")))
+
+(def (cmd-spack-develop app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Spack: develop mode")))
+
+(def (cmd-easybuild-install app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EasyBuild: install")))
+
+(def (cmd-easybuild-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EasyBuild: search")))
+
+(def (cmd-easybuild-robot app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EasyBuild: robot path")))
+
+(def (cmd-easybuild-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EasyBuild: configuration")))
+
+(def (cmd-easybuild-test app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EasyBuild: test build")))
+
+;; Round 510 batch 2: Apptainer, Charliecloud (10 commands)
+(def (cmd-apptainer-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Apptainer: build image")))
+
+(def (cmd-apptainer-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Apptainer: run container")))
+
+(def (cmd-apptainer-exec app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Apptainer: exec command")))
+
+(def (cmd-apptainer-shell app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Apptainer: shell into")))
+
+(def (cmd-apptainer-pull app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Apptainer: pull image")))
+
+(def (cmd-charliecloud-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Charliecloud: build image")))
+
+(def (cmd-charliecloud-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Charliecloud: run container")))
+
+(def (cmd-charliecloud-pull app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Charliecloud: pull image")))
+
+(def (cmd-charliecloud-push app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Charliecloud: push image")))
+
+(def (cmd-charliecloud-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Charliecloud: list images")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index c149bd1..18c2422 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -31940,3 +31940,409 @@
 (def (cmd-webpack-progress app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Webpack: build progress")))
+
+;; Round 501: Jest ext, Mocha ext, Cypress ext, Playwright ext (20 commands)
+(def (cmd-jest-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jest: configuration")))
+
+(def (cmd-jest-coverage app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jest: coverage report")))
+
+(def (cmd-jest-snapshot app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jest: snapshot testing")))
+
+(def (cmd-jest-watch app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jest: watch mode")))
+
+(def (cmd-jest-cache app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jest: cache management")))
+
+(def (cmd-mocha-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Mocha: configuration")))
+
+(def (cmd-mocha-grep app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Mocha: grep tests")))
+
+(def (cmd-mocha-reporter app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Mocha: reporter")))
+
+(def (cmd-mocha-parallel app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Mocha: parallel execution")))
+
+(def (cmd-mocha-retry app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Mocha: retry failed")))
+
+(def (cmd-cypress-verify app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Cypress: verify installation")))
+
+(def (cmd-cypress-cache app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Cypress: cache management")))
+
+(def (cmd-cypress-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Cypress: system info")))
+
+(def (cmd-cypress-screenshot app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Cypress: screenshot")))
+
+(def (cmd-cypress-component app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Cypress: component testing")))
+
+(def (cmd-playwright-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Playwright: show report")))
+
+(def (cmd-playwright-install app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Playwright: install browsers")))
+
+(def (cmd-playwright-report app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Playwright: HTML report")))
+
+(def (cmd-playwright-pdf app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Playwright: PDF generation")))
+
+(def (cmd-playwright-video app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Playwright: video recording")))
+
+;; Round 503: PHPUnit ext, Minitest ext, SonarQube ext, CodeClimate (20 commands)
+(def (cmd-phpunit-config app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PHPUnit: configuration")))
+
+(def (cmd-phpunit-coverage app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PHPUnit: coverage")))
+
+(def (cmd-phpunit-filter app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PHPUnit: filter tests")))
+
+(def (cmd-phpunit-group app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PHPUnit: test groups")))
+
+(def (cmd-phpunit-bootstrap app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "PHPUnit: bootstrap")))
+
+(def (cmd-minitest-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Minitest: run tests")))
+
+(def (cmd-minitest-focus app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Minitest: focus test")))
+
+(def (cmd-minitest-parallel app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Minitest: parallel")))
+
+(def (cmd-minitest-reporter app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Minitest: reporter")))
+
+(def (cmd-minitest-benchmark app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Minitest: benchmark")))
+
+(def (cmd-sonarqube-gate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SonarQube: quality gate")))
+
+(def (cmd-sonarqube-profile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SonarQube: quality profile")))
+
+(def (cmd-sonarqube-rule app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SonarQube: manage rules")))
+
+(def (cmd-sonarqube-webhook app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SonarQube: webhooks")))
+
+(def (cmd-sonarqube-quality app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SonarQube: quality report")))
+
+(def (cmd-codeclimate-analyze app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CodeClimate: analyze")))
+
+(def (cmd-codeclimate-prepare app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CodeClimate: prepare")))
+
+(def (cmd-codeclimate-validate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CodeClimate: validate config")))
+
+(def (cmd-codeclimate-engines app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CodeClimate: engines")))
+
+(def (cmd-codeclimate-diff app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CodeClimate: diff analysis")))
+
+;; Round 505 batch 1: MkDocs, Docusaurus (10 commands)
+(def (cmd-mkdocs-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "MkDocs: build site")))
+
+(def (cmd-mkdocs-serve app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "MkDocs: serve locally")))
+
+(def (cmd-mkdocs-deploy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "MkDocs: deploy")))
+
+(def (cmd-mkdocs-new app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "MkDocs: new project")))
+
+(def (cmd-mkdocs-gh-deploy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "MkDocs: GitHub Pages deploy")))
+
+(def (cmd-docusaurus-start app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Docusaurus: start dev server")))
+
+(def (cmd-docusaurus-build app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Docusaurus: build site")))
+
+(def (cmd-docusaurus-deploy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Docusaurus: deploy")))
+
+(def (cmd-docusaurus-swizzle app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Docusaurus: swizzle component")))
+
+(def (cmd-docusaurus-clear app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Docusaurus: clear cache")))
+
+;; Round 506: OpenOCD, GDB Server, J-Link, ST-Link (20 commands)
+(def (cmd-openocd-flash app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenOCD: flash firmware")))
+
+(def (cmd-openocd-debug app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenOCD: debug session")))
+
+(def (cmd-openocd-reset app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenOCD: reset target")))
+
+(def (cmd-openocd-halt app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenOCD: halt target")))
+
+(def (cmd-openocd-telnet app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "OpenOCD: telnet interface")))
+
+(def (cmd-gdb-server-connect app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB Server: connect")))
+
+(def (cmd-gdb-server-monitor app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB Server: monitor command")))
+
+(def (cmd-gdb-server-load app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB Server: load firmware")))
+
+(def (cmd-gdb-server-break app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB Server: set breakpoint")))
+
+(def (cmd-gdb-server-step app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GDB Server: step execution")))
+
+(def (cmd-jlink-flash app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "J-Link: flash firmware")))
+
+(def (cmd-jlink-erase app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "J-Link: erase chip")))
+
+(def (cmd-jlink-reset app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "J-Link: reset target")))
+
+(def (cmd-jlink-rtt app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "J-Link: RTT viewer")))
+
+(def (cmd-jlink-swd app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "J-Link: SWD interface")))
+
+(def (cmd-stlink-flash app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "ST-Link: flash firmware")))
+
+(def (cmd-stlink-erase app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "ST-Link: erase chip")))
+
+(def (cmd-stlink-reset app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "ST-Link: reset target")))
+
+(def (cmd-stlink-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "ST-Link: probe info")))
+
+(def (cmd-stlink-probe app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "ST-Link: detect probes")))
+
+;; Round 508: Icarus Verilog, GTKWave, SLURM ext, MPI (20 commands)
+(def (cmd-iverilog-compile app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Icarus Verilog: compile")))
+
+(def (cmd-iverilog-simulate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Icarus Verilog: simulate")))
+
+(def (cmd-iverilog-dump app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Icarus Verilog: dump signals")))
+
+(def (cmd-iverilog-module app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Icarus Verilog: module info")))
+
+(def (cmd-iverilog-vpi app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Icarus Verilog: VPI interface")))
+
+(def (cmd-gtkwave-open app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GTKWave: open waveform")))
+
+(def (cmd-gtkwave-zoom app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GTKWave: zoom control")))
+
+(def (cmd-gtkwave-marker app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GTKWave: set marker")))
+
+(def (cmd-gtkwave-signal app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GTKWave: add signal")))
+
+(def (cmd-gtkwave-export app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "GTKWave: export view")))