Sweep of documentation and comments the shell split and the pin retirement
made false. No behaviour change except one dead nix binding, below.
flake.nix
* Deletes `appImage = import ./nix/appimage.nix {...}`. That file is NOT in
the tree; the binding survived only because nix is lazy and nothing ever
forced it. Anyone referencing `appImage` would have hit a file-not-found at
eval. The shipped AppImage is the `bin-appimage` output, built by
nix-bundle-appimage.
* Four stale `Rev-pinned:` comment blocks -- logos-module-loader-qt,
logos-liblogos, logos-capability-module, logos-package-manager-ui. None of
those inputs carries a rev or ref any more; 3c21c1f retired the pins and
left every explanation behind. The logos-package-manager-ui one was a
DUPLICATED pair of near-identical paragraphs describing two different revs
of the same dead pin.
Rewritten rather than deleted, because two carried constraints that outlive
the pin and would be expensive to rediscover: capability_module fails CLOSED
without `token_registry` / `token_delivery`, and package-manager-ui is
loaded IN-PROCESS so it must match the host runtime's generation.
nix/coverage.nix
* --filter now lists BOTH app/ and src/. The split moved AppsFilterProxy,
ModulesFilterProxy, InstallEnums, ShortcutBridge and WorkspaceArea into
src/, and all five are still compiled into unit-test binaries via srcdeps --
so their .gcno/.gcda were produced and then discarded, and four of the ten
test binaries contributed nothing to the published numbers. failUnderLine
defaults to 0, so this cannot break the build.
* Its scope note still listed MainContainer as an app/ source.
app/CMakeLists.txt
* The logos_core-last rule is load-bearing on the mingw link and its comment
justified it by LogosSharedFromDll.cmake emptying the static archives --
a file deleted in #348, and contradicted by the comment 14 lines below.
The rule stands; only its stated reason was gone, which is precisely how
someone deletes it and gets four undefined references.
docs/project.md
* The app/ tree listed LogosQmlBridge.h/cpp, mdiview.h/cpp, mdichild.h/cpp
and an app/qml/ subtree of nine QML files. None exists; the QML lives at
src/Basecamp/. Replaced with the sources actually there.
* The nix/ listing named appimage.nix, macos-bundle.nix and macos-dmg.nix --
none of which exists -- and omitted symbol-gate.nix, which :193 relies on
as the thing enforcing the shell boundary.
* MainContainer's section still said app/; 9b8cf6e recorded R100 into src/.
It also said MainContainer creates MainUIBackend, which Window now owns.
* LogosQmlBridge's section cited app/ paths for an EXTERNAL header that
arrives from a flake input.
* MdiView / MdiChild sections describe classes that no longer exist; the role
is src/WorkspaceArea.
* Advertised a `.#bin-macos-dmg` output that is not defined anywhere.
tests/shutdown-tests.mjs
* Pointed at app/main.cpp:224-254 as "the orderly teardown". Those lines are
startup. The reference was already wrong when written and has since moved
twice, so it now names the block instead of line-numbering it.
doctests/basecamp-modules-bundle.test.yaml
* "Basecamp's *own* shell is deliberately NOT here: it is carried as a
main_ui plugin again" -- a fold-era clause left in front of its own
replacement, negating the rest of the sentence and the assertion below it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Measured on the built artefact: main_ui.dylib DEFINES zero and IMPORTS zero of
TokenManager, StoreRegistry, LogosAPI, LogosAPIClient and logos_core_*, out of
3410 symbols read. It links Qt and nothing else from this workspace, which
nix/symbol-gate.nix enforces across the in-process image set.
Getting there needed the last non-Qt types off the boundary: the model
properties cross as QAbstractItemModel*, catalogInstallStageChanged carries an
int rather than InstallStage::Value, and the two prebuilt AppsFilterProxy
instances are declared in QML instead of owned by MainUIBackend. That last one
removes a real inversion -- PackageCoordinator called setRequiredPackages() on
a proxy the host held a pointer to; it now emits requiredPackagesResolved() and
QML binds to the republished property.
Window resolves the plugin, qobject_casts it to IShellView, checks
hostAbiVersion() against IShellHost_abi, and calls createShell(IShellHost*).
No error-label fallback widget: that degraded to something that looked like a
working app with an empty window.
Filter proxies read role constants off host-side models and InstallEnums is
used by nine host files, so app/interfaces/ gains the contract headers both
sides compile against -- the models inherit the role structs, leaving every
AppsModel::NameRole call site unchanged. The plugin's include path is
app/interfaces only, so including a host header does not compile.
Four things only running it finds:
* Logos::DesignSystem may be linked by exactly ONE image -- both linked it
and the app aborted with "Cannot add multiple registrations for
Logos.Icons"; QML module registration is process-global
* qmltyperegistrar emits no #include for a SOURCES header given as an
absolute path outside the project
* each qt_add_qml_module is its own target and inherits no include dirs
* AUTOMOC pairs header<->cpp by same-basename-same-DIRECTORY, which the
split breaks
tst_AppManagerView.qml grows five tests for the QML binding, checked with a
negative control: breaking one assertion fails qml-tests, so they run.
Each loaded plugin -- including pure-QML ones -- gets its own LogosAPI identity
rather than sharing the host's, so a plugin's calls are attributable and can be
refused independently. The host-services grant is wired through to
capability_module, and its trust root is guarded on an OUTCOME rather than a
log line.
Inter-module access policy stays OFF by default: enforce mode's derived
deny-by-default gates every ui_qml app's calls to its own backend module,
because UI plugins load out-of-process and are not tracked as dependents in the
core ModuleRegistry. Operators opt in per launch with --access-policy enforce
or LOGOS_ACCESS_POLICY.
Takes the Qt host runtime from logos-plugin-qt rather than logos-qt-sdk, which
keeps only the Qt<->lp seam headers, and moves logos-protocol onto the rev that
split host needs. On Windows logos_core must come LAST on the link line: GNU ld
resolves an archive left to right, so the view runtime's references have to be
undefined already when it reaches the import library.
Separates the two source trees -- app/ is the host, src/ is the UI shell -- and
brings the CI onto setup-nix-cache-action. Merges master.
* Replace per-module Methods screen with an Interface screen (methods + events)
A module exposes two halves of its API — methods you call and events you
subscribe to. The per-module screen now shows both. The 'View Methods'
button becomes 'Interface', and PluginMethodsView is renamed to
PluginInterfaceView with a Methods section (unchanged, with Call) and a
new Events section below it (event name in amber, signature, and the
event's description; no Call button).
- CoreModuleManager: getEvents(name) -> invokeRemoteMethod(name,
"getPluginEvents"), mirroring getMethods.
- MainUIBackend: getCoreModuleEvents(name) delegates to it.
- CoreModulesView: 'Interface' button; openInterface()/showingInterface.
- PluginInterfaceView (renamed): loads methods + events, renders both.
- docs: project.md view description.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Harden PluginInterfaceView: stable width + clear stale state
Address review feedback (#210):
- PluginInterfaceView: bind the inner ColumnLayout to the ScrollView's
availableWidth (via an id) instead of parent.width. Inside a Qt 6
ScrollView parent.width resolves against the internal Flickable
contentItem and can transiently collapse to 0 during Repeater reflow —
the same fix already applied in CoreModulesView/UiModulesTab.
- loadMethods()/loadEvents(): clear methods/events (and resultText) when
pluginName becomes empty, so a reset view can't show a previous
plugin's interface.
- CoreModuleManager.h: correct the stale 'Both return' comment now that
there are three JSON introspection methods (getMethods/getEvents/
callMethod).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>