Conversation
Add common single-char variable names (a, b, c, f, n, s, t, u) to the swiftlint exclusion list — these are standard Swift conventions for closures, formatters, and UTF-8 views. Replace manual for-if filter loop with allSatisfy to fix for_where lint violation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts: # macos/Bugbook.xcodeproj/project.pbxproj
Meeting page system - New MeetingPageView with header, property pills, notes editor body, and floating transcript widget anchored to the bottom (toggle opens upward). - AI summary + action items injected as document blocks; title auto-generated if H1 is empty. Idempotent regenerate via tracked block IDs in the sidecar. - Transcript persisted to .bugbook/meetings/<id>.json (nonisolated store, loads off the main thread). - New Meeting button instantly creates an empty meeting page and starts recording — no title prompt, placeholder shows "New Meeting". - Recording is service-owned, not pane-owned. Floating pill stays visible across pane navigation and reopens the meeting tab on tap. Tab bar shows a pulsing red dot for the recording meeting. Closing the tab warns instead of force-stopping. - Meetings dashboard (MeetingsView) is list-only; New Meeting + recent meetings grouped by recency. Frontmatter scanner replaces filename guessing. - macOS notifications (UNUserNotificationCenter) for upcoming calendar meetings with 2+ attendees or a conference URL — Record / Open Notes actions wired through ContentView. Sidebar refresh - Vertical icon+label nav list (Home, Search, Meeting, Calendar, Terminal, Browser, Mail, Notes) replaces the icon-only fixed zone in HarborSidebar. - Click replaces the focused pane; Cmd+click opens a new workspace tab. Sidebar context updates after pane replacement. - Trash button restored above Settings in the footer. - Removed divider line between fixed zone and contextual zone. - Calendar contextual sidebar: removed redundant Day/Week/Month buttons. Dead code cleanup (~3,000 lines) - Deleted SidebarView.swift (legacy 662-line view never instantiated). - Deleted MeetingKnowledgeView, AgentHubView, PaneFindBar, MeetingNotesEditor, MarkdownParser, SidebarPeekState (built but never wired). - Deleted MailIntelligenceService and its tests (only referenced in tests). - Removed dead methods: WorkspaceManager.mergeTab/nearestDocumentLeaf/ renameWorkspace, Workspace.fromOpenFile, MeetingNoteService.appendTranscriptToNote/ createMeetingNoteWithTranscript/renameMeetingPage, MeetingNotificationService.stopPolling. - Removed dead inline types: CalendarSourcePicker, BacklinksMenuButton. - Removed dead notifications: openMessages, openFullChat (and dead listeners). Filesystem and parsing - buildFileTree filters .md files smaller than 10 bytes (handles createNewFile's "# \n" placeholder) and skips empty subfolders. Single resourceValues call collapses two stat() syscalls into one — filesystem_tree_100 perf 13.6ms → 5.7ms. - Hidden Logseq vault folders (journals/, logseq/, whiteboards/) from sidebar. - MarkdownBlockParser gains stripYAMLFrontmatter and yamlValue helpers. - BlockDocument preserves YAML frontmatter through load/save cycle. Tooling - scripts/precommit.sh + .git/hooks/pre-commit symlink runs swift build + swiftlint (errors only) on staged Swift files. Skip with --no-verify. - TerminalSession._activeSurface annotated with swiftlint:disable directive (kept underscore prefix for the C-callback convention). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a11b3868c8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| // MARK: - Meeting Notification Handling | ||
|
|
||
| private func handleMeetingNotification(_ notification: Foundation.Notification, startRecording: Bool) { |
There was a problem hiding this comment.
Honor notification “Record” action by starting recording
handleMeetingNotification(_:startRecording:) receives a startRecording flag but never uses it, so .meetingNotificationRecord and .meetingNotificationOpenNotes currently do the same thing (just open/navigate to the note). In the notification workflow this means pressing Record does not actually start recording unless the user manually clicks Record again on the page.
Useful? React with 👍 / 👎.
| lines.append(" - \(Self.yamlEscape(name))") | ||
| } | ||
| } | ||
| lines.append("type: meeting") |
There was a problem hiding this comment.
Add meeting_id to calendar-generated meeting frontmatter
MeetingPageView.stopRecording only persists transcript sidecar data when cachedMeetingId is present, but buildMeetingNoteContent(for:) closes YAML frontmatter without writing meeting_id. As a result, calendar-created meeting pages cannot reliably save/load transcript history and generated block IDs across reopen/reload.
Useful? React with 👍 / 👎.
| ## Notes | ||
|
|
||
| """ | ||
| try? content.write(toFile: pagePath, atomically: true, encoding: .utf8) |
There was a problem hiding this comment.
Prevent fallback notification flow from overwriting notes
In the event-cache-miss branch, the code builds a deterministic filename (yyyy-MM-dd — <title>.md) and writes to it unconditionally. If the user triggers the notification action multiple times (or two same-title meetings land on the same day), this path overwrites an existing note and can destroy prior edits.
Useful? React with 👍 / 👎.
…ite guard - handleMeetingNotification now honors the startRecording flag by setting appState.pendingAutoRecordPath before navigating, so the "Record" action on a meeting notification actually starts recording. - Calendar-generated meeting notes now include meeting_id in frontmatter so transcript sidecars and generated block IDs persist across reopen/reload. - Event-cache-miss fallback no longer overwrites an existing note with the same deterministic filename; it opens the existing file instead. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
scripts/precommit.sh) runsswift build+ swiftlint on staged Swift files locally, mirroring CI.This PR also bundles browser/terminal/Chromium scaffolding from a prior session that was uncommitted on dev — the meeting work depends on it for the build to compile.
Test plan
.git/hooks/pre-commit)🤖 Generated with Claude Code