Commit graph

16 commits

Author SHA1 Message Date
Michael
a00d7ef1c9 chore(repo): slim .gitignore and remove dev artifacts from tracking
Cleaning up the public-facing repo:
- /build.sh, /moduldoku.md, /package-lock.json (root) untracked in
  prior commit and now blocked via .gitignore
- .gitignore itself: dropped GSD baseline noise, deduped overlapping
  patterns, added the three newly-untracked dev files

The schneespur/ subdirectory (Laravel app) is what users consume;
root-level dev tooling has no business in the distributed source.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:06:15 +00:00
Michael
382ee67868 test: Bootstrapped PHPUnit test infrastructure and wrote 9 FilterRegist…
- schneespur/phpunit.xml
- schneespur/tests/TestCase.php
- schneespur/tests/CreatesApplication.php
- schneespur/tests/Feature/FilterRegistryTest.php

GSD context:
- Milestone: M013 - Hook-Fundament — FilterRegistry, Events, NotificationChannelRegistry, Modul-Plumbing
- Slice: S01
- Task: T04 - Bootstrapped PHPUnit test infrastructure and wrote 9 FilterRegistry Feature tests covering priority ordering, stable sort, error isolation, context passing, value chaining, and two integration tests proving navigation and dashboard hooks are wired

GSD-Task: S01/T04
2026-05-21 13:04:10 +00:00
Michael
182f1b4c98 Release v1.0.5: Bugfix-Welle (Manual-Job-Form, :app_name, Logging, DSGVO-EN, Icons)
Sammelrelease nach Feedback aus der Test-Installation. Sieben unabhängige
Probleme — vom Form-Breaker über Übersetzungs-Lücken bis Log-Hygiene.

- fix(jobs): Einsatz manuell erfassen brach das HTML-Attribut, sobald
  Customer-Namen ein " enthielten (@json in x-data=""). Auf json_encode
  via {{ }} umgestellt (HTML-escaped). Alpine initialisiert wieder,
  Anlegen-Button funktioniert.
- feat(i18n): BrandedTranslator injiziert :app_name automatisch in alle
  __()-Aufrufe. Hilfetexte, Mails, Update-Strings rendern jetzt überall
  korrekt 'Schneespur' bzw. 'Wintertrace' statt rohes :app_name.
- feat(dsgvo): EN-Default-Vorlage default-template-en.blade.php mit
  UK/EU GDPR-Wording (Art. 6(1)(f), ICO-Hinweis, Subject Rights).
  Controller laden locale-aware mit Fallback auf DE. Placeholder-Helper
  kennt DE + EN Tokens.
- ui(settings): Alle 8 Settings-Karten haben jetzt Icons, nicht nur
  Module. Markup auf array-driven Loop entrümpelt.
- chore(modules): Example-Modul boot()-gated via EXAMPLE_MODULE_ENABLED
  env-Var (default false). Aus Release-ZIP komplett entfernt. Bestehende
  Installs mit altem example/-Ordner laden es nicht mehr automatisch.
- chore(logging): ModuleManager Discovery/Boot-Logs auf debug
  runtergesetzt (waren info → fluteten laravel.log bei jedem Request).
  Defaults auf daily-Rotation mit 14d Retention + LOG_LEVEL=warning für
  Production.
- fix(install): Hardcoded deutsche Fehlermeldung im InstallerController
  durch __('install.preflight_has_failures') ersetzt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 12:55:19 +00:00
Michael
ed375efb22 chore: auto-commit after execute-task
GSD-Unit: M013/S01/T03
2026-05-20 14:46:51 +00:00
Michael
ea727985ea chore: auto-commit after execute-task
GSD-Unit: M013/S01/T02
2026-05-20 14:44:33 +00:00
Michael
41878e92ef chore: auto-commit after execute-task
GSD-Unit: M013/S01/T01
2026-05-20 14:42:18 +00:00
Michael
87a84eb0ac Release v1.0.4: self-updater hotfixes (wrapper stripping + counter check)
- Self-updater extractZip: detect and strip a common top-level prefix
  folder so that release ZIPs built with a versioned wrapper (the
  build.sh convention) overlay the live install correctly instead of
  creating a schneespur-X.Y.Z/ subdirectory at the install root.
  The v1.0.3 update on the test environment surfaced this — files were
  copied, state.json was committed to 1.0.3, but the wrapper folder
  meant the live config/app.php and VERSION were never actually
  overwritten. Same defensive prefix-stripping pattern as the module
  installer.

