Commit Graph

2 Commits

Author SHA1 Message Date
0cceefc890 v0.1.3: audit-driven non-breaking fixes
Three bugs surfaced by the post-v0.1.2 architecture audit:

- bridge.qml_path is now actually configurable. BridgeBundle::configure
  defines the qml_path scalar node (default ../qml/); loadExtension
  exposes it as the bridge.qml_path container parameter; services.yaml
  binds it into BridgeResourceMaker + BridgeWindowMaker. Apps override
  with `config/packages/bridge.yaml`. The existing maker docstrings
  claimed this worked already — they lied; now they don't.

- SessionAuthenticator implements AuthenticationEntryPointInterface and
  routes the no-token entry-point path through the same problem+json
  helper as onAuthenticationFailure, so QML's RestClient sees one error
  shape regardless of which firewall path was taken. Test added.

- CorrelationKeyListener::onTerminate guards on isMainRequest() now,
  matching onRequest's existing guard. No user-visible impact in
  worker mode (no sub-requests emitted), but the asymmetry was a
  defensive bug that would corrupt optimistic-update reconciliation.

PLAN.md §13 gains a v0.1.3 section + folds the audit's API-surface
items (PublisherInterface / ModelPublisherInterface / BridgeOp enum /
maker DRY / DTO-shaped scaffold) into v0.2.0. CHANGELOG.md mirrors.

PHPStan + cs-fixer + PHPUnit (17/17) + maker snapshot tests all green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 16:31:54 +02:00
9c97984bc9 Phase 3 sub-commit 2: make:bridge:window + make:bridge:command makers
Two new makers complete the trio the todo POC needs:

`make:bridge:window <Name>`:
  - emits {qml_path}/<Name>Window.qml — an ApplicationWindow wrapping
    AppShell with a content slot to fill in. Apps open it via
    Qt.createComponent() / a Component { } block to get extra
    instances for the multi-window test (PLAN.md §13 Phase 3).
  - pure-QML output, no PHP runtime deps.

`make:bridge:command <Name>`:
  - emits src/Controller/<Name>Controller.php mounted at
    POST /api/<kebab-name>. The body is a TODO stub that fills in
    domain logic and flushes via the injected EntityManager —
    Doctrine listeners pick up the changes and publish to Mercure
    automatically. Synchronous by design (no Messenger plumbing for
    a POC); apps that need async dispatch can add Messenger and
    refactor.

Templates excluded from PHPStan / cs-fixer the same way the resource
maker's are. Smoke-tested both makers against `MarkAllDone` and
`AboutDialog` — output is correct PHP / QML and re-running them
reproduces byte-for-byte. composer quality stays green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:15:37 +02:00