Skip to content

Releases: luongnv89/mcc

mcc v0.5.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 13:06

mcc usage --all looks every account's usage up live for one run, the default profile included, without a config change and with a risk notice each time, and saves what it finds to the mcc statusline cache, so plain mcc usage, mcc list and mcc run show those numbers afterwards with their age.

Added

  • mcc usage --all looks every account's usage up live for one run, the default profile included, with each profile's own login instead of the mcc statusline cache, without turning on [usage] live = true or changing the config. Because it reads and sends each profile's OAuth access token to Anthropic's undocumented usage endpoint, it prints a risk notice on stderr every time it runs (with -q too; --json on stdout is unaffected), and mcc usage --help shows that notice in full. What it finds is saved to ~/.mcc/state/<profile>/usage.json, the same cache mcc statusline writes, so a later mcc usage without --all (and mcc list and mcc run) shows those numbers with their age until a window resets or newer numbers are cached; an account it can't read keeps what was cached. --all can't be combined with a profile name (exit 2), and MCC_NO_USAGE=1 still turns usage off. Without --all, mcc usage behaves as before. (#94)

Full Changelog: v0.4.0...v0.5.0

Install

The install script downloads the prebuilt binary for your platform, checks its SHA-256 checksum and installs it into ~/.local/bin, so you don't need Rust:

curl -fsSL https://raw.githubusercontent.com/luongnv89/mcc/main/install.sh | sh

Or with Homebrew, which builds mcc from source with its own Rust:

brew install luongnv89/tap/mcc

This release carries mcc-<target>.tar.gz archives for macOS and Linux on x86_64 and arm64 (x86_64-apple-darwin, aarch64-apple-darwin, x86_64-unknown-linux-musl, aarch64-unknown-linux-musl; the Linux builds are static), each with a .sha256 file, plus SHA256SUMS. To build from source, see the README.

mcc v0.4.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 06:44

Each project can now have its own profile, which mcc run starts (at a usage limit it asks first, with waiting as the default), and usage now comes by default from the rate limits the opt-in mcc statusline caches instead of from each profile's login. mcc sync is three-way and keeps a profile's own edits, and profiles can share the default's plugins, link its skills and other read-mostly items, keep their own settings in an overlay and share sessions within a named group. mcc doctor checks every profile's setup, mcc config reads and changes mcc's settings without hand-editing TOML, and mcc env and mcc exec point other tools at a profile. mcc list hides account emails by default, and releases now ship prebuilt binaries for macOS and Linux, which the install script uses.

Added

  • mcc add --email ADDRESS and mcc add --sso pass --email and --sso to claude auth login (each its own argument, no shell), for the new profile and for the default profile. --email must look like one address and mcc does not print it (after the login, the signed-in account's email is shown like any profile's); both are refused with --no-login. After the login, mcc add warns, without stopping, when the profile is signed in with an Anthropic Console account (API usage billing; claude auth status reports apiKeySource: "/login managed key"): Claude Code stores a Console sign-in outside the profile's directory, so profiles don't keep it separate. The hint names ALIAS auth login --claudeai to switch to a Claude subscription. (#58)
  • A status view for bare mcc. Once mcc is set up, mcc with no command (or with only global flags such as -q or --no-color) prints Here: (the profile mcc run starts in the current directory, in its color with its label, and why: a project default, or none), then mcc list's table of every profile with its account, cached 5-hour and weekly usage, last use and sync state. On stderr follow warnings for drift against the default (profiles a sync would change; local edits and never-synced fresh profiles don't count), out-of-date launchers, missing directories and a project default naming no profile, and a pointer to mcc doctor when there is any. It is read-only and fast: no lock, no first-run setup, no log line, nothing written; usage comes from the mcc statusline cache only, never looked up live, even with [usage] live = true (so it never shows or records the live-lookup note), and skill counts and sizes on disk are left to mcc list. Emails stay hidden unless [privacy] show_email is set, colors follow --no-color, NO_COLOR and whether stdout is a terminal, and piped it prints the same text without colors. Before setup, bare mcc still prints the help on stderr and exits 2 without setting anything up, and global flags alone are still a usage error; mcc help and mcc --help are unchanged. (#54)
  • An opt-in launch banner. With [launch] banner = true (mcc config set launch.banner true; off by default), starting a profile from its launcher or with mcc run prints one line on stderr: the profile's name in its color, its label and its cached 5-hour and weekly usage, e.g. ▶ work · Acme · 5h 42% · week 18%. It is printed only when stderr is a terminal, never on stdout (so <alias> -p "…" | jq is unaffected), and not with mcc run --quiet. It reads only config.toml and the mcc statusline cache: no network, token or Keychain access at launch, even with [usage] live = true. Launchers include the banner call (the hidden mcc launch-banner <alias>, run only when stderr is a terminal, with mcc's errors discarded) only while the banner is on: with it off, as by default, launchers are byte-for-byte what they were, nothing extra runs at launch, and no launcher is reported out of date. After turning it on, run mcc refresh-launchers (mcc config set launch.banner says so) to add the call to existing launchers; profiles added later get it straight away, and running mcc refresh-launchers after turning it off takes it out again. While it is on, mcc doctor warns about a launcher without the call, and mcc list ("launcher_current": false in --json) counts it as out of date. (#59)
  • A color per profile, next to its label. mcc add --color COLOR and mcc config set profiles.ALIAS.color COLOR ("" removes it) set color under [profiles.ALIAS] to one of black, red, green, yellow, blue, magenta, cyan or white; anything else is refused, by mcc config edit too. mcc list shows the profile's name in its color (the NAME column, the project table and --long, which adds a Color row), and --json / --json-v2 add color per profile. mcc run names the profile it starts in its color, followed by its label, e.g. starting `work` (Acme (work)). mcc statusline --prefix adds the label, [work · Acme (work)], and colors the segment. Colors follow --no-color and NO_COLOR, and are left out when the output isn't a terminal, except in the status line, which Claude Code renders. A label containing an email is left out of mcc run and the status line while emails are hidden. A label with control characters, hand-written in config.toml, is never printed by mcc run, mcc list or the status line. mcc config set profiles.ALIAS.label already changes an existing profile's label. (#55)
  • Prebuilt release binaries. Pushing a vX.Y.Z tag runs a release workflow that builds mcc for macOS and Linux on x86_64 and arm64 (x86_64-apple-darwin, aarch64-apple-darwin, and static x86_64-unknown-linux-musl, aarch64-unknown-linux-musl), checks that the tag matches Cargo.toml, runs the tests on each native target, and attaches mcc-<target>.tar.gz, a .sha256 per archive and SHA256SUMS to the release. It creates the release as a draft, attaches the archives and checksums, then publishes it, so the latest release never lacks binaries; a draft that already exists for the tag is reused, with its title and notes. Re-running it for a published tag never replaces that release's assets: Rust builds are not reproducible, so when the new SHA256SUMS differs from the published one it stops with an error. Release builds use a pinned Rust toolchain. Its actions are pinned to commit SHAs and only the upload job can write. The install one-liner now downloads the binary for your platform from the latest release (or MCC_VERSION), verifies its SHA-256 checksum (a mismatch, or a missing checksum, stops with nothing installed) and installs it into ~/.local/bin (MCC_INSTALL_DIR), so it no longer needs Rust; it builds with cargo as before from a clone, with MCC_FROM_SOURCE=1, or when a release has no binary for the platform (a source build with MCC_VERSION builds that tag). Earlier versions of the script installed into ~/.cargo/bin; if an old mcc there comes first on your PATH, the script now says so (remove it with cargo uninstall mcc). The Homebrew formula still builds from source; its header describes switching the tap to the binaries. (#53, #89)
  • mcc doctor [PROFILE] checks every profile's setup, the default included, and prints a fix for each problem: mcc set up and claude found; ~/.local/bin on PATH; no rc file setting CLAUDE_CONFIG_DIR for every shell (export, a bare assignment or fish's set -gx, outside comments, aliases and mcc's own blocks), which makes plain claude stop starting the default profile; and per profile its directory (present, mode 0700), launcher (present, written by mcc, executable, starting the profile's directory, with the plugins root exactly when it shares plugins, current), alias block, claude auth status run through the launcher (configDirectory matching the registry on Claude Code 2.1.268+, skipped before; logged in), session-sharing link and store, leftovers of an interrupted mcc share, drift against the default and, when installed, the mcc statusline shim. Token expiry is checked only with [usage] live = true and MCC_NO_USAGE unset. Fixes are mcc commands where one exists (mcc refresh-launchers ALIAS, mcc share ALIAS, mcc sync ALIAS, mcc exec ALIAS -- claude auth login, …), else the line to remove or the block to paste. Findings are ok, warn, problem or skipped; mcc exits 1 when there is a problem. --json prints a bare array of {profile, check, status, message, fix} and --json-v2 wraps it as {"schema": 2, "checks": [...]}. Doctor never writes ~/.mcc/config.toml, not even the first-run setup, and takes no lock. doctor is reserved as an alias. (#44)
  • Shared plugins. mcc link ALIAS plugins makes a profile use the default profile's plugins instead of its own copy (about 88 MB per profile on one real setup): its launcher, mcc run, mcc exec and mcc env set CLAUDE_CODE_PLUGIN_CACHE_DIR to ~/.claude/plugins. That variable replaces Claude Code's whole plugins root, so installed plugins, marketplaces, the plugin cache and plugin data are shared; enabledPlugins stays per profile in settings.json (and its overlay). Installing, updating or uninstalling a plugin in a sharing profile does it for the default and every sharing profile, and a profile started without the variable (e.g. CLAUDE_CONFIG_DIR=… claude) has no plugins; the README documents both. sync and diff leave a sharing profile's plugins alone, and mcc list counts the default's installed plugins for it. Turning it on moves the profile's own plugins/ to .mcc-backup/<timestamp>/ (nothing is deleted; remove the backup to free the space) and rewrites the launcher; a failed step undoes both. --off copies the default's plugins back in. `mcc link AL...
Read more

mcc v0.3.0

Choose a tag to compare

@luongnv89 luongnv89 released this 13 Oct 13:41

Profiles can now opt in to session sharing with mcc share ALIAS or ALIAS --mcc-share, so --resume lists the sessions of every sharing profile, and mcc refresh-launchers updates launchers and shell aliases made by an older mcc.

Added

  • Opt-in session sharing between profiles, off by default. mcc share ALIAS (or starting a profile with ALIAS --mcc-share) links the profile's projects/ to ~/.mcc/shared/projects, so --resume lists the sessions of every sharing profile. mcc share ALIAS --off gives the profile its own copy again. The setting is share_sessions under [profiles.ALIAS] in ~/.mcc/config.toml. Only sessions are shared: never credentials, the account, history or live session state. Every time sharing is turned on, mcc prints a note about Anthropic's Consumer Terms and Usage Policy. mcc list marks sharing profiles, and --json has share_sessions and launcher_current. (#25, #26)
  • mcc refresh-launchers [ALIAS...] rewrites launchers and shell aliases from the current templates. (#25, #26)

Changed

  • New launchers handle --mcc-share, and new shell aliases run the launcher instead of calling claude directly. CLAUDE_CONFIG_DIR is unchanged, so logins are kept. Upgrade note: existing launchers and aliases are not modified; run mcc refresh-launchers once to use ALIAS --mcc-share with profiles created before this release. (#25, #26)
  • mcc list prints a hint to run mcc refresh-launchers while a launcher predates session sharing. (#25, #26)
  • share and refresh-launchers are reserved and can't be used as aliases. (#25, #26)

Full Changelog: v0.2.0...v0.3.0

Install

brew install luongnv89/tap/mcc

Or from source: see the README.

mcc v0.2.0

Choose a tag to compare

@luongnv89 luongnv89 released this 13 Oct 08:54

mcc usage is now a compact table that hides account emails by default, and mcc rename renames a profile and its command while keeping its login.

Heads-up for scripts: mcc usage --json now returns "account": null unless account emails are shown. To keep reading account, add --show-email, or set show_email = true under [usage] in ~/.mcc/config.toml.

Added

  • mcc rename ALIAS NEW (alias mv): renames a profile and its command. It installs the new launcher and alias block, renames the registry entry, then removes the old launcher and alias. The new name is checked like an alias in mcc add, and a failure rolls the changes back. The profile directory, and so its login, is kept. (#24, #23)
  • [usage] show_email in ~/.mcc/config.toml, plus --show-email / --hide-email on mcc usage, to choose whether account emails are shown. (#24, #23)

Changed

  • mcc usage shows a compact table, one row per profile, instead of a block per profile: PROFILE, then the bar and percent used, time until reset and reset time for the 5-hour and weekly windows. On narrow terminals the reset time goes first, then bars shrink 10 → 5 → 0. (#24, #23)
  • mcc usage hides account emails by default, in the table and in --json (account is null). Use --show-email or [usage] show_email = true to show them. (#24, #23)
  • mcc add <old name> names the renamed profile that still uses that name's directory, instead of only saying that the directory exists. (#24, #23)

Fixed

  • mcc delete <old name> refuses to delete a directory that a renamed profile still uses. (#24, #23)

Full Changelog: v0.1.0...v0.2.0

Install

brew install luongnv89/tap/mcc

Or from source: see the README.

mcc v0.1.0

Choose a tag to compare

@luongnv89 luongnv89 released this 10 Oct 07:43

The first version of mcc.

Added

  • Homebrew formula for macOS and Linux: brew install luongnv89/tap/mcc builds mcc from source and installs bash, zsh and fish completions. brew upgrade mcc and brew uninstall mcc work as usual. The formula lives in packaging/homebrew/mcc.rb. (#14)
  • mcc usage [PROFILE] [--json]: every profile's 5-hour and weekly usage in detail, with a bar, percent used and left, time until reset, and the reset time in local time. default or claude selects ~/.claude; an unknown name exits 2. (#16, #20)
  • Usage meters in mcc list: a coloured bar (green, yellow at 80%+, red at 95%+) and colour-independent ! / !! markers, sized to the terminal width. (#17, #20)
  • 5-hour and weekly usage in mcc list: new 5H and WEEK columns, lines in --long cards, and a usage object in --json, for every profile including the default. Each profile's own login is used; failures show unavailable with a reason and never change the exit status. (#13, #15)
  • --no-usage and MCC_NO_USAGE to skip the usage fetch, and the MCC_USAGE_URL / MCC_SECURITY_BIN test overrides. (#15)
  • mcc completions for bash, zsh, fish, elvish and PowerShell, plus install.sh. (#12)
  • mcc list (table, --long cards, --json), mcc sync (plan, backup, apply; --dry-run, --prune, --only, --all) and mcc delete (type-to-confirm or --yes, logout, removes only what mcc created). (#12)
  • mcc init (OS, terminal, shell, rc file and claude detection, run automatically on first use) and mcc add (alias validation, clone with path rewriting, launcher, managed rc block, login, rollback on failure). (#12)
  • Apache-2.0 license, contributing guide, code of conduct, security policy, and issue and pull request templates. (#18, #19)

Fixed

  • mcc usage keeps the full 20-cell bar at 80 columns: it drops the absolute reset time before shrinking the bar, and shrinks in the same 20/10/0 steps as mcc list --long. (#21)
  • Relative symlinks (such as skills/x -> ../../.agents/skills/x) are re-resolved from their source location, so cloned profiles don't get broken links. (#12)

Security

  • Access tokens are kept in memory only, sent only to the usage endpoint for their own profile, and never printed, logged or written to disk. Expired tokens are never sent. (#15)
  • GitHub private vulnerability reporting is enabled, and contact@luongnv.com is listed as the security contact. (#21)

Install

brew install luongnv89/tap/mcc

Or from source: see the README.