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 outputcreate:crudmakes for that one file. The generation methods always supported this; only the CLI flag was missing, so previously-documented--fullinvocations failed with "The--fulloption 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-containercomposer, 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 exceedsInit::$slowStepThresholdseconds (default120; set0to disable). -
./dockertest/./dockerbash— silent hang when the Docker daemon is wedged. The preflightdocker-compose ps(andup -d, and theexecdependency 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 withDOCKERTEST_DOCKER_TIMEOUT. The same guard is now baked into thedockertestanddockerbashscripts generated for new projects bypramnos init, so scaffolded projects inherit the fix. -
pramnos init— Tailwind theme rendered completely unstyled. Choosing thetailwindUI system produced pages with Tailwind utility classes but no Tailwind CSS. Three linked problems, now fixed:- 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.jsoncatalog entry +ensureTailwindAssets()). - The browser build generates CSS by injecting a
<style>at runtime, which the strict nonce-basedstyle-srcCSP blocked ("Applying inline style violates … style-src"). The tailwind scaffold now setsstyle-src => ['unsafe-inline']inapp/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. - 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.
- 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
-
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-sm→shadow-xs, bareshadow→shadow-sm, barerounded→rounded-sm,outline-none→outline-hidden,text-opacity-*→/opacity), astyle.cssrule restoring v3's gray-200 default border colour (v4 defaults tocurrentColor), 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 therawdocument the log viewer serves inside an<iframe>. Injection is now restricted tohtmldocuments, so the toolbar never appears inraw, 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), notmigrate:logs --days=N.