feat: bundle Oliver and Boris inside the app for sandbox self-containment - #211
Merged
Merged
Conversation
- make app builds universal helper binaries from sibling Zig checkouts
(Scripts/helpers.sh) into Contents/Helpers, signing each before the
outer seal; missing checkouts are a warning, never an error
- OliverLocator/BorisLocator resolve the bundled helper first (after a
configured path), then env/PATH/sibling checkout as before; the
bundle lookup is injectable for tests (BundledHelper)
- Settings -> Publish loses its Boris/Oliver pickers; legacy paths in
.banal/config.json still round-trip
- AppleScript command errors now set scriptErrorNumber so failures
surface in osascript instead of returning missing value
- docs: PREFERENCES, README, STATUS, CHANGELOG updated
Verified end to end: the signed sandboxed app publishes via the bundled
Boris ('Published 1 note with Boris.') against a scratch container vault.
Closes #209
|
SummaryCoverage spans normal recipe reading and publishing flows, helper selection and fallback behavior, cleanup after failed builds, error handling, packaging and sandbox integration, and preservation of publish settings. It includes product logic, edge-case recovery, build-time safeguards, and user-facing workflow behavior, with no observed application regressions. Safe to merge — no failures are attributable to this PR, so there are no identified regressions or merge-blocking defects. Some native macOS build and UI flows were not executable in the available environment and remain follow-up validation items rather than PR-related failures. Tests run by Ito
Tip Reply with @itoqa to send us feedback on this test run. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Closes #209.
What
BANAL now ships its own Oliver and Boris.
make appbuilds universal (arm64+x86_64) binaries from the sibling Zig checkouts intoContents/Helpers/, the locators prefer them, and Settings → Publish loses its binary pickers. Recipe Read and Publish Site work in the sandboxed app on a machine with nothing onPATH.How
Scripts/helpers.sh— finds each engine (override dir → sibling checkout →~/t3/zig/<name>), cross-compiles both arches with pinned Zig +lipo, degrades to host-arch / skip-with-warning. Never fatal: missing engines mean builtin-compiler behavior, same as today.codesign).BundledHelper— one lookup:Bundle.main.url(forAuxiliaryExecutable:)plus the plainContents/Helpers/<name>path. Injected as a closure intoOliverLocator/BorisLocatorso tests pin the order: configured → bundled → env → PATH → sibling.CompilerBookmarkplumbing are gone. Legacy paths already in.banal/config.jsonstill round-trip; debug overrides stay viaBANAL_OLIVER_BIN/BANAL_BORIS_BIN.scriptErrorNumbersoosascriptsees an error instead of a silentmissing value. Found while verifying this PR.Verification
testDoctorFailsWhenConfiguredEngineIsMissing, which fails identically on cleanorigin/mainon machines with boris installed.make smoke: signed app boots against a scratch container vault.publish site→ status sentencePublished 1 note with Boris.and a real.publish/site on disk. No PATH binary involved — bundled helper executed under App Sandbox.Out of scope (filed)
#210 — publishing a mixed vault through Boris fails because recipe pages are written after Boris's link audit. Pre-existing on main (builtin path unaffected); needs a pipeline decision against ROADMAP M4 before bundling can claim mixed-vault publish.
Notes for review
PATH).dist/helpers/is a build artifact inside the existing gitignoreddist/; nothing prebuilt is committed.