the_og
41891ddad4
Merge pull request 'fix: block duplicate env/header keys at entry instead of silently dropping one ( #38 )' ( #49 ) from fix/38-duplicate-kv-keys into main
CI / Tests (py3.12 / windows-latest) (push) Successful in 18s
CI / Lint (ruff) (push) Successful in 13s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 13s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 12s
2026-07-12 13:06:54 -04:00
the_og
408f517c5d
Merge pull request 'fix: pop old AND new name from health cache on rename ( #36 )' ( #48 ) from fix/36-health-cache-rename into main
CI / Tests (py3.12 / windows-latest) (push) Successful in 17s
CI / Lint (ruff) (push) Successful in 11s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 14s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 11s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 13s
2026-07-12 13:06:48 -04:00
the_og
9036729cd8
Merge pull request 'fix: MSIX warning gets a persistent banner instead of the status bar ( #35 )' ( #47 ) from fix/35-msix-banner into main
CI / Tests (py3.12 / windows-latest) (push) Successful in 18s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 14s
CI / Lint (ruff) (push) Successful in 9s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 14s
2026-07-12 13:06:41 -04:00
the_og
29a08e9532
Merge pull request 'ci: test on windows + python 3.13 ( #40 )' ( #46 ) from ci/40-test-matrix into main
CI / Tests (py3.12 / windows-latest) (push) Successful in 18s
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 10s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 10s
2026-07-12 13:06:34 -04:00
Cowork Supervisor
87303809b8
test: dep-check probe command must exist on Windows too
...
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.12 / windows-latest) (pull_request) Successful in 17s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 8s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 8s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 8s
python3 is not a command on a stock Windows install; caught by the new
windows-latest CI job. Probe 'python' there and accept warn (found on
augmented PATH) as proof of resolution.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 13:05:04 -04:00
Cowork Supervisor
42456f25d2
fix: block duplicate env/header keys at entry instead of silently dropping one ( #38 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 9s
Closes #38
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 13:04:49 -04:00
Cowork Supervisor
2d274b9e03
fix: MSIX warning gets a persistent banner instead of the status bar ( #35 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 10s
CI / Tests (py3.12) (pull_request) Successful in 9s
The status bar is rewritten on every action, so the appended MSIX
warning vanished on first interaction. A dedicated warn banner under
the top bar stays visible.
Closes #35
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 13:03:57 -04:00
Cowork Supervisor
5c476bb13f
fix: pop old AND new name from health cache on rename ( #36 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 10s
Closes #36
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 13:03:29 -04:00
Cowork Supervisor
62c8a2ea65
ci: use host py launcher for Windows tests (runner blocks setup-python)
...
CI / Tests (py3.12 / windows-latest) (pull_request) Failing after 20s
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 9s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 8s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 8s
The self-hosted Windows runner's PowerShell execution policy rejects
setup-python's install script, so Windows mirrors release.yml: py -3.12
+ venv (the version the release binaries ship with). Linux keeps the
full 3.10/3.12/3.13 setup-python matrix.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 13:02:09 -04:00
the_og
b485357cd5
Merge pull request 'fix: import every dropped .json (aggregate counts) + 5 MB size guard ( #39 )' ( #45 ) from fix/39-drop-import-all into main
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 9s
CI / Tests (py3.12) (push) Successful in 9s
2026-07-12 13:00:43 -04:00
the_og
6a91f830dc
Merge pull request 'fix: only advance update/lastCheck after a completed check ( #37 )' ( #44 ) from fix/37-update-lastcheck into main
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 9s
CI / Tests (py3.12) (push) Successful in 10s
2026-07-12 13:00:36 -04:00
the_og
6dacc26057
Merge pull request 'fix: harden restart_claude_desktop — Linux refusal, macOS quit-wait, Windows MSIX guard ( #33 )' ( #43 ) from fix/33-restart-hardening into main
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 9s
CI / Tests (py3.12) (push) Successful in 9s
2026-07-12 13:00:30 -04:00
the_og
1087fc84d1
Merge pull request 'fix: keep UpdateCheckWorker alive until its thread finishes ( #32 )' ( #42 ) from fix/32-about-worker-lifetime into main
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 8s
CI / Tests (py3.12) (push) Successful in 8s
2026-07-12 13:00:22 -04:00
the_og
5df364fb2e
Merge pull request 'fix: spawn_test never raises — str-coerce env/command, wrap unexpected errors ( #34 )' ( #41 ) from fix/34-spawn-test-env into main
CI / Lint (ruff) (push) Successful in 8s
CI / Tests (py3.10) (push) Successful in 8s
CI / Tests (py3.12) (push) Successful in 8s
2026-07-12 13:00:14 -04:00
Cowork Supervisor
c7b2c90518
fix: spawn_test never raises — coerce env/command to str, wrap unexpected errors ( #34 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
Closes #34
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:59:19 -04:00
Cowork Supervisor
c493aa0c84
fix: harden restart_claude_desktop across platforms ( #33 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 10s
- Linux (and any non-desktop platform): refuse instead of 'pkill claude',
which substring-matched running Claude Code CLI sessions and relaunched
the CLI, not a desktop app. New restart_supported() gates the button.
- macOS: wait (<=5s) for the old instance to exit before 'open -a Claude'
so the relaunch can't re-activate the dying process. Runs off the UI
thread via a RestartWorker.
- Windows: verify the Start-menu shortcut exists BEFORE taskkill, so an
MSIX/Store install is never killed without a relaunch path.
Closes #33
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:58:15 -04:00
Cowork Supervisor
bb355dac31
fix: keep UpdateCheckWorker alive until its thread finishes ( #32 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
Closing the About dialog mid-check GC'd the dialog and the running
QThread with it -> 'QThread: Destroyed while thread is still running'.
A class-level keepalive set now holds each worker until finished;
stale results to a destroyed receiver are dropped by Qt.
Closes #32
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:53:12 -04:00
Cowork Supervisor
d95db2b026
fix: import every dropped .json (aggregate counts) + 5 MB size guard ( #39 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 9s
Closes #39
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:47:30 -04:00
Cowork Supervisor
42963f98b4
ci: test on windows + python 3.13 ( #40 )
...
CI / Tests (py3.10 / windows-latest) (pull_request) Failing after 24s
CI / Tests (py3.12 / windows-latest) (pull_request) Failing after 14s
CI / Tests (py3.13 / windows-latest) (pull_request) Failing after 10s
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 8s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 9s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 27s
Closes #40
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:47:14 -04:00
Cowork Supervisor
f5c9780948
fix: only advance update/lastCheck after a completed check ( #37 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 8s
Closes #37
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-12 12:46:59 -04:00
the_og
06326e5e9d
fix: app icon in packaged builds ( #31 , closes #20 )
CI / Lint (ruff) (push) Successful in 9s
CI / Tests (py3.10) (push) Successful in 8s
CI / Tests (py3.12) (push) Successful in 8s
2026-07-08 12:00:52 -04:00
Cowork Supervisor
6d91c709a7
fix: bundle icons + set app window icon and Windows AppUserModelID ( #20 )
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 10s
2026-07-08 11:59:57 -04:00
the_og
3b5379a2b8
feat: server search/filter + test-all health column ( #30 , closes #27 #28 )
CI / Lint (ruff) (push) Successful in 6s
CI / Tests (py3.10) (push) Successful in 8s
CI / Tests (py3.12) (push) Successful in 8s
2026-07-08 11:56:37 -04:00
Cowork Supervisor
f4d4301c26
Merge remote-tracking branch 'origin/main' into feat/server-list-ux
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-08 11:55:36 -04:00
the_og
5169b7276e
feat: MSIX-virtualized Claude config detection ( #29 , closes #7 )
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 8s
CI / Tests (py3.12) (push) Successful in 8s
2026-07-08 11:55:24 -04:00
Cowork Supervisor
668fb903d0
feat: server search/filter + test-all health column ( #27 , #28 )
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 7s
2026-07-08 11:53:31 -04:00
Cowork Supervisor
8c456c9a89
feat: detect MSIX-virtualized Claude config path + warn ( #7 )
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-08 11:51:23 -04:00
the_og
4c6fe7c5aa
release: v1.2.0 ( #26 ) — merge #6/#8/#9/#17/#18/#19
CI / Lint (ruff) (push) Successful in 6s
CI / Tests (py3.10) (push) Successful in 7s
CI / Tests (py3.12) (push) Successful in 8s
Build & Release / Build (Linux) (push) Successful in 59s
Build & Release / Build (Windows) (push) Successful in 1m9s
Build & Release / Build (macOS) (push) Has been cancelled
Build & Release / Publish Release (push) Has been cancelled
v1.2.0
2026-07-08 11:34:34 -04:00
Cowork Supervisor
8c718387c0
chore: bump version to 1.2.0 for release
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-07 22:14:49 -04:00
Cowork Supervisor
15a30fb986
Merge branch 'feat/18-19-about-update-checker' into integration/v1.2.0
...
# Conflicts:
# bcc.py
# bcc_core.py
# tests/test_core.py
2026-07-07 22:13:29 -04:00
Cowork Supervisor
c56dec8051
Merge branch 'feat/9-restart-claude-desktop' into integration/v1.2.0
...
# Conflicts:
# bcc_core.py
# tests/test_core.py
2026-07-07 22:12:35 -04:00
Cowork Supervisor
70b865be8f
Merge branch 'feat/6-log-viewer' into integration/v1.2.0
...
# Conflicts:
# bcc_core.py
# tests/test_core.py
2026-07-07 22:12:17 -04:00
Cowork Supervisor
8fdcbda681
Merge branch 'feat/17-stale-size-hardening' into integration/v1.2.0
2026-07-07 22:10:59 -04:00
the_og
2d9fb083dc
Fix: correct smart-quote/nbsp characters mangled in previous push
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-07 20:56:14 -04:00
the_og
4ab3c3b00a
Fix: rebuild from clean main (previous push included unrelated contaminated content)
CI / Lint (ruff) (pull_request) Failing after 8s
CI / Tests (py3.10) (pull_request) Failing after 8s
CI / Tests (py3.12) (pull_request) Failing after 7s
2026-07-07 20:51:26 -04:00
the_og
3e07b51134
Fix: rebuild from clean main (previous push included unrelated contaminated content)
CI / Lint (ruff) (pull_request) Failing after 6s
CI / Tests (py3.10) (pull_request) Successful in 7s
CI / Tests (py3.12) (pull_request) Successful in 7s
2026-07-07 20:48:52 -04:00
the_og
a811e323e6
Fix: rebuild from clean main (previous push included unrelated contaminated content)
CI / Lint (ruff) (pull_request) Failing after 6s
CI / Tests (py3.10) (pull_request) Successful in 7s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-07 20:44:39 -04:00
the_og
3cd18392c9
test: cover __version__, parse_version/is_newer_version, and fetch_latest_release ( #19 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 9s
CI / Tests (py3.12) (pull_request) Successful in 7s
All network calls are monkeypatched (urllib.request.urlopen) — no live
network in tests. Covers older/newer/equal comparisons, v-prefix,
differing-length tuples, malformed input on both sides, and
fetch_latest_release success/timeout/network-failure/malformed-response
paths.
2026-07-07 20:44:00 -04:00
the_og
67c898cd35
feat: About dialog with menu bar + notify-only update checker UI ( #18 , #19 )
...
- Add a real QMenuBar (Help -> About...).
- AboutDialog: app icon, name, version (core.__version__), and links to the
repo/issues/license opened via QDesktopServices.openUrl (system browser,
never in-app navigation). macOS unsigned-app note.
- "Check for updates" button + UpdateCheckWorker (QThread) runs
core.fetch_latest_release() off the UI thread; shows "up to date" or
"vX.Y.Z available" with a button to open the releases page. No binary
download, ever.
- Optional quiet startup auto-check, throttled to once/day via a QSettings
timestamp, off-thread, silent on failure, toggle lives in the About dialog.
2026-07-07 20:42:27 -04:00
the_og
16961a5cc8
test: cover restart_claude_desktop() and profile_targets_claude_desktop() ( #9 )
...
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.10) (pull_request) Successful in 8s
CI / Tests (py3.12) (pull_request) Successful in 8s
Mocks subprocess.run/Popen and patches sys.platform per-OS branch (darwin,
win32, linux) -- never actually kills or launches anything. Covers: correct
command sequence per platform, pkill/taskkill exiting non-zero (nothing to
kill) is NOT treated as failure, a failed relaunch IS reported as failure,
and profile_targets_claude_desktop() correctly distinguishes Claude Desktop
configs from Claude Code / legacy settings.json profiles.
2026-07-07 20:40:57 -04:00
the_og
2b3843a714
feat: add View logs button + LogViewerDialog for in-app MCP log viewer ( #6 )
CI / Lint (ruff) (pull_request) Successful in 6s
CI / Tests (py3.10) (pull_request) Successful in 7s
CI / Tests (py3.12) (pull_request) Successful in 8s
2026-07-07 20:40:32 -04:00
the_og
256827eaf3
fix: use \xa0 escape instead of a literal NBSP byte (transmission-safe, same behavior); drop stray trailing blank line
2026-07-07 20:38:35 -04:00
the_og
85d47aea97
test: add server_log_path coverage (macOS, Windows, missing, unsupported) ( #6 )
2026-07-07 20:36:58 -04:00
the_og
f9752211a2
test: add coverage for config_fingerprint mtime+size hardening ( #17 )
...
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10) (pull_request) Successful in 11s
CI / Tests (py3.12) (pull_request) Successful in 7s
Includes the required regression case: rewrite a file with different
content, force the original mtime back via os.utime, and assert the
fingerprint still differs (because size changed).
2026-07-07 20:35:03 -04:00
the_og
7c8fd6d0bb
fix: use explicit backslash-u-0-0-a-0 escape for non-breaking space literal
2026-07-07 20:34:53 -04:00
the_og
f1935fe320
feat: use mtime+size fingerprint for stale-file check ( #17 )
...
MainWindow._loaded_mtime -> _loaded_stat (core.ConfigStat), populated
via core.config_fingerprint() at load/save time. The save-path stale
check now compares the full fingerprint (mtime AND size) instead of
bare mtime equality.
2026-07-07 20:33:38 -04:00
the_og
0ffc6a1fb6
chore: restore trailing newline in bcc_core.py (attempt 2)
2026-07-07 20:32:36 -04:00
the_og
fd2c3567a0
feat: Restart Claude Desktop button after save ( #9 )
...
After a successful save, shows a 'Restart Claude Desktop' button next to
the status line. Only shown when the saved profile targets Claude Desktop
(core.profile_targets_claude_desktop) -- never for Claude Code, which has
no GUI process to bounce. Clicking it calls core.restart_claude_desktop()
and reports success/failure. The button hides again on further edits or
when switching/reloading profiles.
2026-07-07 20:32:14 -04:00
the_og
346d0aabb6
fix: use escape for non-breaking space (byte-exact transcription fix)
2026-07-07 20:30:35 -04:00
the_og
5d59c1c423
fix: restore actual file content (previous commit had placeholder text by mistake)
2026-07-07 20:30:03 -04:00