fix(app): launchable packaged macOS app + native bar context menu & pause#6
Open
ShadowEsu wants to merge 8 commits into
Open
fix(app): launchable packaged macOS app + native bar context menu & pause#6ShadowEsu wants to merge 8 commits into
ShadowEsu wants to merge 8 commits into
Conversation
…menu + pause The documented `npm run dist:dmg` produced an app macOS silently killed at launch (hardened runtime + ad-hoc signature + library validation on), so it never appeared in the Dock or menu bar. Add an electron-builder afterSign hook (scripts/after-sign.mjs) that re-signs any non-Developer-ID bundle with the local library-validation-disabling entitlements, covering every packaging path; remove the now-duplicate manual re-sign from package-local.mjs. Real Developer ID signatures are detected by Team Identifier and left untouched. Island/bar work: native right-click context menu on the floating bar (shared with the tray via buildAppMenu), Pause/Resume, Explain Clipboard, and a Settings… item that opens the companion's Settings. New `paused` setting gates review triggers and dims the bar. typecheck + build + tests (31) green. Packaged-app launch and the context-menu popup still need a real macOS run to confirm. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Homepage demo section (VideoDemo) plays Unvibe's hosted pitch-deck recording (the same Vercel Blob URL the marketing site's HeroVideo defaults to; override with NEXT_PUBLIC_DEMO_VIDEO_URL) with a Vibe-Island-style chaptered slider that seeks the video. Adds a reusable AmbientLightField hero background (layered CSS+SVG "sunlight under water": base glow, caustic bands, god rays, grain, vignette) — reduced-motion static, pauses offscreen/hidden, lighter on mobile, ?ambientDebug=1 dev panel. Research notes in docs/research. typecheck + next build + 36 web tests green. Video host is unreachable from the build sandbox but resolves in a real browser / on Vercel. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Consolidated research on how Vibe Island functions as an app — architecture (hook-injection + local Unix-socket bridge, per-terminal jump, SSH helper, NSPanel overlay), UX/notch interaction, sound, onboarding, settings, packaging, pricing, and changelog themes — plus a synthesis of what transfers to Unvibe (which is a code-comprehension overlay, not an agent monitor). Sources cited; mechanism claims labeled confirmed vs inferred from the open-source clone. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Firsthand + two exploration passes: what Unvibe does, the repo layout (app/web/marketing/extension/server/docs) and how they fit, how the island works today (three disconnected windows: bar strip + review panel + companion), the full explanation flow with exact IPC/WidgetEvent names, the on-device secret-filter path, the learning/mastery model, the web backend surface + schema, and the honest gaps vs a state-driven island. Companion to the Vibe Island teardown. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Adapts Vibe Island's smoothness to Unvibe's code-learning purpose as testable logic + safe wiring: - core/islandState.ts (pure, tested): ProductState -> presentation/narration/ accent/sound/glance/dwell. One source of truth; backend events map through it. - core/sound.ts (pure, tested): original chiptune palette + shouldPlaySound gate (master toggle, milestones, quiet hours, quiet-while-locked; critical bypass). - main/island.ts: resolves state, pushes island:state + island:sound to the bar, powerMonitor lock detection. - Wired at real transitions (main.ts capture/permission/idle; review.ts send() funnel: generating/streaming/explanationReady/saved/error). - Bar renderer: narrates state with restrained accent borders + a glance- completion dot, synthesizes sounds via Web Audio, transient notices dwell then return to dormant. - Settings: glanceMode, soundMilestones, quietWhileLocked (companion General tab). +17 tests (48 total). typecheck + build + node --test green. New states verified by screenshotting the compiled bar in Chromium. Native NSPanel + on-device audio still need a real Mac run. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
…review - Milestone engine (core/learning.ts, pure+tested): milestonesCrossed() fires first_explanation / streaks / ten_concepts / five_languages from real recorded data only; wired into review.ts recordReview -> island 'milestone' + sound with the milestone's own title. - ConfirmButton (widget): Understand ✓ lingers a green ✓ before collapsing; reduced-motion follows through instantly. - Panel morph: progressive corners, body blur-to-sharp entry, staggered foot chips; all disabled under reduced-motion. - Live island preview in Settings: reflects glance + accent, with Ready/Saved/ Milestone cue buttons that synthesize the real sound palette. +3 tests (51 total). typecheck + build + node --test green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
- Onboarding finale: a real "Unvibe is ready." ceremony with a milestone cue and a Try-it-now that starts an actual review (arrival milestone comes from real recorded data, never a fake badge). - Sound gate: added `presenting` (full mute) to the pure SoundGate + test; wired as false in island.ts with a note that a native macOS screen-share detector is required before exposing any toggle (no decorative switches). - Progress log: recorded the full island v2 sweep and flagged the native NSPanel migration as an explicit out-of-environment follow-up (needs Swift + a Mac). 52 tests pass; typecheck + build green. Settings live-preview verified in Chromium. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
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.
Summary
Primary fix — the built app didn't show in the Dock or menu bar on macOS.
Root cause:
app/package.jsonsetsmac.hardenedRuntime: truewithmac.identity: null. The documented install commandnpm run dist:dmgmakes electron-builder fall back to an ad-hoc signature but does not disable library validation.hardenedRuntime + ad-hoc signature + library-validation-onis a combination macOS silently kills at launch — the process never reaches the Dock or menu bar, and there's no crash dialog. Onlyscripts/package-local.mjshad a manual re-sign workaround; the documenteddist/dist:dmgpath had none.Fix: added
app/scripts/after-sign.mjs, wired as electron-builder'sbuild.afterSignhook. It re-signs any bundle without a real Team Identifier usingbuild/entitlements.local.plist(which disables library validation), so every packaging path is launchable. A real Developer ID signature (package:releasewithCSC_NAME) is detected by its Team Identifier and left untouched. Removed the now-duplicate manual re-sign frompackage-local.mjs.Island / bar redesign (incremental)
bar:contextMenu→Menu.popup({ window: bar }), sharing onebuildAppMenu()with the tray so state stays in sync.pausedsetting gatesstartReview()and clipboard capture; the bar dims and reads "Paused".open:settings→onOpenSettings).Testing
npm run typecheck,npm run build,npm test(31 pass) all green.codesign; electron binary download is blocked). The afterSign hook is validated for syntax and ESM default-export shape only.Notes
Targeted at
codex/design-pixel-launch-experiment(the real trunk) rather than the stalemain, per the branch guidance. Not self-merged.🤖 Generated with Claude Code
https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Generated by Claude Code