schneespur/schneespur/app
Michael 7e1222b022 Release v1.0.3: post-1.0.2 hotfixes (logging, customer objects, version display, module catalog & installer)
- bootstrap/app.php: restore default Laravel exception logging. The
  diagnostic reportable() callback no longer returns false unconditionally
  it only suppresses default reporting when a reporter actually handled the
  exception, so storage/logs/laravel.log shows errors again on fresh installs.

- Customer object creation: fix 500 when notify_recipients is empty (NOT NULL
  violation). Reconcile drift across migration/validation/form/lang: the field
  is now treated consistently as an enum (customer|object|both) matching the
  notification consumers; form uses a <select> instead of free-text input;
  validation tightened via in: rule; coercion in prepareForValidation keeps
  the DB invariant intact when the field is empty or missing.

- config/app.php: version is now read from the VERSION file at runtime.
  The previously hardcoded '1.0.0' caused footer, settings, and dashboard to
  show a stale version after every release. VERSION is now the single source
  of truth for display.

- Module catalog UI: fix render crash (htmlspecialchars on i18n category dict)
  and disappearing modules on 304 Not Modified responses. SchneespurModuleClient
  now has a normalizeModule() adapter that bridges server-side field naming
  (current_version, image_url, i18n category dict) to the internal shape used
  by controller and views. The catalog body is cached in state, so 304
  responses replay the cached catalog instead of falling back to the
  semantically wrong "installed" list.

- Module installer: strip common top-level prefix from module ZIPs to prevent
  modules/<slug>/<slug>/ double-nesting. The installer now detects whether all
  ZIP entries share one wrapper folder and strips it during extraction; flat
  ZIPs continue to work unchanged. Path-traversal validation runs on the
  original entry names before the strip, so the security guarantee is intact.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 12:53:20 +00:00
..
Console/Commands Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Enums Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Events Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Exceptions Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Http Release v1.0.3: post-1.0.2 hotfixes (logging, customer objects, version display, module catalog & installer) 2026-05-19 12:53:20 +00:00
Jobs Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Listeners Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Mail Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Models Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Policies Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Providers Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
Services Release v1.0.3: post-1.0.2 hotfixes (logging, customer objects, version display, module catalog & installer) 2026-05-19 12:53:20 +00:00
View/Components Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00
helpers.php Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking 2026-05-18 17:02:37 +00:00