Skip to content

Mac: GitHub CI for the session's branch, pull requests and Google Calendar - #247

Open
JhoanG956 wants to merge 53 commits into
Louis-CFM:mainfrom
JhoanG956:feat/mac-github-ci-calendar
Open

JhoanG956 wants to merge 53 commits into
Louis-CFM:mainfrom
JhoanG956:feat/mac-github-ci-calendar

Conversation

@JhoanG956

@JhoanG956 JhoanG956 commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Builds on #86 (which builds on #85). Until those are merged this PR also shows their commits. The Mac work is b012ed5; the rest are merges of main.

The macOS side of #86: the GitHub card and the Google Calendar pill now work the same on the Mac as on Windows.

GitHub: CI of the branch you're on, reviews and pull requests

  • CI of the Claude Code session's branch, read from the project's .git folder (GitHubActivity.swift, no git process). It takes the CI row of the GitHub card (GitHub build) and the CI detail lists it first.
  • Reviews asked of you and your open pull requests with their review decision; pull requests idle for a month drop off.
  • Mochi speaks up when a run on that branch finishes or someone reviews one of your pull requests (IntegrationNews.swift).
  • GithubPoller follows the branch of whichever shown session spoke last.

Google Calendar: a new pill

  • Signs in with the user's own Desktop OAuth client (PKCE, a one-shot listener on 127.0.0.1), read-only scopes, refresh token in the Keychain. The App Store entitlements gain network.server for that listener.
  • Next events from every calendar shown in Google Calendar, with Join for the meeting that's on, and a reminder card (new reminder view) when Google Calendar would ring.

Also

  • Claude Code sessions from the Claude desktop app's Code tab that arrive without main's claude-desktop tag are recognized by the app's bundle ID and land on the same Claude Desktop pill; their permission prompts stay in the desktop app.
  • Dropping a file elsewhere (or pressing Escape) puts the island back the way it was.
  • Shell steps in the ticker drop the cd <project> && prefix.
  • Privacy policy (EN/FR), README, SPEC, INTEGRATIONS and CHANGELOG updated.
  • CI runs the two new test scripts.

Testing

🤖 Generated with Claude Code

JhoanG956 and others added 13 commits October 1, 2026 02:48
When the island hides, the window shrinks to a 240x6 wake strip and the
cursor poll thread parks. The poll tick that was running at that moment
could still see the cursor away from the island and turn click-through
(WS_EX_TRANSPARENT) back on. set_collapsed() clears the flag on the main
thread, but the poll thread's setter is queued to the event loop and
lands afterwards, so the strip ended up click-through: the mouse passed
straight through it and the island could only be woken by Claude Code
events, never by hovering the top of the screen.

The poll thread now clears click-through itself when it parks. Its
setters go through the same queue, so this one always lands after any
flag the last tick set.
The Cargo workspace root is windows/, so target/ sits inside Vite's
root. During `tauri dev`, Vite's watcher tried to watch .pdb files
cargo still held open and crashed with EBUSY, which made Tauri abort
the beforeDevCommand. Ignore target/, src-tauri/ and hook/ in the dev
server watcher.
Pins both to the patch release instead of a bare "^2", and syncs the
lockfile with the 0.1.1 version already set in package.json.
The completed-step label sat at its static position after the shimmering
one, so any label wider than the row wrapped it onto a second line: once a
step completed, its text dropped right on top of the current one. Both
layers are now stacked absolutely on the same 22 px line, each a single
ellipsized line, with the full text in the row's tooltip.

- Shell steps drop the `cd <project> &&` / `cd <project>;` prefix Claude
  puts in front of most commands (the card already names the project) and
  collapse whitespace, instead of a blind 40-character cut.
- The frame loop stays alive while the ticker is mid-scroll: it used to
  stop as soon as nothing else was moving, freezing two rows half-overlapped.
- dev/ticker-preview: a harness that feeds the ticker fake steps, bursts
  and a stalled loop, like dev/upload-preview does for the drop sequence.