- Counter check ordering: the same-version short-circuit now runs
  BEFORE the strict counter check. Previously, after a successful
  install, the next "prüfen" fetched the same manifest (same counter)
  and the counter check would throw "Rollback-Versuch", masking the
  intended "you're up to date" response. The counter check is still
  enforced for genuinely older manifests — it just doesn't misfire
  when the server keeps serving the same release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 14:03:12 +00:00
Michael
84c68ee35c Move moduldoku.md to project root
This is an internal authoring doc, not part of the shipped Laravel
application. Lifting it out of the schneespur/ subdirectory keeps it
out of the release build (build.sh copies only the Laravel app
directories) and clarifies the separation between code-that-ships
and meta documentation about the module system.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:20:33 +00:00
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
Michael
7e27270626 Restructure: move source into schneespur/ subdirectory, remove vendor/release from tracking
- Root: README.md, LICENSE, INSTALL.de.md, INSTALL.en.md only
- schneespur/: all application source code
- Added .gitignore for vendor/, node_modules/, release/, .env, build artifacts
- Removed vendor/ and release/ from git tracking (15,699 files)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-18 17:02:37 +00:00
Michael
7288b93500 Release v1.0.2: diagnostic infrastructure core
Add neutral diagnostic framework for future reporting modules:
- DiagnosticReporterInterface, Registry, Manager, PayloadSanitizer
- Laravel exception hook in bootstrap/app.php
- Module permission declarations (requires_permissions in module.json)
- Core diagnostic report points (module boot/install/update failures)
- Module documentation update (moduldoku.md)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-18 16:54:11 +00:00
Michael
2c63440ed8 Revert: move code back to project root from schneespur/ subdirectory
- Reverts the schneespur/ subdirectory restructure (b8e426b)
- Restores package.json and vite.config.js (needed for npm build, were
  removed in an earlier cleanup before the restructure)
- Updates public/build/ assets with current Vite output (new content hashes)
2026-05-17 18:24:26 +00:00
Michael
53b29bd0e6 Release v1.0.1: installer locale detection from Step 1
User-facing improvements
- Installer detects browser language from the Accept-Language header
  on the very first request. de-* → Schneespur/DE, everything else
  (en-*, zh, ja, ar, it, fr, …) → Wintertrace/EN.
- DE/EN switcher in the installer layout header for manual override.
  The choice persists for the browser session.
- Step 5 (Config) now reflects the already-resolved locale instead of
  detecting again client-side, eliminating a brief "wrong language"
  flash between steps.

Under the hood
- New SetInstallerLocale middleware (Symfony's getPreferredLanguage
  with strict top-preference, list order ['en','de'] so non-matching
  browsers fall back to en/Wintertrace, not de/Schneespur).
- brand() helper resolves from the runtime locale when the app_brand
  setting is absent (pre-install). Post-install behaviour unchanged.
- Composer now declares ext-sodium explicitly (required by the Ed25519
  signature verification in the auto-update flow).

No DB migrations, no breaking changes, no config rewrites needed.
2026-05-17 17:35:02 +00:00
noschmarrn
d71e8717ec
Update README.md 2026-05-17 16:06:43 +02:00
Michael
b8e426ba2d Restructure: move code into schneespur/ subdirectory, fix Umlauts
- Move all application code into schneespur/ subdirectory for cleaner
  GitHub presentation (README, LICENSE, INSTALL guides stay in root)
- Fix German Umlaut encoding in INSTALL.de.md and README.md
  (ae→ä, oe→ö, ue→ü throughout)
- ZIP download structure remains flat (code in root) for easy deployment
2026-05-17 13:52:39 +00:00
Michael
ee3dbba6cc Initial release v1.0.0
Schneespur — Open-source winter service documentation software (PWA + Admin).
GPS tracking via OwnTracks, weather data, photo evidence, and legally
compliant service records for winter maintenance operators.

License: AGPL-3.0-or-later
2026-05-17 13:33:51 +00:00