Skip to content

13 July 2026

1 change:

  • Scaffolding & init tooling fixes

Scaffolding & init tooling fixes

Fixes and a small addition to the project-scaffolding CLI, discovered while exercising the new-project workflow.

Added

  • create:controller / create:view--full (-f) flag. The generators can now produce the complete CRUD variant of a single artifact — the same output create:crud makes for that one file. The generation methods always supported this; only the CLI flag was missing, so previously-documented --full invocations failed with "The --full option does not exist". Use it when the model already exists and you only need to regenerate the full controller or view.

Fixed

  • pramnos init — silent, endless spinner on slow/hung steps. The progress spinner driving long shell steps (docker-compose up --build, in-container composer, migrations) polled forever with no elapsed indicator and buffered all output until exit, so a hang was undiagnosable. It now shows an always-on elapsed-time counter (Starting Docker environment / (2m05s)) and escalates to live subprocess output once a step exceeds Init::$slowStepThreshold seconds (default 120; set 0 to disable).

  • ./dockertest / ./dockerbash — silent hang when the Docker daemon is wedged. The preflight docker-compose ps (and up -d, and the exec dependency check) had no timeout, so a wedged daemon (a common WSL / Docker Desktop failure mode) hung the script indefinitely. Both now run a bounded daemon health check and wrap every Docker control call in a timeout, failing fast with a clear message and remediation hint. The test run itself is intentionally not time-limited. Override the bound with DOCKERTEST_DOCKER_TIMEOUT. The same guard is now baked into the dockertest and dockerbash scripts generated for new projects by pramnos init, so scaffolded projects inherit the fix.

  • pramnos init — Tailwind theme rendered completely unstyled. Choosing the tailwind UI system produced pages with Tailwind utility classes but no Tailwind CSS. Three linked problems, now fixed:

    1. The generated theme header emitted no Tailwind runtime and nothing vendored one. The scaffolder now downloads the Tailwind browser build (zero-config, no Node/build step) into www/assets/vendor/tailwind/ and loads it in <head>, matching how the bootstrap theme vendors its assets (assets.json catalog entry + ensureTailwindAssets()).
    2. The browser build generates CSS by injecting a <style> at runtime, which the strict nonce-based style-src CSP blocked ("Applying inline style violates … style-src"). The tailwind scaffold now sets style-src => ['unsafe-inline'] in app/app.php, so the framework drops the style nonce and the styles apply. Scoped to the tailwind theme only; compile Tailwind to static CSS for production.
    3. Tailwind was also offered again in the "extra libraries" step even though it was already chosen as the UI system — it is now skipped there (like bootstrap). Covered by regression tests.
  • pramnos init — Tailwind theme markup was written for Tailwind v3. With the v4 runtime now in place, the theme and its ~60 view templates were migrated to v4: renamed utilities (shadow-smshadow-xs, bare shadowshadow-sm, bare roundedrounded-sm, outline-noneoutline-hidden, text-opacity-*/opacity), a style.css rule restoring v3's gray-200 default border colour (v4 defaults to currentColor), and scoped typography for the bare-HTML home page. The header/footer gained a dedicated tailwind branch (previously they fell back to the plain-css semantic markup, so the nav/footer were unstyled), and the inline login / account dashboard / account profile views got Tailwind variants (they previously used the plain-css view). The header's Admin dropdown no longer closes when moving the mouse onto it (removed the hover-gap).

  • DevPanel toolbar leaked into non-HTML responses. The debug toolbar was injected before </body> in any response containing that tag — including the raw document the log viewer serves inside an <iframe>. Injection is now restricted to html documents, so the toolbar never appears in raw, JSON, PDF, RSS or image responses.

Documentation

  • Corrected the console command syntax in the setup and console guides: the generators use the colon form (create:controller, create:model, …), not the space form.
  • Fixed the log-migration example in the README: the command is migratelogs <path> (with a required path argument), not migrate:logs --days=N.