8 Commits
Author SHA1 Message Date
the_og f73b49f17c Merge pull request 'release: prep 1.4.0 — bump version + finalize changelog' (#109) from release/v1.4.0 into main
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 13s
CI / Lint (ruff) (push) Successful in 8s
CI / Tests (py3.12 / windows-latest) (push) Successful in 25s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 12s
CI / Catalog signature (push) Successful in 7s
Build & Release / Build (Windows) (push) Successful in 59s
Build & Release / Build (macOS) (push) Successful in 2m1s
Build & Release / Build (Linux) (push) Successful in 1m3s
Build & Release / Signing key smoke test (push) Has been skipped
Build & Release / Publish Release (push) Successful in 18s
2026-08-13 12:56:03 -04:00
the_og 451e04cd96 release: prep 1.4.0 — bump version + finalize changelog
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 12s
CI / Tests (py3.12 / windows-latest) (pull_request) Successful in 24s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 14s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 13s
CI / Catalog signature (pull_request) Successful in 8s
Bumps __version__ and pyproject to 1.4.0 and rolls CHANGELOG's [Unreleased]
section into [1.4.0] - 2026-08-13, opening a fresh [Unreleased]. No behavior
change; this is the release-staging PR. After merge, push the v1.4.0 tag to
trigger release.yml.
2026-08-13 16:54:08 +00:00
the_og 675490e3c3 Merge pull request 'ci: skip test matrix on docs-only changes + add job timeouts' (#108) from ci/harden-runner into main
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.12 / windows-latest) (push) Successful in 26s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 11s
CI / Lint (ruff) (push) Successful in 8s
CI / Catalog signature (push) Successful in 7s
2026-08-13 12:53:23 -04:00
the_og 3768113938 Merge pull request 'docs: add CHANGELOG.md (Keep a Changelog) — Unreleased → 1.4.0' (#107) from docs/changelog into main
CI / Tests (py3.12 / windows-latest) (push) Successful in 24s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 12s
CI / Catalog signature (push) Successful in 7s
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 12s
2026-08-13 12:51:18 -04:00
the_og 583e4e4af0 ci: skip test matrix on docs-only changes + add job timeouts
CI / Lint (ruff) (pull_request) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 13s
CI / Tests (py3.12 / windows-latest) (pull_request) Successful in 27s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 13s
CI / Catalog signature (pull_request) Successful in 7s
- paths-ignore '**/*.md' on push/pull_request so a CHANGELOG/README-only PR
  doesn't spin up the (self-hosted, sometimes-offline) Windows test job.
- timeout-minutes on lint (10) / test (15) / catalog-signature (10) so a job
  that hangs mid-run fails instead of hanging forever.

Note: timeout-minutes counts from job start, so it does not rescue a job stuck
'Waiting to run' when the Windows runner is offline — paths-ignore covers the
docs case; code PRs still need the runner up.
2026-08-13 16:46:10 +00:00
the_og 38e9cf2b26 docs: add CHANGELOG.md (Keep a Changelog); Unreleased → 1.4.0
CI / Lint (ruff) (pull_request) Successful in 13s
CI / Tests (py3.10 / ubuntu-latest) (pull_request) Successful in 12s
CI / Tests (py3.12 / ubuntu-latest) (pull_request) Successful in 11s
CI / Tests (py3.13 / ubuntu-latest) (pull_request) Successful in 11s
CI / Catalog signature (pull_request) Successful in 7s
CI / Tests (py3.12 / windows-latest) (pull_request) Successful in 1m11s
Starts a per-release changelog. The Unreleased section captures everything
merged since v1.3.0 (ssh-mcp v2 support, sidecar detect/edit, version pin,
permission pre-flight, hot-reload, light theme, visible update checker,
move-to-env, cross-client phase 1) with the ssh-mcp-is-breaking-upstream /
BCC-is-additive distinction called out. Past releases backfilled from tags.
2026-08-13 15:27:01 +00:00
the_og d4ce2647ae Merge pull request 'feat(#102): in-app sidecar TOML editor (stacked on #101)' (#104) from feat/102 into main
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.12 / windows-latest) (push) Successful in 21s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 11s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 11s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 11s
CI / Catalog signature (push) Successful in 6s
2026-08-13 00:55:21 -04:00
the_og ece8c99f79 Merge pull request 'feat(#101): live hot-reload of external sidecar/config changes' (#103) from feat/101 into main
CI / Catalog signature (push) Successful in 7s
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10 / ubuntu-latest) (push) Successful in 11s
CI / Tests (py3.12 / windows-latest) (push) Successful in 21s
CI / Tests (py3.12 / ubuntu-latest) (push) Successful in 12s
CI / Tests (py3.13 / ubuntu-latest) (push) Successful in 11s
2026-08-13 00:55:04 -04:00
4 changed files with 102 additions and 2 deletions
+9
View File
@@ -3,13 +3,16 @@ name: CI
on: on:
push: push:
branches: [main] branches: [main]
paths-ignore: ["**/*.md"]
pull_request: pull_request:
paths-ignore: ["**/*.md"]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Lint (ruff) name: Lint (ruff)
timeout-minutes: 10
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -31,6 +34,11 @@ jobs:
test: test:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: Tests (py${{ matrix.python }} / ${{ matrix.os }}) name: Tests (py${{ matrix.python }} / ${{ matrix.os }})
# Guards against a job that hangs mid-run (e.g. a wedged test). Note: this
# counts from when a runner PICKS UP the job, so it does not rescue a job
# stuck "Waiting to run" because the self-hosted Windows runner is offline —
# for that, bring the runner back or skip via paths-ignore (docs).
timeout-minutes: 15
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -85,6 +93,7 @@ jobs:
catalog-signature: catalog-signature:
name: Catalog signature name: Catalog signature
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
+91
View File
@@ -0,0 +1,91 @@
# Changelog
All notable changes to **BetterClaudeConfig** are recorded here. The format is
based on [Keep a Changelog](https://keepachangelog.com/), and this project
follows [Semantic Versioning](https://semver.org/): breaking changes bump the
major, new features bump the minor, fixes bump the patch.
**When you open a PR, add a line under `[Unreleased]`.** At release time, that
section is renamed to the new version + date and a fresh `[Unreleased]` is
started.
## [Unreleased]
## [1.4.0] — 2026-08-13
> ⚠️ **Using the `ssh-mcp` server?** Upstream `ssh-mcp` shipped a **breaking
> v2**: it removed the `--password`, `--sudoPassword`, `--suPassword` and
> `--disableSudo` command-line flags, and it now reads a `config.toml` sidecar
> file that overrides your command-line arguments. A config written for v1
> crashes on v2's startup. This release adds tools to detect and fix that.
> **BetterClaudeConfig itself has no breaking changes** — your existing configs
> keep working; nothing is changed without your click.
### Added
- **ssh-mcp v2 flag migration.** Detects the credential flags v2 removed and
one-click-moves each into the environment variable ssh-mcp now reads
(`--password` → `SSH_MCP_PASSWORD`; `--sudoPassword` / `--suPassword` →
`SSH_MCP_SUDO_PASSWORD`). Also flags `--maxChars=none`, whose meaning changed
between versions.
- **Sidecar-config awareness.** When a server reads a separate config file
(ssh-mcp's `config.toml`), BCC shows where that file actually lives on your
platform and warns when your command-line args are **inert** because the file
takes precedence — including when a file sits at the wrong, documented-but-
unused path.
- **In-app sidecar editor.** Edit that external config from inside BCC —
pick-lists for known fields, a raw-text fallback — written atomically with a
timestamped backup and locked to `0600`. No dropping to a terminal.
- **Live hot-reload.** External changes to a sidecar (or to your Claude config)
now surface without restarting BCC.
- **Version pinning for `npx` servers.** Spots servers launched with `-y` /
`@latest` that resolve a fresh version every run, shows the version currently
resolved, and offers a one-click **Pin to this version** — with a drift note
when a pin has fallen behind.
- **Permission pre-flight.** Warns when a credential-bearing config is readable
by other users on the machine and offers a one-click fix to `0600`/`0700`.
- **Light theme + system-following** (the dark theme is preserved exactly).
- **"Move to environment variable."** Convert a plaintext secret in a config
into a `${VAR}` reference in place — offered only on clients that actually
expand references, so it can't silently break a Claude Desktop config.
- **Cross-client foundation.** Claude Desktop and Claude Code now flow through a
single adapter — groundwork for supporting more clients.
### Changed
- The update checker is now **visible** — a persistent banner plus a Help-menu
item — instead of being buried in the About dialog.
- Config writes share one atomic-write path; the temp file is created `0600`, so
a secret is never briefly world-readable mid-write.
### Fixed
- Loading a config with a non-object server value no longer crashes, and named
server sets survive an external-change merge.
- Project profiles that share a directory basename are disambiguated, so you
can't accidentally edit the wrong `.mcp.json`.
### Internal / maintainer
- Signed-catalog core and a maintainer-only **Catalog Console** (review + sign),
with hardening of the review gate and a split of the signing keys. No
user-facing catalog browser ships yet.
## [1.3.0] — 2026-07-12
Named server sets, Claude Code project `.mcp.json` discovery, structural schema
lint, and UX polish (Ctrl+S to save, enable-all / disable-all).
## [1.2.1] — 2026-07-12
First shipped binaries: app-icon fix, a batch of audit fixes, and Windows
process-tree cleanup on spawn-tests.
## [1.2.0] — 2026-07-08
Server log viewer, duplicate-name conflict handling, a Restart-Claude button,
stale-file protection, an About dialog, and a notify-only update checker.
## [1.1.0] — 2026-07-04
Backup / restore UI and secret masking.
## [1.0.1] — 2026-06-29
## [1.0.0] — 2026-06-29
Initial releases: the core `mcpServers` editor with the lenient paste/repair
pipeline that tolerates malformed JSON.
<!-- Backfill for 1.0.0–1.3.0 is summarised from release notes; the Unreleased
section onward is maintained per-PR. -->
+1 -1
View File
@@ -77,7 +77,7 @@ KNOWN_FIELDS = {"command", "args", "env", "url", "type", "headers"}
# binary. All network I/O here is fail-quiet (returns None on any problem) # binary. All network I/O here is fail-quiet (returns None on any problem)
# so it's safe to run unattended, off the UI thread, at startup. # so it's safe to run unattended, off the UI thread, at startup.
# --------------------------------------------------------------------------- # # --------------------------------------------------------------------------- #
__version__ = "1.3.0" __version__ = "1.4.0"
REPO_URL = "https://git.avezzano.io/the_og/better-claude-config" REPO_URL = "https://git.avezzano.io/the_og/better-claude-config"
ISSUES_URL = f"{REPO_URL}/issues" ISSUES_URL = f"{REPO_URL}/issues"
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "better-claude-config" name = "better-claude-config"
version = "1.3.0" version = "1.4.0"
description = "Cross-platform GUI for editing the mcpServers block of Claude Desktop and Claude Code configs" description = "Cross-platform GUI for editing the mcpServers block of Claude Desktop and Claude Code configs"
readme = "README.md" readme = "README.md"
license = { file = "LICENSE" } license = { file = "LICENSE" }