Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .beads/issues.jsonl
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{"id":"ghostly-04s","title":"Add find/search functionality in editor","description":"Feature: Add a search bar (Cmd+F) to find text within the current note/tab. Should support: 1) Basic text search with match highlighting 2) Navigate between matches (next/previous) 3) Standard Cmd+F shortcut to toggle the search bar 4) Visual feedback showing match count and current position","status":"open","priority":2,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-02-22T22:45:57Z","created_by":"Gabko14","updated_at":"2026-03-01T14:43:20.569963Z","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-12i","title":"Support live markdown rendering (checkboxes, bullet points)","description":"## Overview\nAdd live markdown rendering so users can type markdown syntax and see it rendered inline.\n\n## Scope\n- `[]` or `[ ]` → renders as an unchecked checkbox\n- `[x]` → renders as a checked checkbox\n- `*` or `-` at line start → renders as a bullet point\n- Potentially: `#`, `##`, etc. for headings\n\n## Behavior\n- Transformation should happen as the user types (live preview)\n- The underlying text should still be markdown (for copy/paste compatibility)\n- Checkboxes should be interactive (clickable to toggle)\n\n## References\n- Similar to Notion, Obsidian, Bear, and other modern note apps","status":"closed","priority":2,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-01-20T20:06:06Z","created_by":"Gabko14","updated_at":"2026-01-24T00:06:02Z","closed_at":"2026-01-24T00:06:02Z","close_reason":"Implemented live markdown rendering via PR #33","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-18n","title":"Replace note persistence with durable SQLite store","status":"closed","priority":1,"issue_type":"feature","assignee":"gabko14","created_at":"2026-03-01T15:47:22.883918Z","created_by":"gabko14","updated_at":"2026-03-01T16:05:17.787509Z","closed_at":"2026-03-01T16:05:17.786745Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-1b1","title":"Add accessibility labels to theme buttons","description":"Theme buttons have .help() tooltips and .accessibilityIdentifier() but lack .accessibilityLabel() for VoiceOver users.\n\n## Changes\nAdd .accessibilityLabel() to each theme button in ThemeEditorView.swift:\n- \"System theme\" \n- \"Light theme\"\n- \"Dark theme\"\n\n## File\nThemeEditorView.swift (lines 30, 45, 60)","status":"closed","priority":3,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-18T00:24:40Z","created_by":"Gabko14","updated_at":"2026-01-18T01:14:49Z","closed_at":"2026-01-18T01:14:49Z","close_reason":"Completed in PR #16","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-1bg","title":"Improve inline markdown: add header rendering to MarkdownTransformer","description":"Enhance the existing MarkdownTransformer to support headers (e.g. # Title renders with larger font), alongside the existing bullet points, checkboxes, and bold text. This is the Google Keep-style approach — inline rendering in the editor itself, no separate preview mode. Text stays always selectable and editable. Consider adding a formatting toolbar for headers in the future.","status":"closed","priority":2,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-02-09T11:28:04Z","created_by":"Gabko14","updated_at":"2026-02-14T20:23:33Z","closed_at":"2026-02-14T20:23:33Z","close_reason":"Not feasible with current TextEditor + plain String architecture; true inline header styling requires attributed rich-text editor refactor","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-1ev","title":"selectTab should save to persist active tab across sessions","description":"In TabManager.swift, `selectTab()` changes the active tab but doesn't persist the change:\n\n```swift\nfunc selectTab(_ tabId: UUID) {\n guard tabs.contains(where: { $0.id == tabId }) else { return }\n activeTabId = tabId\n // Missing: saveTabs() or save activeTabId\n}\n```\n\n**Problem:**\n- If the user selects a different tab and the app is killed (not gracefully closed)\n- On next launch, the wrong tab will be active\n- Other methods like `newTab()` and `closeTab()` correctly call `saveTabs()`\n\n**Solution:**\nEither call `saveTabs()` in `selectTab()`, or save just the activeTabId to UserDefaults.\n\n**File:** `Ghostly/TabManager.swift:94-97`","status":"closed","priority":3,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-23T23:23:09Z","created_by":"Gabko14","updated_at":"2026-02-18T08:47:22Z","closed_at":"2026-02-18T08:47:22Z","close_reason":"Fixed in PR #48 — saveTabs() added to selectTab and navigation methods, persistence tests added","source_repo":".","compaction_level":0,"original_size":0}
Expand Down Expand Up @@ -55,7 +56,7 @@
{"id":"ghostly-okv","title":"Create SettingsView overlay","description":"Create a SettingsView that displays as a popover overlay (same pattern as ThemeEditorView).\n\n## Requirements\n- \"Settings\" title at top\n- \"Launch at Login\" toggle with .switch style\n- Same styling as ThemeEditorView (240x240, rounded corners, windowBackgroundColor)\n- Accessibility identifier for toggle\n\n## Files to create\n- Ghostly/Views/SettingsView.swift\n\n## Files to modify\n- Ghostly/Views/ContentView.swift (add settings overlay, same pattern as theme editor)\n\n## Blocked by\n- SettingsManager implementation","status":"closed","priority":2,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-01-18T01:30:12Z","created_by":"Gabko14","updated_at":"2026-01-19T00:07:16Z","closed_at":"2026-01-19T00:07:16Z","close_reason":"Implemented in PR #18","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-qq8","title":"Fix hardcoded corner radius in InnerGlowModifier","description":"InnerGlowModifier in GhostlyModifiers.swift has a hardcoded `cornerRadius: 12` (line 20), but SettingsView uses it with `cornerRadius: 20` for its background.\n\n**Problem:**\n- The inner glow overlay uses 12px corners\n- The settings view background uses 20px corners\n- Visual mismatch where glow doesn't follow the actual shape\n\n**Current code:**\n```swift\n// GhostlyModifiers.swift:20\nRoundedRectangle(cornerRadius: 12) // hardcoded\n\n// SettingsView.swift:72\n.background(.ultraThinMaterial, in: RoundedRectangle(cornerRadius: 20))\n```\n\n**Solution:**\nMake corner radius a parameter of the InnerGlowModifier, defaulting to 12 for backwards compatibility.\n\n**Files:**\n- `Ghostly/Styles/GhostlyModifiers.swift:20`\n- `Ghostly/Views/SettingsView.swift:70`","status":"closed","priority":2,"issue_type":"bug","owner":"gabkolistiak@gmail.com","created_at":"2026-01-23T23:22:27Z","created_by":"Gabko14","updated_at":"2026-02-14T18:21:38Z","closed_at":"2026-02-14T18:21:38Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-r60","title":"Remove Cmd+, keyboard shortcut for settings","description":"## Task\n\nRemove the Cmd+, keyboard shortcut for opening settings.\n\n## Rationale\n\nThe settings shortcut is unnecessary for a simple menu bar app - users can just click the ellipsis menu button to access settings. Removing it simplifies the codebase and eliminates the intermittent bug where the shortcut only works every other time.\n\n## Changes Required\n\n1. Remove `KeyboardShortcuts.onKeyUp(for: .toggleSettings)` from ContentView.swift\n2. Remove the `.toggleSettings` shortcut definition from KeyboardShortcuts+Extensions.swift (if dedicated)\n3. Remove `.keyboardShortcut(\",\")` from the Settings button in DropdownMenuView.swift\n4. Clean up any related imports or unused code","status":"closed","priority":2,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-20T17:54:24Z","created_by":"Gabko14","updated_at":"2026-01-20T19:55:00Z","closed_at":"2026-01-20T19:55:00Z","close_reason":"Fixed in PR #29","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-r8t","title":"Tab title truncation may split Unicode grapheme clusters","description":"In Tab.swift, the title truncation uses `String.prefix(17)`:\n\n```swift\nreturn String(firstLine.prefix(17)) + \"...\"\n```\n\n**Problem:**\nSwift's `prefix(_:)` operates on Characters which should handle grapheme clusters correctly, but complex emoji sequences could still cause issues in edge cases. More importantly, there's no consideration for visual width - CJK characters are visually wider than Latin characters.\n\n**Example issues:**\n- 17 CJK characters would overflow the UI width\n- Some emoji with zero-width joiners might have unexpected behavior\n\n**Solution:**\nConsider using a width-based truncation rather than character-count-based, or at minimum add tests for edge cases with CJK text and complex emoji.\n\n**File:** `Ghostly/Models/Tab.swift:31-32`","status":"closed","priority":3,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-23T23:23:07Z","created_by":"Gabko14","updated_at":"2026-02-18T08:47:49Z","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-r8t","title":"Tab title truncation may split Unicode grapheme clusters","description":"In Tab.swift, the title truncation uses `String.prefix(17)`:\n\n```swift\nreturn String(firstLine.prefix(17)) + \"...\"\n```\n\n**Problem:**\nSwift's `prefix(_:)` operates on Characters which should handle grapheme clusters correctly, but complex emoji sequences could still cause issues in edge cases. More importantly, there's no consideration for visual width - CJK characters are visually wider than Latin characters.\n\n**Example issues:**\n- 17 CJK characters would overflow the UI width\n- Some emoji with zero-width joiners might have unexpected behavior\n\n**Solution:**\nConsider using a width-based truncation rather than character-count-based, or at minimum add tests for edge cases with CJK text and complex emoji.\n\n**File:** `Ghostly/Models/Tab.swift:31-32`","status":"done","priority":3,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-23T23:23:07Z","created_by":"Gabko14","updated_at":"2026-02-18T08:47:49Z","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-scb","title":"Fix deprecated APIs","description":"Update deprecated API usages.\n\n## Step 1: Explore\nSearch for deprecated APIs including:\n- .animation() without value parameter\n- .cornerRadius()\n- PreviewProvider protocol\n\n## Step 2: Update\n- .animation() → .animation(_:value:)\n- .cornerRadius() → .clipShape(RoundedRectangle())\n- PreviewProvider → #Preview macro","status":"closed","priority":2,"issue_type":"task","owner":"gabkolistiak@gmail.com","created_at":"2026-01-12T15:48:39Z","created_by":"Gabko14","updated_at":"2026-01-17T22:10:59Z","closed_at":"2026-01-17T22:10:59Z","close_reason":"Merged PR #13","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-tiq","title":"Add keyboard shortcuts for switching tabs","description":"Add keyboard shortcuts to quickly switch between tabs. Common patterns include Cmd+1/2/3 for specific tabs and Cmd+Shift+[ / ] for previous/next tab navigation.","status":"closed","priority":2,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-01-30T22:11:38Z","created_by":"Gabko14","updated_at":"2026-01-30T22:24:12Z","closed_at":"2026-01-30T22:24:12Z","close_reason":"Implemented in PR #36","source_repo":".","compaction_level":0,"original_size":0}
{"id":"ghostly-uvo","title":"Add comprehensive test coverage","description":"The app currently has basic test coverage. We need extensive tests covering all functionality to reach >80% coverage.\n\n## Current State (as of PR #18)\n- **Unit tests**: 12 tests total\n - ThemeManagerTests: 7 tests\n - SettingsManagerTests: 3 tests\n - GhostlyUITests: 2 tests (app launches/terminates)\n- **Coverage**: ~30% of code\n\n## Required Test Coverage\n\n### Unit Tests\n\n#### ThemeManager (expand existing)\n- [ ] Test bgColor values for each theme\n- [ ] Test textColor values for each theme\n- [ ] Test invalid theme string handling\n\n#### SettingsManager (expand existing)\n- [ ] Test SMAppService registration error handling\n- [ ] Test state sync when system settings change\n\n#### ContentView Tests (new)\n- [ ] Text persistence via @AppStorage\n- [ ] Placeholder visibility when text is empty\n- [ ] Placeholder hidden when text has content\n- [ ] Theme editor overlay shows/hides\n- [ ] Settings overlay shows/hides\n- [ ] Focus state management\n\n### UI Tests (XCUITest)\n\n#### Menu Bar Integration\n- [ ] App appears in menu bar\n- [ ] Clicking menu bar icon opens popover\n- [ ] Popover has correct size\n\n#### Text Editor\n- [ ] Can type text in editor\n- [ ] Text persists after closing/reopening popover\n- [ ] Placeholder shows when empty\n- [ ] Placeholder disappears when typing\n\n#### Settings Flow\n- [ ] Settings button appears in dropdown menu\n- [ ] Clicking Settings opens overlay\n- [ ] Launch at Login toggle works\n- [ ] Clicking outside dismisses overlay\n\n#### Theme Switching\n- [ ] Theme editor opens\n- [ ] Can select System/Light/Dark themes\n- [ ] Theme persists after closing/reopening\n\n#### Dropdown Menu\n- [ ] Menu button is accessible\n- [ ] Quit option works\n\n## Acceptance Criteria\n- All unit tests pass with Swift 6 strict concurrency\n- UI tests cover core user flows\n- Code coverage > 80%\n- Tests run in CI pipeline","status":"closed","priority":1,"issue_type":"feature","owner":"gabkolistiak@gmail.com","created_at":"2026-01-18T01:23:50Z","created_by":"Gabko14","updated_at":"2026-01-20T19:14:08Z","closed_at":"2026-01-20T19:14:08Z","close_reason":"Closed","source_repo":".","compaction_level":0,"original_size":0}
Expand Down
Loading