Repository navigation
Conversation
|
Thank you for your contribution! 🎉 🔔 @yoshinyan you might want to have a look. You can use this guide to learn how to check out the Pull Request locally in order to test it. 📋 Quick checkout commandsBRANCH="codex/local-time-tracker-alerts-pomodoro"
FORK_URL="https://github.com/yoshinyan/raycast-extensions.git"
EXTENSION_NAME="local-time-tracker"
REPO_NAME="raycast-extensions"
git clone -n --depth=1 --filter=tree:0 -b $BRANCH $FORK_URL
cd $REPO_NAME
git sparse-checkout set --no-cone "extensions/$EXTENSION_NAME"
git checkout
cd "extensions/$EXTENSION_NAME"
npm install && npm run devWe're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days. |
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 3 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c87d559. Configure here.
| setActiveTimer(startedTimer); | ||
| if (usePomodoro && pomodoroEnabled) { | ||
| try { | ||
| await startPomodoroInterval(startedTimer.id); |
There was a problem hiding this comment.
Pomodoro start races reminder lock
Medium Severity
startTimer launches the menu bar, which takes the reminder lock inside checkReminders, and then startPomodoroInterval needs that same lock. launchCommand resolves when the menu-bar command starts, not when it finishes, so the Start Work plus Pomodoro path can fail with a lock error after the work timer has already begun.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit c87d559. Configure here.
| throw new Error("Another reminder operation is running. Try again shortly."); | ||
| } | ||
| await rmdir(path); | ||
| await mkdir(path); |
There was a problem hiding this comment.
Reminder lock recovery is unsafe
Medium Severity
After mkdir hits EEXIST, stat is not ready for the directory to disappear, and stale recovery does rmdir then mkdir without exclusivity. A lock released in that window surfaces as ENOENT, and two recoveries can both enter the critical section.
Reviewed by Cursor Bugbot for commit c87d559. Configure here.
| await launchCommand({ name: "menu-bar", type: LaunchType.Background }); | ||
| } catch (error) { | ||
| await showFailure("Work started, but Pomodoro could not start", error); | ||
| return; |
There was a problem hiding this comment.
Refresh error masks Pomodoro success
Low Severity
startPomodoroInterval and the follow-up menu-bar launchCommand share one try. A refresh failure after a successful start is reported as Pomodoro failing to start, and the start confirmation HUD is skipped even though the interval was saved.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit c87d559. Configure here.
c87d559 to
ab60a48
Compare
|
@greptileai review this draft on the latest commit ab60a48. |
|
@cursor review verbose=true |
|
@0xdhrv Could you help check or retrigger Cursor Bugbot for this PR when you have a chance? Greptile reviewed the latest commit ( Are manual review triggers restricted for external contributors, or could there be a repository integration issue? This PR is currently a draft; this request is just to get Bugbot's latest review. |
0xdhrv
left a comment
There was a problem hiding this comment.
Hey @yoshinyan 👋
Thanks for the careful work on this update 🔥 Everything the bots raised is fixed:
- Reminder lock: the old directory lock with stale-lock recovery is gone.
withReminderLocknow uses macOSlockf, so the OS releases the lock when its helper exits. That closes the ownership race that both Greptile and Bugbot found. - Pomodoro start:
startTimernow starts the Pomodoro interval inside the same reminder operation as the new timer, and only refreshes the menu bar afterwards. If the interval fails to start, the new timer is cleared. - Menu bar refresh:
refreshMenuBar()catches and logs its own errors, so a failed refresh no longer shows up as "Pomodoro failed to start". - Alerts: one failed notification no longer blocks the others, and the daily total can't count the session that was just stopped twice.
- Preferences: you use the generated
Preferencestype now.
Greptile gives it 5/5. Lint, build and TypeScript pass locally, and all four screenshots pass the framing check.
I didn't find anything blocking in this pass, so this is good to go. Approving now ✅ A few small things you could clean up before it merges:
Should fix
- Retake
metadata/03-reports.png. The mouse pointer sits on the Project Groups section header. Please capture it again with the pointer out of the window, using Window Capture → Save to Metadata.
As mentioned in our docs here ↗
- Add the Reports changes to the CHANGELOG. The new entry covers alerts and Pomodoro, but it doesn't mention the new Reports dashboard (totals, project mix, 7-day bars, 35-day activity) or the rename from categories to project groups.
Optional
- The three old Bugbot threads are still open on GitHub even though the code is fixed. You could resolve them with a short note.
- The dashboard SVG always uses a dark background (
#10151e). It's readable, but it will look like a dark card when Raycast is in light mode. Theme-aware colours would fit better there.
Feel free to reach me here or on Slack if anything comes up.


Description
Adds optional Pomodoro intervals and a configurable work-timer alert to Local Time Tracker, improves Reports with visual summaries and activity charts. All data stays in Raycast LocalStorage; no dependencies or external services are added.
Renames category labels and helpers to project groups while retaining the existing JSON storage keys. Removes the pre-release developer-only default-group fallback. Timer and Pomodoro changes share an OS-backed lock to prevent overlapping reminder operations. README and changelog document reminder behavior and background scheduling limits.
Validation
npm test: 48 tests passed, including 9 report visualization tests.npx tsc --noEmit,npm run lint, andnpm run buildpassed.This remains a draft while usage testing continues. The latest report fixes were also verified in Raycast using a separately built UI-test extension with isolated sample data: long Japanese names are abbreviated without overlapping durations, and deleted-project history remains visible in the daily chart when switching between today and month summaries.
Checklist
npm run buildand tested this distribution build in Raycast.assetsfolder are used by the extension itself.READMEare located outside the metadata folder if they were not generated with the metadata tool. (This README adds no media.)