When a dragged file left the island, the island stayed open on purpose —
the file might come back — but nothing noticed when the drag was over.
Dragging a file in and then dropping it elsewhere (or pressing Escape)
left the drop zone up until the auto-close fired, up to 30 s later.

- The Rust cursor poll emits `mouse-button` whenever the left button
  changes, checked before the "cursor hasn't moved" skip: an abandoned
  drag usually ends with the mouse standing still.
- The island remembers where it was when a file first reached it. Once
  the file is out and the button is up, after a 250 ms grace so a late
  drop still wins, it goes back there: hidden (compact if the cursor is
  still over it), the view it was showing — a pending approval included —
  or compact.

Leaving and coming back with the button held keeps the island open as
before, and a drop on the island still runs the normal upload sequence.
GitHub
- The card now follows the CI of the branch of the last Claude Code
  session (read from its .git folder, worktrees included), the reviews
  asked of you, and your open pull requests with their review state.
  Pull requests idle for 30 days are left out. Stars and repositories
  remain as the fallback overview.
- One GraphQL query per minute. Mochi speaks up when a CI run it watched
  finishes, on a new review of your pull requests, and on a new review
  request.

Google Calendar (new pill)
- Signs in with the user's own Desktop OAuth client: PKCE via Windows
  CNG, one-shot loopback listener, refresh token in the Credential
  Manager, Cancel for Google error pages that never redirect back.
  Read-only scopes: events and the calendar list.
- Reads every calendar shown in Google Calendar, not just the primary
  one; rows take their calendar's colour, with Join for the meeting
  that's on.
- Reminders ring when Google Calendar would: the event's own reminders,
  else its calendar's defaults, else the primary calendar's, else five
  minutes. They open a card with the event, time and place and
  Join / Open / OK, or wait as a badge when the island is busy.

Also: attention events (amber badge), shared date helpers in time.rs,
dev/integrations-preview.html to check the cards with fake data, and
the privacy policy, README and INTEGRATIONS.md updated.
web_search_20260209 allows programmatic tool calling by default, which
Haiku doesn't support, so the API rejected every chat request made with
Haiku selected. Restrict the tool to direct calls for Haiku models only;
Opus and Sonnet requests are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…endar (WIP)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the 54 commits from the original repository (iPhone app, GitHub
pulse, keyboard shortcuts, wardrobe, desktop Mochi, chat providers, …).

GitHub on macOS now builds on the original's pulse instead of a second
implementation: the branch of the last Claude Code session (read from its
.git folder, GitHubBranchCI.swift) rides along with the pulse query, takes
the CI row of the card when there is one, and is listed first in the CI
detail. New reviews on your PRs and runs finishing on that branch raise the
same badge and sound as the other GitHub events. The original's
GitHubActivity (contribution calendar) keeps its name.

Google Calendar, the reminder card, the Claude desktop app sessions, the
abandoned file drag and the ticker's `cd … &&` cleanup are carried over onto
the new code (PillCatalog, sidebar Settings, Cursor/Codex routing, MusicPill).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gcal.rs drew its random bytes and SHA-256 from Windows CNG, which doesn't
exist on Linux, so the Tauri app stopped compiling there once the Calendar
work met the Linux port. Linux now reads /dev/urandom and hashes with sha2
(already in the tree through Tauri); Windows keeps CNG. A test checks the
RFC 7636 S256 example on whichever implementation the platform builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JhoanG956 and others added 6 commits October 6, 2026 09:56
…dar branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dar branch

0.2.0 moved the Settings and island strings to the String Catalog. The
GitHub token hint now uses upstream's key plus a CI sentence of its own,
and the Google Calendar hint, "Google account not connected" and
"Default branch CI" get catalog entries in the 10 languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…b CI / Google Calendar branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…/ Google Calendar branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ogle Calendar branch

build.yml keeps both new test steps: Google Calendar and the Claude settings file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Google Calendar branch

Main now gives the Claude desktop app its own pill, tagged from
CLAUDE_CODE_ENTRYPOINT. This branch's bundle-ID check stays as the
fallback for events without that tag, but routes them to the same
agent_claude-desktop pill instead of the VS Code one, and its CHANGELOG
line goes since main's entry covers the feature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JhoanG956 and others added 9 commits October 8, 2026 01:13
… CI / Google Calendar branch

