Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
302 commits
Select commit Hold shift + click to select a range
92c6f27
fix(python): use venv Python for all services to fix dotenv errors (#…
AlexMadera Dec 26, 2025
e1b0f74
fix(updater): proper semver comparison for pre-release versions (#313)
MikeeBuilds Dec 26, 2025
e80ef79
fix(project): fix task status persistence reverting on refresh (#246)…
MikeeBuilds Dec 26, 2025
661e47c
fix(ci): add auto-updater manifest files and version auto-update (#317)
MikeeBuilds Dec 26, 2025
cb6b216
fix(tasks): sync status to worktree implementation plan to prevent re…
AlexMadera Dec 26, 2025
8a80b1d
fix(ci): remove version bump to fix branch protection conflict (#325)
MikeeBuilds Dec 26, 2025
50e3111
feat: bump version (#329)
AlexMadera Dec 26, 2025
d3a63b0
perf: convert synchronous I/O to async operations in worktree handler…
JoshuaRileyDev Dec 27, 2025
fec6b9f
refactor(settings): remove deprecated ProjectSettings modal and hooks…
Mitsu13Ion Dec 27, 2025
9734b70
chore: Refactor/kanban realtime status sync (#249)
souky-byte Dec 27, 2025
787667e
refactor(components): remove deprecated TaskDetailPanel re-export (#344)
Mitsu13Ion Dec 27, 2025
d51f456
feat: centralize CLI tool path management (#341)
Furansujin Dec 27, 2025
9d43abe
refactor: remove deprecated code across backend and frontend (#348)
Mitsu13Ion Dec 27, 2025
fef07c9
feat: add terminal dropdown with inbuilt and external options in task…
JoshuaRileyDev Dec 27, 2025
40d04d7
chore: bump version to 2.7.2-beta.10
AndyMik90 Dec 27, 2025
e9782db
fix(ui): close parent modal when Edit dialog opens (#354)
MikeeBuilds Dec 27, 2025
4dcc5af
fix: make backend tests pass on Windows (#282)
tosincarik Dec 27, 2025
4e71361
fix(analyzer): add C#/Java/Swift/Kotlin project files to security has…
MikeeBuilds Dec 27, 2025
7881b2d
fix(terminal): preserve terminal state when switching projects (#358)
AndyMik90 Dec 27, 2025
1fa7a9c
fix: Resolve pre-commit hook failures with version sync, pytest path,…
ianstantiate Dec 27, 2025
eabe7c7
fix(subprocess): handle Python paths with spaces (#352)
MikeeBuilds Dec 27, 2025
20f20fa
fix(security): invalidate profile cache when file is created/modified…
MikeeBuilds Dec 27, 2025
753dc8b
fix(perf): remove projectTabs from useEffect deps to fix re-render lo…
MikeeBuilds Dec 27, 2025
9bbdef0
fix/Improving UX for Display/Scaling Changes (#332)
kvnloo Dec 27, 2025
2d3b7fb
docs: add security research documentation (#361)
bdmorin Dec 27, 2025
0ca2e3f
fix: fixed version-specific links in readme and pre-commit hook that …
ianstantiate Dec 28, 2025
db0cbea
fix: Memory Status card respects configured embedding provider (#336)…
MikeeBuilds Dec 28, 2025
bc22064
Fixes failing spec - "gh CLI Check Handler - should return installed:…
ianstantiate Dec 28, 2025
8b4ce58
fix(ideation): update progress calculation to include just-completed …
illia1f Dec 28, 2025
7751588
fix(github): improve PR review with structured outputs and fork suppo…
AndyMik90 Dec 28, 2025
68548e3
feat(analyzer): add iOS/Swift project detection (#389)
MikeeBuilds Dec 28, 2025
aaa8313
fix: improve CLI tool detection and add Claude CLI path settings (#393)
jslitzkerttcu Dec 28, 2025
98b12ed
fix(ui): prevent TaskEditDialog from unmounting when opened (#395)
MikeeBuilds Dec 28, 2025
321c971
fix(analyzer): move Swift detection before Ruby detection (#401)
MikeeBuilds Dec 29, 2025
0513121
fix: 2.7.2 bug fixes and improvements (#388)
AndyMik90 Dec 29, 2025
9aef0dd
fix(frontend): add .js extension to electron-log/main imports
AndyMik90 Dec 29, 2025
a39ea49
chore(ci): remove redundant CLA GitHub Action workflow
AndyMik90 Dec 29, 2025
4bdf7a0
fix(github): pass repo parameter to GHClient for explicit PR resoluti…
AndyMik90 Dec 29, 2025
230de5f
feat(build): add Flatpak packaging support for Linux (#404)
Mitsu13Ion Dec 29, 2025
e7e6b52
fix(model): respect task_metadata.json model selection (#415)
AndyMik90 Dec 30, 2025
2f66246
fix: Allow windows to run CC PR Reviewer (#406)
AlexMadera Dec 30, 2025
0a571d3
feat: add gitlab integration (#254)
Mitsu13Ion Dec 30, 2025
717fba0
feat: enhance pr review page to include PRs filters (#423)
AlexMadera Dec 30, 2025
62a7551
fix(spec_runner): add --base-branch argument support (#428)
Mitsu13Ion Dec 30, 2025
88c7605
fix(client): add spec_dir to SDK permissions (#429)
Mitsu13Ion Dec 30, 2025
515b73b
ci: remove conventional commits PR title validation workflow
AndyMik90 Dec 29, 2025
bdb0154
feat: Enhance the look of the PR Detail area (#427)
AlexMadera Dec 30, 2025
798ca79
fix(ui): add fallback to prevent tasks stuck in ai_review status (#397)
MikeeBuilds Dec 30, 2025
ac8dfca
refactor: remove deprecated TaskDetailPanel component (#432)
Mitsu13Ion Dec 30, 2025
666794b
feat(frontend): Add Files tab to task details panel (#430)
Mitsu13Ion Dec 30, 2025
3c0708b
fix(windows): resolve EINVAL error when opening worktree in VS Code (…
fireapache Dec 30, 2025
203a970
fix: infinite loop in useTaskDetail merge preview loading (#444)
abe238 Dec 31, 2025
c15bb31
fix: accept Python 3.12+ in install-backend.js (#443)
abe238 Dec 31, 2025
2effa53
fix: prevent infinite re-render loop in task selection useEffect (#442)
abe238 Dec 31, 2025
da31b68
feat: remove top bars (#386)
fireapache Dec 31, 2025
5d8ede2
Fix/2.7.2 beta12 (#424)
AndyMik90 Dec 31, 2025
0f9c5b8
fix(pr-review): treat LOW-only findings as ready to merge (#455)
AndyMik90 Dec 31, 2025
fb6b7fc
fix: create spec.md during roadmap-to-task conversion (#446)
Pranaveswar19 Dec 31, 2025
52a4fcc
fix(ci): add Rust toolchain for Intel Mac builds (#459)
AndyMik90 Dec 31, 2025
7210610
Fix/windows issues (#471)
AndyMik90 Jan 1, 2026
8e5c11a
chore: bump version to 2.7.2-beta.12 (#460)
AndyMik90 Jan 1, 2026
4da8cd6
fix(detection): support bun.lock text format for Bun 1.2.0+ (#525)
AndyMik90 Jan 1, 2026
8d58dd6
fix: prefer versioned Homebrew Python over system python3 (#494)
mirzaaghazadeh Jan 1, 2026
344ec65
fix(pr-review): use temporary worktree for PR review isolation (#532)
AndyMik90 Jan 1, 2026
3db02c5
fix(csp): allow external HTTPS images in Content-Security-Policy (#549)
MikeeBuilds Jan 2, 2026
30f7951
fix: resolve frontend lag and update dependencies (#526)
AndyMik90 Jan 2, 2026
f58c257
fix(memory): fix learning loop to retrieve patterns and gotchas (#530)
AndyMik90 Jan 2, 2026
7990dcb
fix(ui): preserve original task description after spec creation (#536)
AndyMik90 Jan 2, 2026
29e4550
fix: detect and clear cross-platform CLI paths in settings (#535)
AndyMik90 Jan 2, 2026
c2148bb
fix(ci): add Python setup to beta-release and fix PR status gate chec…
AndyMik90 Jan 2, 2026
16a7fa4
fix(merge): resolve KanbanBoard conflicts favoring develop
AndyMik90 Jan 2, 2026
90a2032
feat(terminal): respect preferred terminal setting for Windows PTY shell
AndyMik90 Jan 2, 2026
90dddc2
fix(ci): cache pip wheels to speed up Intel Mac builds
AndyMik90 Jan 2, 2026
dedd075
# 🔥 hotfix(electron): restore app functionality on Windows broken by …
sniggl Jan 2, 2026
6d4231e
ci(release): add CHANGELOG.md validation and fix release workflow
AndyMik90 Jan 2, 2026
04de8c7
fix(merge): handle Windows CRLF line endings in regex fallback
AndyMik90 Jan 2, 2026
effaa68
fix: Solve ladybug problem on running npm install all on windows (#576)
AlexMadera Jan 2, 2026
6ac3012
2.7.2 release
AndyMik90 Jan 2, 2026
2880baf
Merge branch 'fix/2.7.3-hotfixes' into develop
AndyMik90 Jan 2, 2026
d278963
feat: custom Anthropic compatible API profile management (#181)
gnoviawan Jan 2, 2026
3086233
Improving Task Card Title Readability (#461)
fireapache Jan 2, 2026
5efc2c5
docs: update stable download links to v2.7.2 (#579)
AlexMadera Jan 2, 2026
4a83304
feat: add Dart/Flutter/Melos support to security profiles (#583)
Mitsu13Ion Jan 2, 2026
6c85590
fix(kanban): complete refresh button implementation (#584)
MikeeBuilds Jan 3, 2026
14b3db5
fix: pass electron version explicitly to electron-rebuild on Windows …
fireapache Jan 3, 2026
f5be794
fix(frontend): resolve PATH and PYTHONPATH issues in insights and cha…
hluisi Jan 3, 2026
7177c79
fix: human_review status persistence bug (worktree plan path fix) (#605)
MikeeBuilds Jan 3, 2026
13535f1
feat(terminal): add worktree support for terminals (#625)
AndyMik90 Jan 3, 2026
acdd7d9
refactor(github-review): replace confidence scoring with evidence-bas…
AndyMik90 Jan 3, 2026
556f0b2
fix(frontend): filter empty env vars to prevent OAuth token override …
Ashwinhegde19 Jan 3, 2026
4ec9db8
fix: security hook cwd extraction and PATH issues (#555, #556) (#587)
hluisi Jan 3, 2026
f7b02e8
fix(ci): include update manifests for architecture-specific auto-upda…
hluisi Jan 3, 2026
39da819
Fix/small fixes 2.7.3 (#631)
AndyMik90 Jan 3, 2026
46c41f8
fix: change hardcoded Opus defaults to Sonnet (fix #433) (#633)
MikeeBuilds Jan 3, 2026
b720312
fix(ui): update TaskCard description truncation for improved display …
AndyMik90 Jan 3, 2026
e1e8943
fix(mcp): use shell mode for Windows command spawning (#572)
andydataguy Jan 4, 2026
eeef8a3
fix: check .claude.json for OAuth auth in profile scorer (#652)
MikeeBuilds Jan 4, 2026
65f6089
fix(python): sanitize environment to prevent PYTHONHOME contamination…
MikeeBuilds Jan 5, 2026
234d44f
fix(settings): allow toggle deselection and improve embedding model n…
MikeeBuilds Jan 5, 2026
8be0e6f
feat(sentry): add anonymous error reporting with privacy controls (#636)
AndyMik90 Jan 5, 2026
1e3e8bd
Fix/update app (#594)
AndyMik90 Jan 5, 2026
6fb2d48
fix: improve GLM presets, ideation auth, and Insights env (#648)
StillKnotKnown Jan 5, 2026
c271354
fix: detect Claude CLI installed via NVM on Linux/macOS (#623)
StillKnotKnown Jan 5, 2026
7b4993e
Fix/small fixes all around (#645)
AndyMik90 Jan 5, 2026
35573fd
fix(frontend): detect @lydell/node-pty prebuilts in postinstall (#673)
fireapache Jan 5, 2026
63f4617
sentry dev support + sessions handling in terminals
AndyMik90 Jan 5, 2026
81afc3d
fix(terminal): resolve React Fast Refresh hook error in usePtyProcess
AndyMik90 Jan 5, 2026
e293732
docs: add stars badge and star history chart to README (#675)
eddie333016 Jan 5, 2026
3930b12
fix(a11y): Add missing ARIA attributes for screen reader accessibilit…
Orinks Jan 5, 2026
2c9fcbf
chore: Update Linux app icon to use multiple resolution sizes and fix…
Pdzly Jan 5, 2026
97f3449
fix(github): pass OAuth token to Python runner subprocesses (fixes #5…
MikeeBuilds Jan 5, 2026
ec4441c
fix: centralize Claude CLI invocation (#680)
StillKnotKnown Jan 5, 2026
5005e56
Fix Window Size on Hi-DPI Displays (#696)
aaronson2012 Jan 5, 2026
78aceae
fix(profiles): support API profiles in auth check and model resolutio…
gnoviawan Jan 6, 2026
09aa4f4
fix: WIndows not finding the gith bash path (#724)
AlexMadera Jan 6, 2026
574cd11
fix: pass augmented env to Claude CLI validation on macOS (#640)
tallinn102 Jan 6, 2026
8a4b506
fix: show OAuth terminal during profile authentication (#671)
bvdr Jan 6, 2026
84bc522
fix(setup): auto-create .env from .env.example during backend install…
Crimson341 Jan 6, 2026
df57fbf
fix: InvestigationDialog overflow issue (#669)
jackchuka Jan 6, 2026
2f321fb
Fix: Security allowlist not working in worktree mode (#646)
arcker Jan 6, 2026
724ad82
fix(a11y): Add context menu for keyboard-accessible task status chang…
Orinks Jan 6, 2026
78b80bc
fix: Multiple bug fixes including binary file handling and semantic t…
AndyMik90 Jan 6, 2026
7fda36a
fix: use --continue instead of --resume for Claude session restoratio…
AndyMik90 Jan 6, 2026
e9c859c
fix(memory): use Homebrew for Ollama installation on macOS (#742)
MikeeBuilds Jan 6, 2026
e3d72d6
refactor: simplify task description handling and improve modal layout…
AndyMik90 Jan 6, 2026
f406959
fix(startup): prevent app freeze by making Claude CLI detection non-b…
aslaker Jan 7, 2026
31519c2
fix: add helpful error message when Python dependencies are missing (…
StillKnotKnown Jan 7, 2026
5e78390
fix(roadmap): normalize feature status values for Kanban display [ACS…
MikeeBuilds Jan 7, 2026
96b7eb4
ACS-103 Windows can finish a task (#739)
AlexMadera Jan 7, 2026
01decae
fix(memory): handle Ollama version errors during model pull (#760)
bbopen Jan 7, 2026
fbaf2e7
fix(windows): add pywin32 dependency for LadybugDB (#627) (#778)
AndyMik90 Jan 7, 2026
cbd47f2
fix(insights): await async sendMessage to prevent race condition (#61…
AndyMik90 Jan 7, 2026
061411d
fix(python-bundling): verify critical packages exist, not just marker…
AndyMik90 Jan 7, 2026
cc78d7a
fix(multi-project): filter task IPC events by project to prevent cros…
AndyMik90 Jan 7, 2026
4203341
fix(permissions): grant worktree access to original project directori…
AndyMik90 Jan 7, 2026
4cc9198
fix(frontend): ensure PATH includes system directories when launched …
czerewacz Jan 7, 2026
63766f7
feat(pr-review): add prominent verdict summary to PR review comments …
AndyMik90 Jan 7, 2026
40fc7e4
fix(terminal): prevent crash after worktree creation (#771)
AndyMik90 Jan 7, 2026
a47354b
fix: add PYTHONPATH to subprocess environment for bundled packages (#…
AndyMik90 Jan 7, 2026
29ef46d
fix: resolve subtasks tab not updating on Linux (#794)
StillKnotKnown Jan 7, 2026
05c652e
fix(ui): enable scrolling in Project Files list in Task Creation Wiza…
Ashwinhegde19 Jan 7, 2026
a6ffd0e
feat: Add terminal copy/paste keyboard shortcuts for Windows/Linux (#…
StillKnotKnown Jan 7, 2026
ab3149f
fix(a11y): restore missing aria-label attributes on icon buttons (#808)
Orinks Jan 8, 2026
e310d56
fix: increase Claude SDK JSON buffer size to 10MB (#815)
StillKnotKnown Jan 8, 2026
a74bd86
feat: add PR creation workflow for task worktrees (#677)
ThrownLemon Jan 8, 2026
32e8fee
fix: automate auto labeling based on comments (#812)
AlexMadera Jan 8, 2026
cbb1cb8
feat(github): enhance PR merge readiness checks with branch state val…
AndyMik90 Jan 8, 2026
ada91fb
feat: add Claude Code changelog link to version notifiers (#820)
StillKnotKnown Jan 8, 2026
07ae1ef
Fix pydantic_core missing module error during packaging (#806)
MaximStone Jan 8, 2026
63e142a
feat: Add Sentry environment variables to CI build workflows (#803)
AndyMik90 Jan 8, 2026
2045884
ci(release): add Azure Trusted Signing for Windows builds (#805)
AndyMik90 Jan 8, 2026
c623ab0
fix(github): use selectedPR from hook to restore Files changed list (…
StillKnotKnown Jan 8, 2026
dc29794
fix(ACS-51, ACS-55, ACS-71): Fix Kanban state transitions and status …
aslaker Jan 8, 2026
152678b
fix(ci): use HTTP for Azure Trusted Signing timestamp URL (#843)
AndyMik90 Jan 8, 2026
660e1ad
fix(ui): display subtask titles instead of UUIDs (#844) (#849)
AndyMik90 Jan 9, 2026
11710c5
fix: improve Claude CLI detection on Windows with space-containing pa…
g1331 Jan 9, 2026
91bd240
fix(ui): persist staged task state across app restarts (#800)
AndyMik90 Jan 9, 2026
df540ec
refactor(ui): extract shared task form components for consistent moda…
AndyMik90 Jan 10, 2026
a6bd884
Fix/worktree branch selection (#854)
AndyMik90 Jan 10, 2026
6dc538c
fix: properly quote Windows .cmd/.bat paths in spawn() calls (#889)
StillKnotKnown Jan 10, 2026
d9ed817
fix(github-prs): show running review state when switching back to PR …
StillKnotKnown Jan 10, 2026
d024eec
fix(merge): resolve multiple merge-related issues (ACS-194, ACS-179, …
StillKnotKnown Jan 11, 2026
96fc612
fix(ACS-203): Fix Kanban status flip-flop and phase state inconsisten…
StillKnotKnown Jan 11, 2026
f43c7c5
fix(ui): add Post Clean Review button for clean PR reviews (ACS-201) …
StillKnotKnown Jan 11, 2026
c4e08ae
fix(build): remove obsolete @lydell/node-pty extraResources entry
Jan 11, 2026
29d28bf
fix(planner): enforce implementation_plan schema (issue #884) (#912)
g1331 Jan 11, 2026
d9e3b28
fix(graphiti): add isinstance(dict) validation to prevent AttributeEr…
StillKnotKnown Jan 11, 2026
0c139ad
fix(memory): use shared project-wide memory for cross-spec learning (…
StillKnotKnown Jan 11, 2026
3ca15e1
fix(ACS-175): Resolve integrations freeze and improve rate limit hand…
MikeeBuilds Jan 12, 2026
9e86de7
fix(frontend): strip ANSI escape codes from roadmap/ideation progress…
StillKnotKnown Jan 12, 2026
179744e
fix(frontend): prevent "Render frame was disposed" crash (ACS-211) (#…
StillKnotKnown Jan 12, 2026
3c56a1b
fix(core): implement atomic JSON writes to prevent file corruption (A…
StillKnotKnown Jan 12, 2026
8eb6681
fix(workspace): auto-rebase spec branch when behind before merge (#94…
StillKnotKnown Jan 12, 2026
57903fe
New/relase (#949)
AndyMik90 Jan 12, 2026
9543561
Merge main into develop and fix CodeQL issues
AndyMik90 Jan 12, 2026
24e6f95
fix: address CodeQL and PR review findings
AndyMik90 Jan 12, 2026
462af9b
fix(ci): fix semver comparison and changelog formatting
AndyMik90 Jan 12, 2026
e0b6aa3
Merge main into develop after squash merge of v2.7.3
AndyMik90 Jan 12, 2026
5ef67b0
Merge main into develop (sync after v2.7.3 release fixes)
AndyMik90 Jan 12, 2026
228d877
ci: add Azure auth test workflow
AndyMik90 Jan 12, 2026
b995a55
fix(worktree): handle "already up to date" case correctly (ACS-226) (…
StillKnotKnown Jan 12, 2026
e396168
docs: update README download links to v2.7.3 (#973)
AndyMik90 Jan 12, 2026
5e84912
fix(terminal): add collision detection for terminal drag and drop reo…
AndyMik90 Jan 12, 2026
8cacff2
fix(ACS-181): enable auto-switch on 401 auth errors & OAuth-only prof…
MikeeBuilds Jan 13, 2026
a172d7d
feat(ui): implement usage statistics badge for top bar (ACS-228)
StillKnotKnown Jan 12, 2026
de7776b
test: add comprehensive tests for usage indicator and profile usage s…
StillKnotKnown Jan 12, 2026
74236a3
fix: address PR review findings
StillKnotKnown Jan 12, 2026
32f4e12
fix: address CodeQL security findings
StillKnotKnown Jan 12, 2026
0b147c7
fix: address Auto Claude PR review findings
StillKnotKnown Jan 12, 2026
a4e5d22
fix: address additional code review feedback
StillKnotKnown Jan 13, 2026
a710b32
fix: resolve @shared alias issue in main process
StillKnotKnown Jan 13, 2026
4e7689d
fix: address additional code review feedback
StillKnotKnown Jan 13, 2026
3bb1bec
fix: revert tooltip test changes to use original working approach
StillKnotKnown Jan 13, 2026
00e6fa4
fix: remove unused RESETTING_SOON import from usage-monitor
StillKnotKnown Jan 13, 2026
6e26674
fix: address additional code review feedback - round 2
StillKnotKnown Jan 13, 2026
4070683
fix: revert * 100 removal and remove problematic RESETTING_SOON test
StillKnotKnown Jan 13, 2026
8aa2a32
fix: remove unused RESETTING_SOON import from test file
StillKnotKnown Jan 13, 2026
75d0824
feat(frontend): add Claude Code version rollback feature (#983)
AndyMik90 Jan 13, 2026
c004fac
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
AndyMik90 Jan 13, 2026
e211e47
fix: address code review findings for usage statistics feature
StillKnotKnown Jan 13, 2026
9f0aa1d
fix: correct Z.ai API response structure based on actual API
StillKnotKnown Jan 13, 2026
9c025a7
fix(security): inherit security profiles in worktrees and validate sh…
AndyMik90 Jan 13, 2026
8145f29
feat(frontend): add searchable branch combobox to worktree creation d…
AndyMik90 Jan 13, 2026
e6235e6
fix(frontend): sync worktree config to renderer on terminal restorati…
AndyMik90 Jan 13, 2026
89587a6
fix(merge): include files with content changes even when semantic ana…
AndyMik90 Jan 13, 2026
ca8f6f1
fix(terminal): detect Claude exit and reset label when user closes Cl…
AndyMik90 Jan 13, 2026
8eaa926
fix(app-update): persist downloaded update state for Install button v…
AndyMik90 Jan 13, 2026
f1377ef
fix(backend): add Sentry integration and fix broken pipe errors (#991)
AndyMik90 Jan 13, 2026
c6f2560
fix: improve Claude CLI detection and add installation selector (#1004)
AndyMik90 Jan 13, 2026
c618a26
ci(release): move VirusTotal scan to separate post-release workflow (…
AndyMik90 Jan 13, 2026
e1b8b0d
fix(ui): display actual base branch name instead of hardcoded main (#…
AndyMik90 Jan 13, 2026
32eac72
test: add additional test coverage for usage indicator
StillKnotKnown Jan 13, 2026
b729c36
fix(github-prs): prevent preloading of PRs currently under review (#1…
AndyMik90 Jan 13, 2026
a1b258a
chore: bump version to 2.7.4
AndyMik90 Jan 13, 2026
d25244b
fix: populate timestamp fields in CLI fallback for countdown timer
StillKnotKnown Jan 13, 2026
3d0b2cb
fix(security): inherit security profiles in worktrees and validate sh…
AndyMik90 Jan 13, 2026
18e3708
feat(frontend): add searchable branch combobox to worktree creation d…
AndyMik90 Jan 13, 2026
388df7a
fix(frontend): sync worktree config to renderer on terminal restorati…
AndyMik90 Jan 13, 2026
e7d0599
fix(merge): include files with content changes even when semantic ana…
AndyMik90 Jan 13, 2026
685ecc0
fix(terminal): detect Claude exit and reset label when user closes Cl…
AndyMik90 Jan 13, 2026
9d06b37
fix(app-update): persist downloaded update state for Install button v…
AndyMik90 Jan 13, 2026
9808753
fix(backend): add Sentry integration and fix broken pipe errors (#991)
AndyMik90 Jan 13, 2026
f284526
fix: improve Claude CLI detection and add installation selector (#1004)
AndyMik90 Jan 13, 2026
91a978d
ci(release): move VirusTotal scan to separate post-release workflow (…
AndyMik90 Jan 13, 2026
bebc075
fix(ui): display actual base branch name instead of hardcoded main (#…
AndyMik90 Jan 13, 2026
7c076d2
fix(github-prs): prevent preloading of PRs currently under review (#1…
AndyMik90 Jan 13, 2026
b56c833
fix: distinguish OAuth tokens from regular API keys for api.anthropic…
StillKnotKnown Jan 13, 2026
fefc17a
hotfix/sentry-backend-build
AndyMik90 Jan 13, 2026
08e7933
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
StillKnotKnown Jan 13, 2026
9a4c99e
fix: address code review findings for usage statistics
StillKnotKnown Jan 13, 2026
4ab288a
fix(github): resolve circular import issues in context_gatherer and s…
AndyMik90 Jan 13, 2026
023b6e8
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
StillKnotKnown Jan 13, 2026
5dbcc80
feat(sentry): embed Sentry DSN at build time for packaged apps (#1025)
AndyMik90 Jan 13, 2026
d723cb5
Fix Duplicate Kanban Task Creation on Rapid Button Clicks (#1021)
AndyMik90 Jan 13, 2026
58010fa
feat(terminal): add YOLO mode to invoke Claude with --dangerously-ski…
AndyMik90 Jan 13, 2026
7414811
Make worktree isolation prominent in UI (#1020)
AndyMik90 Jan 13, 2026
2f24c69
fix(terminal): improve worktree name input UX (#1012)
AndyMik90 Jan 13, 2026
a5359bc
fix(terminal): enhance terminal recreation logic with retry mechanism…
AndyMik90 Jan 13, 2026
86e7c34
fix: address code review findings - API retry and bounds validation
StillKnotKnown Jan 13, 2026
1869dcf
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
StillKnotKnown Jan 13, 2026
fee5574
fix: add missing usage badge event forwarding to renderer
StillKnotKnown Jan 13, 2026
120071c
feat(terminal): add task worktrees section and remove terminal limit …
AndyMik90 Jan 13, 2026
6e46ec4
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
StillKnotKnown Jan 13, 2026
57bd8ee
Add file/screenshot upload to QA feedback interface (#1018)
AndyMik90 Jan 13, 2026
810ba39
fix(auth): await profile manager initialization before auth check (#1…
StillKnotKnown Jan 13, 2026
5506449
Merge branch 'develop' into stillknotknown/acs-228-ui-usage-statistic…
StillKnotKnown Jan 13, 2026
acee593
fix: use profile-specific environment for CLI usage fetching
StillKnotKnown Jan 13, 2026
e122978
fix: show usage badge even when proactive swap is disabled
StillKnotKnown Jan 13, 2026
a2a4d0b
fix: add getAPIProfileUsage API for on-demand usage badge display
StillKnotKnown Jan 13, 2026
dcbee64
Merge upstream/develop
StillKnotKnown Jan 13, 2026
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
139 changes: 116 additions & 23 deletions apps/frontend/src/main/claude-profile/usage-monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,35 @@
*
* Uses hybrid approach:
* 1. Primary: Direct OAuth API (https://api.anthropic.com/api/oauth/usage)
* 2. Fallback: CLI /usage command parsing
* 2. API profiles: Provider-specific endpoints (Z.ai, etc.)
* 3. Fallback: CLI /usage command parsing
*/

import { EventEmitter } from 'events';
import { spawn } from 'child_process';
import { getClaudeProfileManager } from '../claude-profile-manager';
import { ClaudeUsageSnapshot } from '../../shared/types/agent';
import { loadProfilesFile, detectProvider, fetchUsageForProfile, fetchAnthropicOAuthUsage } from '../services/profile';

Check notice

Code scanning / CodeQL

Unused variable, import, function or class Note

Unused imports detectProvider, fetchAnthropicOAuthUsage, fetchUsageForProfile, loadProfilesFile.
import { getClaudeCliInvocationAsync } from '../claude-cli-utils';
import { getSpawnCommand, getSpawnOptions } from '../env-utils';
import { parseUsageOutput, parseResetTime, classifyRateLimitType } from './usage-parser';

Check notice

Code scanning / CodeQL

Unused variable, import, function or class Note

Unused import parseResetTime.
import { getProfileEnv } from '../rate-limit-detector';

export class UsageMonitor extends EventEmitter {
private static instance: UsageMonitor;
private intervalId: NodeJS.Timeout | null = null;
private currentUsage: ClaudeUsageSnapshot | null = null;
private isChecking = false;
private useApiMethod = true; // Try API first, fall back to CLI if it fails

// Swap loop protection: track profiles that recently failed auth
private authFailedProfiles: Map<string, number> = new Map(); // profileId -> timestamp
private static AUTH_FAILURE_COOLDOWN_MS = 5 * 60 * 1000; // 5 minutes cooldown

private static CLI_USAGE_TIMEOUT_MS = 10000; // 10 seconds timeout for CLI /usage command
// API retry mechanism: retry API after N consecutive successful CLI fallbacks
private cliFallbackSuccessCount = 0;
private static CLI_FALLBACK_RETRY_THRESHOLD = 5; // Retry API after 5 successful CLI calls

// Debug flag for verbose logging
private readonly isDebug = process.env.DEBUG === 'true';

Expand All @@ -46,8 +57,8 @@
const profileManager = getClaudeProfileManager();
const settings = profileManager.getAutoSwitchSettings();

if (!settings.enabled || !settings.proactiveSwapEnabled) {
console.warn('[UsageMonitor] Proactive monitoring disabled. Settings:', JSON.stringify(settings, null, 2));
if (!settings.enabled) {
console.warn('[UsageMonitor] Usage monitoring disabled. Settings:', JSON.stringify(settings, null, 2));
return;
}

Expand All @@ -57,7 +68,7 @@
}

const interval = settings.usageCheckInterval || 30000;
console.warn('[UsageMonitor] Starting with interval:', interval, 'ms');
console.warn('[UsageMonitor] Starting with interval:', interval, 'ms', 'Proactive swap:', settings.proactiveSwapEnabled ? 'enabled' : 'disabled');

// Check immediately
this.checkUsageAndSwap();
Expand Down Expand Up @@ -124,7 +135,8 @@
const sessionExceeded = usage.sessionPercent >= settings.sessionThreshold;
const weeklyExceeded = usage.weeklyPercent >= settings.weeklyThreshold;

if (sessionExceeded || weeklyExceeded) {
// Only perform proactive swap if enabled
if (settings.proactiveSwapEnabled && (sessionExceeded || weeklyExceeded)) {
if (this.isDebug) {
console.warn('[UsageMonitor:TRACE] Threshold exceeded', {
sessionPercent: usage.sessionPercent,
Expand Down Expand Up @@ -159,20 +171,20 @@
if ((error as any).statusCode === 401 || (error as any).statusCode === 403) {
const profileManager = getClaudeProfileManager();
const activeProfile = profileManager.getActiveProfile();

if (activeProfile) {
// Mark this profile as auth-failed to prevent swap loops
this.authFailedProfiles.set(activeProfile.id, Date.now());
console.warn('[UsageMonitor] Auth failure detected, marked profile as failed:', activeProfile.id);

// Clean up expired entries from the failed profiles map
const now = Date.now();
this.authFailedProfiles.forEach((timestamp, profileId) => {
if (now - timestamp > UsageMonitor.AUTH_FAILURE_COOLDOWN_MS) {
this.authFailedProfiles.delete(profileId);
}
});

try {
const excludeProfiles = Array.from(this.authFailedProfiles.keys());
console.warn('[UsageMonitor] Attempting proactive swap (excluding failed profiles):', excludeProfiles);
Expand Down Expand Up @@ -287,7 +299,7 @@
if (error?.statusCode === 401 || error?.statusCode === 403) {
throw error;
}

console.error('[UsageMonitor] API fetch failed:', error);
return null;
}
Expand All @@ -296,18 +308,99 @@
/**
* Fetch usage via CLI /usage command (fallback)
* Note: This is a fallback method. The API method is preferred.
* CLI-based fetching would require spawning a Claude process and parsing output,
* which is complex. For now, we rely on the API method.
* CLI-based fetching spawns a Claude process and parses output.
*/
private async fetchUsageViaCLI(
_profileId: string,
_profileName: string
profileId: string,
profileName: string
): Promise<ClaudeUsageSnapshot | null> {
// CLI-based usage fetching is not implemented yet.
// The API method should handle most cases. If we need CLI fallback,
// we would need to spawn a Claude process with /usage command and parse the output.
console.warn('[UsageMonitor] CLI fallback not implemented, API method should be used');
return null;
try {
console.warn('[UsageMonitor] Attempting CLI fallback for profile:', profileName);

// Get CLI invocation with augmented environment and profile-specific environment
const { command: claudeCmd, env: augmentedEnv } = await getClaudeCliInvocationAsync();
const profileEnv = getProfileEnv(profileId);

// Merge augmented environment with profile-specific environment
// Profile-specific vars take precedence
const mergedEnv: Record<string, string> = {
...augmentedEnv,
...profileEnv,
};

// Spawn Claude CLI with /usage command
const execCmd = getSpawnCommand(claudeCmd);
const spawnOptions = getSpawnOptions(execCmd, {
env: mergedEnv,
timeout: UsageMonitor.CLI_USAGE_TIMEOUT_MS
});

const child = spawn(execCmd, ['/usage'], spawnOptions);

let stdout = '';
let stderr = '';

child.stdout?.on('data', (data) => {
stdout += data.toString();
});

child.stderr?.on('data', (data) => {
stderr += data.toString();
});

return new Promise((resolve) => {
const timeoutId = setTimeout(() => {
child.kill();
console.error('[UsageMonitor] CLI usage fetch timed out');
resolve(null);
}, UsageMonitor.CLI_USAGE_TIMEOUT_MS);

child.on('close', (code) => {
clearTimeout(timeoutId);

if (code !== 0) {
console.error('[UsageMonitor] CLI usage fetch failed:', stderr);
resolve(null);
return;
}

try {
// Parse CLI output - returns ClaudeUsageData
const usageData = parseUsageOutput(stdout);

// Convert ClaudeUsageData to ClaudeUsageSnapshot
const snapshot: ClaudeUsageSnapshot = {
sessionPercent: usageData.sessionUsagePercent,
weeklyPercent: usageData.weeklyUsagePercent,
sessionResetTime: usageData.sessionResetTime || this.formatResetTime(undefined),
weeklyResetTime: usageData.weeklyResetTime || this.formatResetTime(undefined),
profileId,
profileName,
fetchedAt: new Date(),
limitType: classifyRateLimitType(usageData.weeklyResetTime || usageData.sessionResetTime)
};

console.warn('[UsageMonitor] Successfully fetched via CLI');

// Increment CLI success count and potentially retry API
this.cliFallbackSuccessCount++;
if (this.cliFallbackSuccessCount >= UsageMonitor.CLI_FALLBACK_RETRY_THRESHOLD) {
console.warn('[UsageMonitor] Retrying API method after', this.cliFallbackSuccessCount, 'successful CLI fetches');
this.cliFallbackSuccessCount = 0;
this.useApiMethod = true;
}

resolve(snapshot);
} catch (error) {
console.error('[UsageMonitor] Failed to parse CLI usage output:', error);
resolve(null);
}
});
});
} catch (error) {
console.error('[UsageMonitor] CLI usage fetch exception:', error);
return null;
}
}

/**
Expand Down Expand Up @@ -347,12 +440,12 @@
additionalExclusions: string[] = []
): Promise<void> {
const profileManager = getClaudeProfileManager();

// Get all profiles to swap to, excluding current and any additional exclusions
const allProfiles = profileManager.getProfilesSortedByAvailability();
const excludeIds = new Set([currentProfileId, ...additionalExclusions]);
const eligibleProfiles = allProfiles.filter(p => !excludeIds.has(p.id));

if (eligibleProfiles.length === 0) {
console.warn('[UsageMonitor] No alternative profile for proactive swap (excluded:', Array.from(excludeIds), ')');
this.emit('proactive-swap-failed', {
Expand All @@ -362,7 +455,7 @@
});
return;
}

// Use the best available from eligible profiles
const bestProfile = eligibleProfiles[0];

Expand Down
56 changes: 53 additions & 3 deletions apps/frontend/src/main/ipc-handlers/terminal-handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,32 @@ export function registerTerminalHandlers(
);


// Get usage statistics for active profile (API-based, on-demand)
ipcMain.handle(
IPC_CHANNELS.PROFILES_GET_USAGE,
async (): Promise<IPCResult<import('../../shared/types').ClaudeUsageSnapshot>> => {
try {
const { fetchActiveProfileUsage } = await import('../services/profile');
const result = await fetchActiveProfileUsage();

if (!result.success || !result.usage) {
return {
success: false,
error: result.error || 'Failed to fetch usage data'
};
}

return { success: true, data: result.usage };
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Failed to fetch usage data'
};
}
}
);


// Terminal session management (persistence/restore)
ipcMain.handle(
IPC_CHANNELS.TERMINAL_GET_SESSIONS,
Expand Down Expand Up @@ -761,12 +787,36 @@ export function initializeUsageMonitorForwarding(mainWindow: BrowserWindow): voi

// Forward usage updates to renderer
monitor.on('usage-updated', (usage: ClaudeUsageSnapshot) => {
mainWindow.webContents.send(IPC_CHANNELS.USAGE_UPDATED, usage);
if (!mainWindow.isDestroyed()) {
mainWindow.webContents.send(IPC_CHANNELS.USAGE_UPDATED, usage);
}
});

// Forward proactive swap notifications to renderer
// Forward proactive swap completed events to renderer
monitor.on('proactive-swap-completed', (data: any) => {
if (!mainWindow.isDestroyed()) {
mainWindow.webContents.send(IPC_CHANNELS.PROACTIVE_SWAP_NOTIFICATION, {
type: 'completed',
...data
});
}
Comment on lines +796 to +802
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider typing event data parameters.

The data: any parameters in the event handlers could be typed for better maintainability. Consider defining interfaces for swap completion/failure event payloads.

Also applies to: 806-812

🤖 Prompt for AI Agents
In @apps/frontend/src/main/ipc-handlers/terminal-handlers.ts around lines 796 -
802, Event handlers use untyped parameters; define interfaces (e.g.,
ProactiveSwapCompletedPayload and ProactiveSwapFailedPayload) describing the
expected fields, then replace the any types in the monitor.on callbacks (e.g.,
the handler registered for 'proactive-swap-completed' and the one for
'proactive-swap-failed') with the new interfaces; ensure the payload shapes
match what you spread into the IPC message and update imports/exports as needed
so TypeScript enforces the event payload shape.

});

// Forward proactive swap failed events to renderer
monitor.on('proactive-swap-failed', (data: any) => {
if (!mainWindow.isDestroyed()) {
mainWindow.webContents.send(IPC_CHANNELS.PROACTIVE_SWAP_NOTIFICATION, {
type: 'failed',
...data
});
}
});

// Forward show-swap-notification events (for in-app swap notifications)
monitor.on('show-swap-notification', (notification: unknown) => {
mainWindow.webContents.send(IPC_CHANNELS.PROACTIVE_SWAP_NOTIFICATION, notification);
if (!mainWindow.isDestroyed()) {
mainWindow.webContents.send(IPC_CHANNELS.PROACTIVE_SWAP_NOTIFICATION, notification);
}
});

debugLog('[terminal-handlers] Usage monitor event forwarding initialized');
Expand Down
14 changes: 14 additions & 0 deletions apps/frontend/src/main/services/profile/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,17 @@ export {

export type { CreateProfileInput, UpdateProfileInput } from './profile-service';

// Profile Usage Service
export {
detectProvider,
fetchZaiUsage,
fetchAnthropicOAuthUsage,
fetchUsageForProfile,
fetchActiveProfileUsage
} from './profile-usage';

export type { UsageProvider, UsageFetchResult } from './profile-usage';

// Re-export types from shared for convenience
export type {
APIProfile,
Expand All @@ -41,3 +52,6 @@ export type {
DiscoverModelsResult,
DiscoverModelsError
} from '@shared/types/profile';

// Re-export RESETTING_SOON from shared/types/agent for convenience
export { RESETTING_SOON } from '../../../shared/types/agent';
Loading
Loading