Main's Windows catch-up (Louis-CFM#307) brings its own GitHub card, and the Windows
side of this work already lives in its own pull request (Louis-CFM#86). This branch
now takes main's windows/ as is and stays the macOS part: the CHANGELOG
entries and INTEGRATIONS section 8 no longer describe Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dar branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Google Calendar branch

The Claude desktop app's bundle-ID fallback stays ahead of main's new
terminal detection, so those sessions still reach the Claude Desktop pill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ub CI / Google Calendar branch

SpotifyPill moves to this branch's shared hover (isHovered / onHover from
AgentPillsView), like MusicPill and AgentPill, so only one pill lights up
at a time. The string catalog is merged key by key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tHub CI / Google Calendar branch

build.yml keeps both new test steps: Google Calendar and pill colours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… GitHub CI / Google Calendar branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ogle Calendar branch

Settings keeps both additions: the GitHub token's CI hint and the voice
section. The island's new listening state joins petit and coucou in
abandonDrag, so a file drag abandoned while Mochi listens folds the island
instead of leaving the switch non-exhaustive.
… Google Calendar branch

The string catalog is merged key by key.
…ub CI / Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
…Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
…/ Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
… CI / Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
…he GitHub CI / Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
…itHub CI / Google Calendar branch

The Keychain key list keeps both additions: Google Calendar's OAuth client
and refresh token, and the ElevenLabs API key. The string catalog is
merged key by key; the project file is regenerated.
…e Calendar branch

The string catalog is merged key by key; the project file is regenerated.
… Google Calendar branch

A file dropped on the notch first ends this branch's drag tracking
(cancelAbandon, dragOrigin), then goes into the voice email when one is
in progress. The privacy page keeps the Google Calendar and Voice
paragraphs. The string catalog is merged key by key; the project file is
regenerated.
…ub CI / Google Calendar branch

The privacy page keeps the Google Calendar paragraph next to main's
updated Voice one; the project file is regenerated.
… Google Calendar branch

The CHANGELOG's Unreleased section lists main's Android entries first,
then this branch's.
…) into the GitHub CI / Google Calendar branch

The CHANGELOG's Unreleased section keeps main's Android entry and this
branch's four; main's Windows and Linux 0.4.0 section follows.
…e GitHub CI / Google Calendar branch

The string catalog is merged key by key; the project file is regenerated.
…nto the GitHub CI / Google Calendar branch

The integration card keeps this branch's serviceError next to main's
mailHasData. Settings shows the Google Calendar block before the Crypto
one, with main's single save button, which saves the Google keys too. The
string catalog is merged key by key; the project file is regenerated.
…o the GitHub CI / Google Calendar branch

The string catalog is merged key by key and written in Xcode's own format,
so the diff against main is only this branch's entries. The project file is
regenerated.
… GitHub CI / Google Calendar branch

Main turned its Unreleased section into Android 0.2.0, so this branch's
macOS entries move to their own Unreleased section above it.
…gle Calendar branch

The CHANGELOG's Unreleased section lists main's Flow dictation entry, then
this branch's. The project file is regenerated.
… / Google Calendar branch

The CHANGELOG keeps main's updated Flow dictation entry, then this
branch's.
… Google Calendar branch

The project file is regenerated.
…/ Google Calendar branch

The CHANGELOG's Unreleased section lists main's new entries, then this
branch's. The project file is regenerated, with the FluidAudio package.
…le Calendar branch

The project file is regenerated.
…alendar branch

Main released its Unreleased section as 0.4.0, so this branch's entries
move to a new Unreleased section above it. The README keeps main's new
Flow and Parakeet rows and this branch's Google Calendar mention. The
project file is regenerated.
… CI / Google Calendar branch

This branch's Unreleased section stays on top, above main's Windows and
Linux 0.5.0 section.
…he GitHub CI / Google Calendar branch

The privacy page keeps this branch's GitHub and Google Calendar paragraphs
next to main's Flow, Notetaker and Voice ones, in English and French.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant