claude-jacked - multi-account manager and skills suite for Claude Code
When you hit a Claude Code usage limit, jacked shows which account has headroom and helps you move deliberately instead of guessing which credentials a session is using. Run every Claude and Codex account you own as one fleet, watch each account's 5-hour, 7-day, and per-model usage live, and get an auto-swap recommendation before a limit stops you. The whole fleet stays one click away in a macOS menu-bar app, or a system-tray app on Windows and Linux.
It is also a skills manager for Claude Code: one jacked install deploys 20 curated slash commands, 28 skills, and 10 review agents into ~/.claude, mirrors them into Codex when Codex is installed, and keeps them updated from a web dashboard.
What you get: multi-account Claude Code, live usage tracking, and a skills suite
- Run multiple Claude accounts without losing account truth. Add every account you own, watch each account's 5-hour, 7-day, and per-model usage live, and let auto-swap recommend a fresh account before you hit a limit. Credential changes report what was actually verified, and session cards distinguish where a session started, what configuration was later observed, and whether the provider runtime is still unverified. Works for Codex accounts too, side by side with Claude.
- A menu-bar app that actually earns its pixels. A live pill shows usage for the account jacked can currently resolve next to the clock (
18%·4%, tinted green/yellow/red). Left-click drops the whole fleet down in a compact panel: every account, every org, per-model caps, reset times, and the current credential state. Right-click for actions, or pin the panel to your screen edge. It refreshes within about a second of any account switch or usage change, and it tells you when a new jacked version ships: a badge on the icon, a notification banner, and a one-click update. - A curated skills suite, one command to install.
jacked installputs 20 battle-tested slash commands, 28 skills, and 10 review agents into Claude Code (/dcrrecursive multi-lens review,/qa//uxbrowser testing,/release,/whats-nextroadmap advisor,/lockdownsupply-chain audit, and more; skills are slash-invocable too, so all 48 answer to a/name), plus design-engineering skills for UI animation and polish adapted with credit from Emil Kowalski's skills and a website-cloning skill adapted with credit from JCodesMore's ai-website-cloner-template. When Codex is installed too, the same pass deploys the suite into Codex's native formats: skills into~/.agents/skills, commands as both prompts and command-derived skills, the behavioral rules (Codex-adapted) into~/.codex/AGENTS.md, the 10 review agents as Codex TOML custom agents, the chrome-devtools MCP server, and a$qasuggestion hook, with a few Claude-only helpers held back and everything tracked in a Codex manifest sojacked uninstallreverses it. Upgrades diff cleanly: added/changed/removed, never touching your own files. On top of the bundled suite,jacked installalso installs curated third-party skill packs live from their upstream repos (a 28-skillmarketingpack and adesign-extraspack, on by default), opt out with--no-packsorjacked packs disable. - Manage everything from a web dashboard. Accounts, usage analytics, feature toggles, appearance themes, swap history, logs, all from your browser. No config files, no terminal commands.
- Permission hygiene built in.
jacked permissions auditfinds (and can prune) dangerously broad Bash wildcards in your Claude Code permission allowlists, and the dashboard's Permissions panel manages allow rules with project vs global scope.
Quick start: install jacked and add your Claude accounts
Option 1: Let Claude Install It
Paste this into Claude Code and it handles everything:
Install claude-jacked for me:
1. First check if uv and jacked are already installed (if uv is missing: curl -LsSf https://astral.sh/uv/install.sh | sh)
2. Install: uv tool install claude-jacked && jacked install --force
3. Verify with: jacked --help
4. Confirm the service URL with: jacked service status
5. Open the reported dashboard URL in my browser
6. Walk me through adding my Claude accounts from the Accounts page
Option 2: Manual Install
Run once from anywhere. This installs the shared skills, hooks, dashboard, and tray integration under ~/.claude/:
uv tool install claude-jacked # tray icon + background service included by default
jacked install --force # deploys skills/commands/agents/hooks AND starts the tray
jacked service status # prints the running dashboard URL
Open the URL printed by jacked service status, or choose Open Dashboard from the tray. Use jacked webux only when you want a foreground dashboard instead of the background service; both cannot own the same port at once.
The tray is on by default. A bare
uv tool install claude-jackednow ships the tray (no[tray]extra needed), andjacked installregisters login-autostart and starts it. Don't want the icon (or on a headless box)?jacked install --force --no-tray. You MUST runjacked install-uv tool/pip installonly drop the package on disk; runningjackedbefore that prints a loud banner reminding you.
Don't have uv? Install it first:
curl -LsSf https://astral.sh/uv/install.sh | sh(Mac/Linux) orpowershell -c "irm https://astral.sh/uv/install.ps1 | iex"(Windows)
Option 3: Install as a Plugin (Teams)
Add to your team's Claude Code environment - no Python install needed:
/plugin marketplace add jackneil/claude-jacked
/plugin install jacked@jacked-marketplace
Everything is namespaced under jacked:, so a command is /jacked:pr and a skill is /jacked:dcr. Includes all 20 commands, 28 skills, and 10 agents. Does not include the Python-powered features (dashboard, account management, tray) - use Option 1 or 2 for those.
The background service + system tray icon ship by DEFAULT (auto-start on login) -
jacked installalready started them. Opt out of the icon:jacked install --force --no-tray. The legacy[search]/[security]/[tray]/[all]extras still resolve as empty aliases, so old install commands don't error - the features they gated were retired in 0.70.0 (Qdrant session search) or folded into core (tray).
Your dashboard: accounts, usage analytics, and feature toggles
The web dashboard ships with every install. Open it from the tray, or run jacked service status and browse to the reported URL. To run the dashboard in the foreground without the tray service, stop that service first and use jacked webux.
Toggle Features On and Off
Enable or disable any of the 10 built-in code reviewers, 20 slash commands, and 28 skills with one click. Each card shows what it does so you know what you're turning on.
Track Everything
Token usage and estimated cost per session, agent activity, hook health, and command frequency, all at a glance. The Activity view below shows which review agents ran and whether every hook is executing cleanly.
More Dashboard Views
Feature Toggles - Toggle hooks (sound notifications), knowledge documents (behavioral rules, skills, reference docs), skill packs, and the Memory Vault on and off.
Commands - Enable or disable any of the 20 slash commands.
Appearance - Pick the usage-bar color scheme: America 250 (red, white & blue for the 2026 semiquincentennial, the default) or Classic green/amber/red. Applies instantly to the dashboard and the menu-bar panel.
Permissions Panel - Manage allowed commands with project-level vs global scope.
Analytics Dashboard - Token usage overview, trends, and per-session drill-down, plus agent/hook activity.
Table of Contents
- What's Included
- Web Dashboard
- Background Service and Tray Icon
- Upgrading
- Built-in Reviewers and Commands
- Sound Notifications
- FAQ
- Uninstall / Troubleshooting
- Version History
- Advanced / Technical Reference
What's Included
Base (uv tool install claude-jacked)
| Feature | What It Does |
|---|---|
| 10 Code Reviewers | Automatic checks for bugs, security issues, complexity, missing tests |
| 20 Slash Commands | /dc, /pr, /learn, /remember, /blindspot, /redo, /retry, /techdebt, /audit-rules, /cleanup, /swarm, /goal-maker, /bhag, /jacked-setup, /cso, /retro, /canary, /benchmark, /land-and-deploy, /browser-reset |
| 28 Skills | Knowledge packs and engines Claude picks up automatically, every one also typeable as /name. Ten used to ship as commands and keep their familiar slash workflow: /dcr, /qa, /ux, /qa-video, /demo-video, /docs-sync, /swarm-research, /release, /whats-next, /lockdown. The rest stand alone: night-shift, jack-it-up, coverage-matrix, recursive-10-10-product-hardening, aesthetic-dogfood-audit, chain-of-command, deploy-to-railway, launch-post, logo-forge, clone-website, claude-md-optimizer, memory-librarian, checkpoint, recover, and the design-engineering set (emil-design-eng, review-animations, animation-vocabulary, apple-design) |
| Skill Packs (optional, on by default) | Curated third-party skill collections pulled live from their upstream repos via the npx skills CLI, separate from the bundled suite: marketing (28 skills) + design-extras. Opt out with --no-packs or jacked packs disable |
| Memory Vault (optional, opt in) | Cross-repo memory in a git-backed Markdown vault at ~/jacked-vault. Event-triggered capture (session end plus merges to main), a budgeted SessionStart recall brief, and a jacked memory CLI. No database, no embeddings, Obsidian-compatible. Enable from the dashboard or jacked memory init |
| Statusline (on by default) | One live status line inside every Claude Code session: model + effort, context use, 5h/7d rate limits with reset times, and evidence-qualified account state. Works on macOS, Linux, and Windows. Never replaces a statusline you set up yourself |
| Behavioral Rules | Smart defaults that make Claude follow better workflows |
| Sound Notifications | Audio alerts when Claude needs input or finishes (via --sounds) |
| Web Dashboard | 5-page local dashboard - manage everything from your browser |
| Account Management | Track Claude accounts, usage limits, subscription status |
| Feature Toggles | Enable/disable any reviewer, command, or hook from the dashboard |
| Analytics | Token usage overview + trends, per-session drill-down, agent/hook activity |
| Permissions Management | Permission-rule audit (jacked permissions audit), project-level vs global scopes |
Web Dashboard
jacked webux # Foreground dashboard at localhost:8321
jacked webux --port 9000 # Custom port
jacked webux --no-browser # Start server without opening browser
The dashboard is a local web app that runs on your machine. All data stays in ~/.claude/jacked.db - nothing is sent anywhere.
5 pages: Accounts, Installations, Settings (tabbed: Agents / Commands / Features / Plugins / Claude Code / Appearance / Advanced), Logs, Analytics.
Remote Access (Tailscale)
By default the dashboard binds 127.0.0.1 and is reachable only from the machine it runs on. To reach it from other machines, flip it on in the GUI: Settings > Advanced > Remote access.
- Tailscale only (recommended): binds loopback plus this machine's Tailscale address (100.x). Reachable from your tailnet, invisible to whatever LAN or coffee-shop Wi-Fi the machine is on. If Tailscale isn't running at startup, jacked falls back to loopback only and says so in the card's status line; it re-detects on every restart.
- All interfaces: binds
0.0.0.0. Anyone on any network the machine joins can reach the dashboard. You'll be asked to confirm you understand before this applies.
Applying a change restarts the dashboard in place (a few seconds; the page reconnects itself). The setting lives in ~/.claude/jacked.db and is the single source of truth: it survives reboots, upgrades, and service restarts. The card's status line always shows the addresses the server is actually listening on, so what you see is what is live.
Once enabled, browse to http://<machine>:8321 using the MagicDNS short name, the full <machine>.<tailnet>.ts.net name, or the Tailscale IP.
Account authorization works from a remote browser. When you open the dashboard from a different machine, the Add Account, Re-auth, and CC-token flows show an authorization link instead of opening a browser on the server. Click the link and approve in your own browser. Claude then shows a code. Copy the code and paste it into the dashboard to finish.
Prefer the CLI? These write the same setting (no more baked hosts in autostart files):
jacked service restart --host 0.0.0.0 # sets Remote access: all interfaces, then restarts
jacked service restart --host <100.x IP> # sets Remote access: Tailscale only, then restarts
jacked service restart --host 127.0.0.1 # turns Remote access off, then restarts
A one-shot override for a foreground dashboard only (never persisted): jacked webux --host <addr>.
The dashboard has no authentication layer, so restrict who can reach it at the network layer. A Tailscale ACL scoped to the port does exactly that:
{ "action": "accept", "src": ["your-laptop", "your-phone"], "dst": ["your-server:8321"] }
A network bind is hardened server-side: CORS is never wildcarded (the frontend is same-origin by construction), WebSocket handshakes enforce same-origin, cross-site state-changing requests are rejected by Origin check, and untrusted Host headers are refused (DNS-rebinding guard). Two escape hatches exist for unusual manual or foreground setups, both comma-separated environment variables set directly on that process. Native managed definitions intentionally do not inherit arbitrary shell variables:
JACKED_ALLOWED_ORIGINS: extra exact origins (scheme://host[:port]) allowed cross-origin API/WebSocket access. Needed behind a reverse proxy that rewritesHostto the loopback upstream (symptom: page loads but every write and the live WebSocket fail with 403;tailscale servepreservesHostand needs nothing).JACKED_ALLOWED_HOSTS: extra hostnames accepted in theHostheader, e.g. a custom DNS name pointing at the machine.
Prefer not to rebind at all? tailscale serve --bg 8321 proxies the loopback-bound dashboard to your tailnet over HTTPS with no jacked configuration changes.
Account switching, auto-swap, and session truth
Use Account requests a change to the default Claude credential stores. The result is evidence-qualified: the dashboard says whether the target was committed, merely observed without a complete writer fence, needs interaction, or is unsupported. It never turns a database selection into a false claim that running sessions changed. Credential mutation is local-only, so a remotely opened dashboard can manage and inspect accounts but cannot switch credentials.
Current support is deliberately conservative. The exact Claude Code 2.1.259 macOS arm64 build can report observed_target_unfenced: the requested credentials were read back, but another writer cannot be ruled out, so existing sessions remain unverified and a restart is recommended. An unknown executable, build, platform, architecture, or configuration mode fails closed instead of guessing how that Claude Code version stores credentials.
For a specific account, launch Claude Code through jacked:
jacked claude 2 # account ID
jacked claude jack@example.com # full email
jacked claude udifi --resume # unique email substring + Claude arguments
The launcher prepares a per-account CLAUDE_CONFIG_DIR and passes every remaining argument through to Claude Code. That records the intended scoped target, but it does not claim the provider runtime used that identity until an exact-build capability can prove it. Session cards therefore show Started as, Observed configuration, Pending next activity, and Runtime unverified separately. A default-credential change marks known global sessions pending; the next hook activity refreshes configuration evidence, not proof of which identity served the provider request.
Auto-swap still evaluates account headroom and records a recommendation. It performs the credential mutation only when a certified cooperative transaction engine and writer fence are installed for the exact runtime. Without that capability, it stays recommendation-only.
Background Service and Tray Icon
Here's the deal: if you don't want to remember to run jacked webux every time, run it as a background service instead. On macOS you get a live usage pill in the menu bar with the whole fleet one click away; on Windows and Linux you get a "J" in the system tray that stays out of your way until you need it.
Install
uv tool install claude-jacked --force # pystray + Pillow ship in the base package
jacked install --force # wires up hooks AND starts the tray (autostart on login)
jacked install already registers login-autostart and starts the tray - no separate jacked service install/start needed. pystray and Pillow are core dependencies now, so the icon "just works" out of the base package. Don't want it? jacked install --force --no-tray.
What You Get (macOS menu bar)
- A live usage pill, always visible. The menu-bar item is a colored "J" plus the resolved account's usage as
5h%·7d%(e.g.18%·4%). The J tints green, yellow, or red on the worse of the two windows, so a glance at the clock tells you whether you're about to hit a limit. A small dot marks the corner when the resolved account is a Codex account. - Left-click: the fleet dropdown. A compact panel (the screenshot up top) drops down with every account you've added: 5h and 7d bars with reset times, per-model caps (your Fable or Codex model usage inline), plan badges, multi-org accounts grouped under one login, an
activebadge with a live countdown to the next usage refresh, and a refresh-all button. It's pre-warmed, so it opens instantly. - Pin it as a side panel. "Toggle Side Panel" docks the same panel to the right edge of your screen, floating above other windows and on every Space, for a permanent fleet view while you work.
- Right-click: the actions menu. Open Usage Dropdown, Toggle Side Panel, Open Dashboard, Add Account, an Auto-swap toggle, Start on Login, Restart, Quit, the version line, "Last checked", and Check for updates... to force a fresh PyPI poll on demand.
- It never goes stale. The pill and panel update within about one second of any usage refresh, credential-state change, or Codex swap (an in-process change counter, no polling lag), with a 30-second heartbeat backstop and a 10-minute background refresh across the whole fleet.
- Update notifications you'll actually see. When a new version ships: a blue badge appears on the J icon, a macOS notification banner fires, and the version line in the menu flips to a clickable
v{current} -> v{latest} (update). One click runs the full upgrade (uv tool install --force+jacked install --force+ service restart) in a detached helper that survives its own binary being replaced, with a live progress page in your browser that reconnects on its own while the service restarts.
On Windows and Linux
- System tray icon ("J", colored by service state) with the same right-click menu essentials: Open Dashboard, Restart, Stop, Start on Login, version line, and Check for updates.
- The full update flow: the icon badge, native tray notifications, the clickable one-click update, and the browser progress page all work the same as on macOS. The usage pill, dropdown panel, and side panel are macOS-only today.
Service behavior
- Exact, per-user auto-start -
jacked service installgenerates an owned launchd definition on macOS, a systemd user unit on Linux, or a Task Scheduler definition on Windows from the current package version and interpreter. - One managed background API owner per OS user - a lifetime lease makes competing managed starters lose cleanly. Installation can hand off a verified manual v2 instance before activating the native supervisor, so an upgrade does not create two owners.
- Authenticated lifecycle control - status, stop, and restart discover the running instance through a private manifest, lifetime lease, and per-user control channel, not by trusting whichever process occupies a port. They refuse PID-only process control when ownership cannot be proved.
- Safe port collisions - the owned service uses port 8321 when available. If that port belongs to an ambiguous or foreign process, jacked starts on a dynamic quarantine port for the configured bind and
jacked service statusreports the actual dashboard URL. - Secret-negative startup - native service definitions start isolated Python with a small reviewed environment. Tokens and unrelated shell environment variables are not inherited into the long-lived service.
- Crash recovery, not nag-ware - each native supervisor restarts failed runs but respects a clean user stop. On launchd this is
KeepAlivescoped toSuccessfulExit=false; systemd and Task Scheduler carry matching failure-only restart policies. - Non-destructive recovery -
jacked service recoverreconciles drift only when the native definition is provably jacked-owned. It refuses legacy or foreign same-name artifacts, prints the exact path that needs operator review, and never adopts, deletes, or signals them automatically. - CLI equivalent -
jacked upgradedoes the same three-step upgrade from the terminal. No more remembering to runuv tool install, thenjacked install, then restart the service separately. - Recovery file - if the auto-update fails,
~/.claude/jacked-update-failed.txtexplains what happened and how to recover manually. The tray warns you on the next startup so you don't miss it.
Commands
jacked service install # configure auto-start (launchd / systemd user / Task Scheduler)
jacked service start # start the service with tray icon (foreground - blocks)
jacked service stop # stop the running service
jacked service restart # stop + detached start (returns immediately)
jacked service restart --foreground # same but runs in foreground like service start
jacked service status # show evidence-qualified state, build, protocol, port, autostart
jacked service recover # safely reconcile a provably owned native definition
Troubleshooting
If the tray icon disappears, will not come back, or port 8321 is already occupied, start with evidence instead of a PID file:
jacked service status # reports running, quarantined, stopped, or indeterminate
jacked service restart # uses the authenticated control channel when ownership is proven
jacked service recover # reconcile owned drift without PID- or port-based control
If status says quarantined, use the dashboard URL it prints. Another process owns 8321, and jacked deliberately leaves that process alone. If status says ownership indeterminate, run jacked service recover. Recovery refuses a legacy or foreign supervisor artifact and prints its exact path; stop that service from its own tray menu, inspect and move the artifact to a backup path, then retry recovery. Do not kill a PID copied from the legacy diagnostic file at ~/.claude/jacked-service.pid.
Common issues:
- Tray icon never appears after install - the tray ships by default now, so the usual causes are: (a) you passed
jacked install --no-tray, (b) you're on a headless box (noDISPLAY/Wayland) where the icon is skipped on purpose, or (c) the service is not running. Runjacked service status; use the reported dashboard URL if the service is quarantined, or runjacked service startif it is stopped. - Tray shows a wrong version after an upgrade - run
jacked service statusto compare the owned service build with the installed version. If ownership is proven,jacked service restartperforms an authenticated handoff. If ownership is indeterminate, usejacked service recover; do not signal a PID manually. - "Port 8321 in use" - run
jacked service status. A v2 service quarantines itself onto a discoverable dynamic port instead of killing the listener, so use the dashboard URL status prints. - Auto-update ran but the tray never came back - run
jacked service status, thenjacked service recoverto reconcile a provably owned native definition. Recovery stops with exact-path guidance if it finds a legacy or foreign artifact. - Claude Code keeps asking me to log in - jacked was rotating the active account's CC refresh token out from under Claude Code. Fixed in 0.41.2+. Update and the issue goes away. Architecture doc at
docs/architecture/oauth-and-credential-flows.md§7.1-7.3 explains the full mechanism. - Auto-update failed - read
~/.claude/jacked-update-failed.txtand the log at~/.claude/jacked-update.log. The recovery file lists the exact commands to finish the upgrade manually.
Verify what's actually running:
# What endpoint and version is the live tray reporting?
jacked service status
curl -s http://127.0.0.1:8321/api/version # use the Port value reported above
# {"current":"0.99.1","latest":"0.99.1","outdated":false,...}
If current is older than the version your uv tool list shows, the running tray predates the install. Use the authenticated restart or recovery flow above.
Installing from scratch
We use uv for installation - it's a standalone tool from Astral that installs and manages Python CLI apps in isolated venvs. Much faster than pip, handles Python interpreter management, and keeps claude-jacked from conflicting with anything else on your system. Follow the steps for your OS.
macOS
# 1. Install uv (skip if you already have it)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Reload your shell so `uv` is on PATH. Either restart your terminal or:
source ~/.zshrc # or ~/.bashrc
# 3. Verify
uv --version
# 4. Install jacked (tray icon ships by default)
uv tool install claude-jacked
# 5. Wire up Claude Code hooks + the launchd auto-start + tray
jacked install
Notes:
- uv's installer adds
~/.local/binto your shell rc automatically. Ifjacked --versionsays "command not found" after step 5, runuv tool update-shell && source ~/.zshrcor open a fresh terminal. - The owned launchd definition lives at
~/Library/LaunchAgents/ai.hank.jacked.plist. If it conflicts with a legacy or foreign definition,jacked service recoverrefuses to replace it and prints that exact path for review.
Linux
# 1. Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Reload shell
source ~/.bashrc # or ~/.zshrc / ~/.profile
# 3. Verify
uv --version
# 4. Install jacked (tray icon ships by default)
uv tool install claude-jacked
# 5. Wire up Claude Code hooks + the systemd user service + tray
jacked install
Notes:
- Requires a system tray provider (most desktop environments ship one - GNOME may need the AppIndicator extension; KDE/Cinnamon/XFCE work out of the box). On a headless box, run
jacked service start, then usejacked service statusfor the actual dashboard URL and~/.claude/jacked-service.logfor logs. jacked service installreconciles and enables a per-user systemd unit. It never needs a root system service.
Windows
# 1. Install uv (standalone installer, no Python prerequisite)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# 2. Close and reopen your terminal so `uv` is on PATH.
# The installer added %USERPROFILE%\.local\bin to User PATH.
# 3. Verify
uv --version
# 4. Install jacked (tray icon ships by default)
uv tool install claude-jacked
# 5. Wire up Claude Code hooks + Task Scheduler auto-start + tray
jacked install
Notes:
- After step 4,
jacked.exelives at%USERPROFILE%\.local\bin\jacked.exe. uv's installer adds that dir to PATH - ifjacked --versionfails, open a new terminal (PATH changes don't propagate into open ones). jacked service installregisters a current-user, least-privilege Task Scheduler definition backed by a private, hash-verified PowerShell launcher.- PowerShell execution policy warning: if
irm | iexis blocked, runSet-ExecutionPolicy -Scope CurrentUser RemoteSignedfirst, or download and run the installer script manually from astral.sh/uv/install.ps1. - If the tray icon does not appear, run
jacked service statusfirst. Use the dashboard URL it reports when the service is running or quarantined, and check%USERPROFILE%\.claude\jacked-service.logfor details.
After install (all platforms)
Run jacked service status for the dashboard's actual URL. It normally uses http://localhost:8321; a safe quarantine start uses a reported dynamic loopback port instead. The tray icon's right-click menu has Open Dashboard, Restart, Stop, Start on Login, version + "Check for updates...", and the clickable "Update to vX.Y.Z ->" item when a newer version hits PyPI.
Upgrading later is one command: jacked upgrade (from the terminal) or click the Update line in the tray menu. Both auto-detect that you installed via uv and re-use it. Don't have uv anymore? Reinstall it first: same curl/powershell commands as step 1.
Requirements: Python 3.10+ (uv will fetch one for you if your system doesn't have a compatible version - you don't need to install Python separately).
Upgrading
jacked upgrade
That's it. One command. Works on macOS, Linux, and Windows. Does all three things uv tool install --force alone doesn't do:
uv tool install claude-jacked --force- new package on diskjacked install --force- migratesettings.jsonhooks to the shim form (jacked _hook <name>) so they survive Python version bumpsjacked service restart- reload the running service with the new code (only if a service is running)
Why you need all three: uv tool install --force just drops the new package on disk. The service you already have running is still executing the old version in memory, and your settings.json may still have hook paths that point at the old site-packages location (broken if uv upgraded Python under you).
Options
jacked upgrade --skip-service- just swap the package and migrate settings, don't restart the running service
Cross-platform notes
- macOS/Linux: runs inline. Your terminal shows live output from each step.
- Windows: spawns a detached
cmd.exehelper and exits immediately. Windows can't overwrite a running.exe, so this process has to step out of the way beforeuv tool installreplacesjacked.exe. The helper waits for this process to exit, then runs the three steps with output appended to~/.claude/jacked-update.log. You cantype %USERPROFILE%\.claude\jacked-update.logto follow along.
Tray upgrades
If you're running the background service, you can also click Update to vX.Y.Z -> in the tray menu when a newer version is available on PyPI. Same three-step sequence, fully detached - survives its own binary being replaced mid-update.
What changed in this update
jacked install and jacked upgrade print a concise change-summary instead of a static banner: the version before → after, plus exactly which skills, commands, agents, lenses, and templates were added / changed / removed (and a count of everything unchanged). It's backed by a manifest (~/.claude/jacked-manifest.json) recording what jacked installed, so an upgrade can also prune artifacts it no longer ships - without ever touching your own files. The same summary shows up in the dashboard as a one-shot panel after an upgrade. Run jacked install --json for the machine-readable diff.
/recover - rebuild a crashed session
Opened Claude in a folder whose last session crashed mid-work and you don't know the
session ID? Run /recover. It finds the most-recently-active prior session for the
current folder from its on-disk transcript, shows you the pick to confirm, then injects
a budgeted working-state digest (last instruction, todos, recent actions, files touched)
so you continue right where it died - and prints claude --resume <id> for a full native
continuation. Works on a bare install.
It recommends the newest session with real substance - a near-empty newest session is skipped (but still offered as an alternate). And if the crashed session was actively driving a /goal or /loop (which can't be auto-resumed), the digest surfaces that exact command verbatim so you can copy-paste it back into Claude Code to restart it.
/whats-next ambition: safe by default, /bhag to build it all
/whats-next is the everyday, safe-by-default roadmap command: it picks the highest-leverage work and forges a /goal brief that lands on a feature branch and opens a PR for review - it never merges to main itself.
When a product is pre-production and you want it driven to completion autonomously, run /bhag (Big Hairy Audacious Goal). It runs the coverage matrix at full breadth and forges a long-running /goal brief that loops cell-by-cell - implement → verify → PR → merge to main → next - until the product is built out. Auto-merge is double-gated: it only happens when the repo's declared Lifecycle is Greenfield/Alpha and you explicitly authorize it in-session (and only after CI is green); on anything resembling a live product it refuses and degrades to safe staged PRs. /bhag is a deliberately-typed command (never auto-triggered), because auto-merging to main in a loop is the most powerful thing jacked can do.
Already know what to build? Run /goal-maker - it skips the deciding and packages the work already in front of you (this conversation, a spec, a plan, an in-flight build) into one hardcore, overnight-sized /goal brief: full scope, TDD + tests-green, UI/UX + front-end-polish gates, evidence-based DONE, and a Next: line so a later /whats-next picks up. It defaults to opening a PR; pass merge (/goal-maker merge) to auto-merge each milestone - always gated on green CI, never a red build, and with the gh pr checks output pasted so the run is verifiable. Like /bhag it's deliberately typed (never auto-triggered) so auto-merge can't be reached by accident. The trio: /whats-next decides, /goal-maker packages what you've decided, /bhag drives the whole matrix autonomously.
Built-in Reviewers and Commands
Quick Commands
Type these directly in Claude Code:
| Command | What It Does |
|---|---|
/dc |
Double-check - Reviews your recent work for bugs, security issues, and problems |
/swarm |
Swarm - Parallel implementation across 3-8 coordinated agents with file-level isolation |
/goal-maker |
Goal Forge - Packages the work already in front of you (this conversation, a spec, a plan, an in-flight build) into one overnight-sized /goal brief (≤4000 chars) - full scope, TDD, UI/UX + polish gates, evidence-based DONE, plan-ahead Next:. Defaults to PR; merge arg auto-merges each milestone on green CI |
/bhag |
Big Hairy Audacious Goal - Autonomous full-product build-out: drives the entire coverage matrix cell-by-cell and, on a pre-production repo you explicitly authorize, opens a PR and merges each verified improvement to main in a loop until built out. Deliberately typed, never auto-triggered; refuses auto-merge on any live-users repo |
/pr |
Pull Request - Checks PR status, creates/updates PRs with proper issue linking |
/learn |
Learn - Distills a lesson from the current session into a CLAUDE.md rule |
/remember |
Remember - Routes a durable fact into the jacked Memory Vault as a typed, cross-repo note, falling back to native Claude Code memory when the vault is off |
/blindspot |
Blindspot - Pre-build discovery pass for vague/unfamiliar requests: surfaces your unknown-unknowns (what good looks like, prior art, potholes), teaches enough to prompt well, asks the must-have questions, hands off a sharpened brief |
/redo |
Redo - Scraps the current approach and re-implements cleanly with full hindsight |
/retry |
Retry - Recovers from a transient API/rate-limit error: figures out where the turn fell off and resumes only what's needed, without changing the task |
/techdebt |
Tech Debt - Scans for TODOs, oversized files, missing tests, dead code |
/audit-rules |
Audit Rules - Checks CLAUDE.md for duplicates, contradictions, stale rules |
/cleanup |
Cleanup - Verifies git hygiene and safely cleans branches, stashes, stale worktrees, and untracked state. Report-first, confirm-each, never loses work |
/jacked-setup |
Repo Setup - Generates repo-specific configs for /whats-next, /qa, /ux, /dcr, /docs-sync - faster repeat runs |
/cso |
Security Audit - Systematic OWASP Top 10 + STRIDE threat model analysis with confidence-gated findings |
/retro |
Retrospective - Git history analysis for contributor metrics, test health, velocity trends |
/canary |
Canary - Post-deploy monitoring with baselines, console errors, performance checks |
/benchmark |
Benchmark - Performance regression detection via browser Performance API |
/land-and-deploy |
Land & Deploy - Merges PR, waits for CI/deploy, runs canary verification, offers revert |
/browser-reset |
Browser Reset - Diagnoses and fixes stuck browser MCP connections |
Smart Reviewers
These work automatically when Claude thinks they'd help, or you can ask for them:
| Reviewer | What It Catches |
|---|---|
| Double-check | Security holes, authentication gaps, data leaks |
| Code Simplicity | Over-complicated code, unnecessary abstractions |
| Error Handler | Missing error handling, potential crashes |
| Test Coverage | Untested code, missing edge cases |
Example: After building a new feature:
Use the double-check reviewer to review what we just built
Skills
Alongside the commands, jacked install ships 28 skills: knowledge packs and engines Claude invokes by name or picks up automatically when the task fits. Every skill answers to /name; these ten used to ship as commands and keep their familiar slash workflow:
| Skill | What It Does |
|---|---|
/dcr |
Recursive Review - Spawns parallel reviewers across 11 lenses (security, performance, logic, UX, observability, data integrity, etc.) in waves until all pass clean. Depth scales with a risk tier: a small mechanical change gets one consolidated reviewer, while large or security-sensitive changes get the full persona + pre-mortem fan-out. Reviewers run on Claude (default) or the OpenAI Codex CLI (jacked dcr engine set codex) |
/qa |
QA Testing - Browser-based QA testing of UI changes with Playwright or Chrome DevTools MCP |
/ux |
UX Testing - Parallel browser-based UX checks across multiple pages and aspects simultaneously |
/qa-video |
QA Video - Records a playable video of a test journey (true-motion via Playwright MCP video + chapters, or a frame-stitched MP4/GIF) plus a video-synced narration doc - for regression evidence and bug repros |
/demo-video |
Demo Video - Produces a polished, narrated feature walkthrough video for docs/education from a committed narration script (Playwright recording + timed say/TTS voiceover + captions, muxed with ffmpeg) - regenerable when the UI changes |
/docs-sync |
Docs Sync - Diffs branch against base, maps code changes to affected docs, spawns parallel update agents |
/swarm-research |
Divergent Research - Spawns 2-5 independent agents from different angles, synthesizes proposals, then verifies + attacks with devil's advocate |
/whats-next |
Roadmap Advisor - Weighs a coverage-matrix read (toward 10/10) plus plans, issues, commits, lifecycle, and (when configured) assigned Asana tasks, then decides the single highest-leverage initiative and forges a ready-to-run /goal brief (≤4000 chars) for autonomous, tested delivery |
/release |
Release - Full release pipeline: bump version, push, CI, GitHub Release, PyPI publish |
/lockdown |
Supply-Chain Lockdown - Audits repo against supply-chain attacks (lockfile integrity, CVE/malware scan, Actions SHA-pinning, provenance, secrets), HIPAA mapping for PHI repos. fix mode auto-hardens low-risk items; baseline installs ongoing CI monitoring |
The full set, grouped:
| Group | Skills |
|---|---|
| Review & QA engines | dcr (recursive multi-lens review), qa, ux, qa-video, aesthetic-dogfood-audit (drive the whole app as every persona and judge function + finish) |
| Autonomous delivery | whats-next, coverage-matrix (persona x domain gap scoring), jack-it-up (full brainstorm-plan-build-review cycle), clone-website (reverse-engineer a site you own or are authorized to reproduce, dispatching parallel builder agents in worktrees), recursive-10-10-product-hardening, night-shift (daily-driver autonomous loop: rotating brain roster discovers best-in-class gaps, builds behind done-contracts, verifies with a dispatched skeptical evaluator, lands one consolidated PR or auto-merges behind green checks on confirmed pre-production repos, and paces itself with jacked usage), swarm-research, checkpoint, recover |
| Design engineering | emil-design-eng (UI polish + animation craft rules), review-animations (strict motion review with a non-negotiable standards bar), animation-vocabulary (name that effect), apple-design (fluid, physical motion and Apple's design principles, translated for the web) |
| Docs & branding | docs-sync, demo-video, launch-post, logo-forge, claude-md-optimizer |
| Ops & infrastructure | deploy-to-railway, release (the repo's own ship pipeline, detected rather than assumed), lockdown (supply-chain audit), memory-librarian (dedupes and reconciles the Memory Vault), chain-of-command (session model-dispatch policy: top model plans and judges, Opus does volume work, cheap tiers do pure search) |
The four design-engineering skills are adapted from Emil Kowalski's excellent emilkowalski/skills (MIT), built on his years of design-engineering work and his course at animations.dev. They teach Claude the craft details agents usually get wrong: easing choice, spring parameters, interruptibility, prefers-reduced-motion, and when the right animation is no animation. jacked's /dcr frontend reviewer automatically pulls in review-animations when a diff touches motion code.
Skill Packs (installed by default, opt out anytime)
Beyond the bundled suite, jacked installs curated collections of third-party skills directly from their upstream repos. Nothing is vendored: install and updates run through the vercel-labs skills CLI (npx skills, requires Node 18+), so the upstream repo stays the source of truth and every jacked install refreshes them. If Node is not present, packs are skipped with a note and the rest of the install is unaffected.
The default packs install with a plain jacked install. To opt out:
jacked install --no-packs # skip packs entirely for this install
jacked packs disable marketing # durably remove a pack (it won't return on the next install)
jacked packs list # see packs, on/off/default status, and install counts
jacked packs enable design-extras # re-enable a disabled pack, or add a non-default one
jacked packs update # refresh enabled packs from upstream
| Pack | Source | What you get |
|---|---|---|
marketing |
coreyhaines31/marketingskills | 28 curated marketing skills (of the repo's 47): paid ads with quantified kill/scale rules, AI SEO, pricing research, prospecting, positioning, cold email, PR and newsjacking, RevOps scoring, and more. |
design-extras |
emilkowalski/skills | improve-animations: audits a whole codebase's motion and writes self-contained, prioritized fix plans any agent can execute. |
Packs can also be toggled from the dashboard (Settings > Features > Skill Packs). Skills install for Codex too when it is present. Removal is source-checked against the skills CLI lockfile, so a same-named skill you installed yourself from another repo is never touched, and a skill directory you already own is never overwritten. Because packs are on by default, a plain jacked install pulls third-party content from those repos' main branch at install time; if that trust boundary matters for your environment, run jacked install --no-packs or disable the packs you do not want. A disable is durable: a pack you turn off stays off across future installs.
DCR Review Engine (run reviews on Codex, opt in)
/dcr spawns several parallel review agents per wave. By default they run on Claude and spend your Anthropic plan. If you have the OpenAI Codex CLI installed and signed in, you can route the volume reviewers to a Codex model instead and pay for review fan-out with your OpenAI subscription:
jacked dcr engine set codex --model gpt-5.6-luna --effort xhigh
jacked dcr engine # show the current config and live Codex readiness
jacked dcr engine clear # back to Claude (the default)
Or use the dashboard: Settings > Features > Review Engine.
What stays the same: the parent Claude session still selects the lenses, validates every finding against the real code before any fix, applies the fixes, and issues the verdict. Security and design reviews stay on Claude by default (the keep_on_claude list; you can change it with the CLI). What changes: the read-only reviewer briefs execute as codex exec jobs in a read-only sandbox, and findings come back as schema-validated JSON. With a fast, low-cost model like GPT-5.6 Luna at xhigh effort, a full review wave costs a fraction of the Claude equivalent.
Safe by default: no config means pure Claude. Codex missing, signed out, a corrupt config file, or a failed or hung Codex job all fall back to Claude automatically. A review never blocks on the engine, and no review lens is silently dropped.
Memory Vault (cross-repo memory, opt in)
Claude forgets everything between sessions, and worse, everything it learned in one repo is invisible in the next. Memory Vault fixes both. It's a git-backed Markdown vault at ~/jacked-vault that captures durable decisions, conventions, and progress as you work, then feeds the relevant slice back into new sessions. The notes are plain Markdown with [[wikilinks]], so the vault opens in Obsidian as a viewer, but there is no database, no embeddings, and no MCP server: recall is grep plus a hand-maintained index, and the vault is its own git repo you can push to a remote or keep entirely local. It leaves Claude Code's native auto-memory completely untouched.
Turn it on from the dashboard (Settings > Features > Memory Vault) or from the CLI:
jacked memory init # scan your repos, suggest groups, install capture + recall hooks
jacked memory status # vault health: groups, note counts, last capture, drift
jacked memory add # write a typed note (decision/convention/vision/reference/progress)
jacked memory search "auth flow" # grep-tiered lookup: hot slice -> index -> notes
jacked memory rollup # deterministic episodic rollup (today -> recent -> archive)
jacked memory migrate # import existing .remember/ history (see below)
Capture is event-driven and quiet. A SessionEnd hook runs one local triage pass over the transcript; it writes an episodic entry every time, but a durable semantic note only when it finds a real decision, accomplishment, or convention, so most sessions write nothing lasting. Landing a branch fires the same instinct: a post-merge git hook on main/master distills the merge (branch, PR title and body, changed files) into a candidate note. Everything is processed locally, transcripts never leave the machine, and every hook fails open (exit 0 on any error) so memory can never block or slow a session.
Recall is budgeted. A SessionStart hook injects a group-scoped brief hard-capped at 1,500 tokens: the current progress slice, an index excerpt, the top-linked decisions, and the last episodic entry for the repo you are in, ending with an explicit pointer to the vault paths worth reading. Deeper recall is on-demand file reads against real paths, using the tools Claude already has.
A librarian keeps it honest. The memory-librarian skill dedupes notes, reconciles contradictions (newest wins, with a trail), archives stale entries, validates frontmatter, and re-syncs the index. It is nudged at SessionStart when the drift counter trips, or you can run it by hand.
Migration is safe by construction. jacked memory migrate imports every .remember/ directory under your configured roots into the vault, flags core memories as semantic candidates, and verifies imported file and entry counts against the source, failing loud on any mismatch. It never modifies or deletes the source .remember/ dirs. Retiring the third-party remember plugin happens only after migration verifies, and only after you confirm a printed summary of exactly what changes.
Statusline (session status at a glance, on by default)
jacked install registers a status line that Claude Code shows at the bottom of every session:
Fable 5 [xhigh] | ctx 63% (633k/1.0M) | 5h 7%->14:00 | 7d 88%->Sat 02:37 | me@co.com · MyOrg · Max 5x
Model and effort, context-window pressure with real token counts, both rate-limit windows with their reset times, and the latest evidence-qualified account state. A fresh global resolved snapshot can show the observed email. A scoped launch shows the desired account with runtime unknown unless its exact launch nonce, credential revision, and evidence binding are certified. Stale, conflicting, missing, or unusable evidence also stays visibly unresolved. Percentages are color-coded (green, then yellow at 60%, red at 85%). The renderer is a small stdlib-only Python module, registered with the absolute path of jacked's own interpreter, so it works the same on macOS, Linux, and Windows with no shell, jq, or PATH dependencies.
The install is safe by design. If you already have a statusline, jacked install keeps it and tells you how to adopt jacked's. An explicit enable saves your previous statusline and restores it when you disable or uninstall. An explicit disable is durable: the next jacked install does not turn the statusline back on.
jacked install --no-statusline # skip the statusline for this install
jacked statusline enable # adopt jacked's statusline (saves any existing one)
jacked statusline disable # remove it and restore a saved one, if any
jacked statusline status # registration state and the active command
The dashboard toggle lives at Settings > Features > Statusline.
QA Browser Testing
The /qa command runs browser-based QA on UI changes from the current session. It detects modified UI files (JS, CSS, HTML, Vue, Svelte, etc.), opens the app in a browser, and runs visual checks, interactive tests, and console error scans. Auto-suggested via a Stop hook when UI files are modified. Requires Playwright MCP or Claude-in-Chrome.
Asana in /whats-next
When Asana is reachable, /whats-next blends your assigned tasks into the same coverage-led recommendation as GitHub issues and code TODOs. Run /jacked-setup whats-next once per repo to probe for access (an Asana MCP plugin, a local asana CLI, or ASANA_PERSONAL_ACCESS_TOKEN) and write a ## Asana Integration block into the standalone command. Tasks that touch the current repo - by GitHub URL, repo basename, file/module mention, or project-name resemblance - are weighed alongside the rest, with priority and due-date read as demand/cost-of-delay signals. Asana origin appears on the Evidence line; it grants no priority bonus, and if Asana isn't configured the step is skipped silently.
Sound Notifications
Get audio alerts so you don't have to watch the terminal:
jacked install --force --sounds
- Notification sound - Plays when Claude needs your input
- Completion sound - Plays when Claude finishes a task
Works on Windows, Mac, and Linux. To remove: jacked uninstall --sounds
FAQ
How do I run multiple Claude Code accounts?
Install jacked, then add each account from the dashboard's Accounts page or let it walk you through the OAuth flow. Every account you own becomes part of one fleet. Use jacked claude <id-or-email> when you want a specific account target; the session remains runtime-unverified until exact-build evidence can certify which identity served it.
What happens when I hit my Claude Code usage limit?
Jacked identifies an eligible account that still has headroom and records an auto-swap recommendation. Automatic credential mutation happens only when the exact runtime has a certified cooperative transaction engine and writer fence. Otherwise jacked leaves credentials unchanged and tells you which account to choose.
Can jacked switch Claude accounts automatically?
Only on a runtime with a certified cooperative credential capability. Auto-swap always watches the 5-hour and 7-day headroom, but current unsupported or unfenced builds stay recommendation-only. Manual Use Account requests are local-only and return the exact outcome instead of claiming success from a database setting.
How do I check how much Claude usage I have left?
Three places: the statusline inside every Claude Code session, the tray or menu-bar pill next to your clock, and the dashboard's Accounts page. All of them show the 5-hour window, the 7-day window, per-model caps, and reset times.
Does jacked work with Codex?
Yes. Codex accounts sit side by side with Claude accounts in the same pool. When Codex is installed, jacked install also deploys the suite into Codex's native formats (~/.agents/skills, ~/.codex/AGENTS.md, Codex custom-agent TOMLs).
Does the tray icon work on Windows and Linux, or only macOS?
All three. macOS gets a native menu-bar agent; Windows and Linux get a system-tray icon through pystray. The statusline is cross-platform too, with no bash, jq, or PATH dependency.
Can I open the dashboard from another machine?
Yes, over Tailscale. Remote account authorization works too: the dashboard shows an authorization link instead of trying to open a browser on the server, and you paste back the code Claude gives you.
How do I install the slash commands, skills, and review agents?
uv tool install claude-jacked then jacked install. That deploys 20 slash commands, 28 skills, and 10 review agents into ~/.claude. Skills are slash-invocable too, so /dcr, /qa, /lockdown and the rest work exactly like the commands do. Teams can install it as a Claude Code plugin instead, with no Python required.
Will jacked overwrite my own Claude Code settings?
No. Upgrades diff cleanly (added, changed, removed) and never touch files you wrote. If you already have a statusline, jacked keeps yours and tells you how to adopt its own. A colliding skill directory you own is preserved rather than clobbered.
How do I uninstall jacked?
jacked uninstall && uv tool uninstall claude-jacked
Your database at ~/.claude/jacked.db stays intact, so reinstalling later keeps your accounts and history.
Uninstall / Troubleshooting
Uninstall
jacked uninstall && uv tool uninstall claude-jacked
Your local database (~/.claude/jacked.db) stays intact - reinstall anytime without losing accounts or history.
Common Issues
"jacked: command not found" - Run uv tool update-shell and restart your terminal.
Windows errors - Claude Code on Windows uses Git Bash, which can have path issues. Ask Claude: Help me fix jacked path issues on Windows
Version History
| Version | Changes |
|---|---|
| 0.99.1 | One account-aware service, one tray icon, on every supported operating system. Service installation and restart now converge through one serialized ownership transition across launchd, systemd user services, and Windows Task Scheduler. Exact owned definitions are upgraded in place, legacy definitions are retired with recoverable backups, disabled native services are explicitly re-enabled, and partial manager failures restore the prior artifact and running state. A private lifetime lease, authenticated readiness checks, content-addressed generations, secret-negative supervisor environments, and refusal of foreign definitions prevent duplicate old and new trays from running side by side. Stale v2 PID compatibility evidence can no longer be mistaken for a legacy service after a crash or PID reuse. Invalid private ownership evidence can be quarantined safely with jacked service recover, while live ownership and foreign artifacts remain untouched. Status now preserves starting, running, degraded, quarantined, legacy, and typed autostart states instead of collapsing uncertainty into a healthy or disabled claim. Stateful convergence tests exercise upgrades plus repeated installs on all three native managers and prove one registered definition, one current process, one listener, and one icon. |
| 0.99.0 | Evidence-safe account switching and cross-platform service ownership. Claude credential changes now run through an exact-build capability registry and a typed transaction result, with idempotent dashboard actions and separate desired, stored, committed, existing-session, and provider-verification states. The certified Claude Code 2.1.259 macOS arm64 topology can report observed_target_unfenced; unknown builds, platforms, architectures, and config modes fail closed. Auto-swap remains recommendation-only unless a certified cooperative transaction engine and writer fence are installed. Session hooks now consume a bounded, token-free resolver snapshot and the Accounts page separates Started as, Observed configuration, Pending next activity, and Runtime unverified instead of presenting a changed default as proof about live sessions. jacked claude <id-or-email> still prepares a scoped per-account config and passes Claude arguments through, but does not call that runtime identity proven without certified nonce, revision, and evidence binding. The background service now has a content-addressed service specification, isolated secret-negative startup environment, lifetime ownership lease, private manifest, authenticated per-user control channel, and a quarantine port when 8321 has ambiguous ownership. Installation hands a verified manual v2 instance off before native activation, while jacked service recover reconciles only provably owned drift and refuses legacy or foreign supervisor artifacts with exact-path guidance. Native definitions cover launchd, systemd user services, and Windows Task Scheduler, and CI runs the test suite on Ubuntu, macOS, and Windows. |
| 0.98.1 | fix(dashboard): the Re-auth row in an account's overflow menu now re-authenticates that account, instead of opening a blank Add Account window in incognito. The token pill's re-auth went through startReauthFlow(id, email), which POSTs to /api/auth/accounts/{id}/reauth so the flow knows whose token it is refreshing. The kebab menu's row, built by the same code and carrying the same data-id, threw that id away and called startAddAccountFlow(). With no target account the launcher has no identity to pre-fill and no dedicated profile to open, so it deliberately falls back to a private window (the rule from 0.97.0 that Add Account must never authorize whoever a shared profile is signed in as), the banner shows no email, and the OAuth callback can create a duplicate row instead of updating the one you clicked. The row now calls the targeted flow like the pill does. Two behavior tests in tests/unit/test_web_js_account_menu.py click the row through the real handler and assert it starts the targeted flow with the right id and email, never the add flow, and that cancelling the confirm starts nothing; the first one fails against the old handler. Also: Use Account no longer plays dead after a CC token re-auth. Reported on macOS: re-auth the CC token, click Use Account, nothing happens, no toast, and only a page reload and a second click switch the account. While an OAuth flow is pending the dashboard refuses every other account action with a two-second "in progress" toast, and three things kept that guard up after the sign-in had actually finished. The verdict was read only by a one-second timer, but the sign-in window takes the foreground, and a hidden tab's timers are throttled or frozen, so a completed flow could sit unread for minutes; the server also forgot a finished flow 30 seconds after the callback, so a late poll came back "expired" with the tokens already stored; and the guard was released only after the full account refresh, which on macOS runs Keychain reconciliation. Now the server keeps a finished flow pollable for five minutes (FLOW_RETENTION_SECONDS), the dashboard polls the instant the tab becomes visible or focused, the guard drops on the server's verdict rather than after the refresh, the banner carries a Cancel button so a stuck flow never needs a reload, and the refusal toast lasts four seconds and says what to do. Tests: tests/unit/test_oauth_flow_retention.py and tests/unit/test_web_js_oauth_flow_guard.py. |
| 0.98.0 | feat(prompts): a prompt audit of everything jacked ships, the memory vault stops begging Haiku for JSON, and jacked install on Windows stops piling up SessionStart hooks. The audit (/claude-api prompt-audit against Claude Fable 5.1) went over all 80 shipped prompt files. Verdict: mostly clean, with three real problems. First, the two memory-vault claude -p passes said "Return STRICT JSON ONLY, no prose, no markdown fences" and then fished an object out of whatever came back with a widest-braces parser, while the CLI has had --json-schema for exactly this. Both passes now pass a JSON Schema (TRIAGE_SCHEMA, MERGE_SCHEMA) through a new schema= kwarg on call_claude, which adds --output-format json --json-schema; parse_triage reads the CLI's envelope (structured_output, or the JSON string in result, confirmed against a live run) and keeps the tolerant parse only as the schema-less fallback. Second, the "never cap successful work" backstop paragraph existed in six shouted copies whose stuck-threshold wording drifted; it now reads at normal volume in jacked_behaviors.md with short restatements in bhag, goal-maker, whats-next, and the two hardening skills. Third, /learn told every rule it wrote to lead with ALWAYS or NEVER, manufacturing the same register in every downstream CLAUDE.md; it now asks for a plain directive with its reason and reserves the absolutes for recurring hard constraints, and /audit-rules stops grading a rule vague for lacking the keyword. Smaller rewrites: /redo at normal volume, /swarm without the "as of v2.1.178, TeamCreate no longer exists" archaeology, chain-of-command without the "burned us 2026-07-02" story, two skill descriptions (whats-next, recover) as intent categories instead of quoted-phrase lists, and a personal-preference attribution removed from two public skills. The installer bug fell out of the audit's follow-up: _is_jacked_managed_hook_path matched jacked" _hook case-sensitively, the Windows shim path ends in jacked.EXE", so no entry on Windows ever counted as jacked's and every jacked install appended one more combined SessionStart hook (this machine had eight, and the chain-of-command policy was landing in context two or three times per session). The matcher is case-insensitive now and accepts the .exe form; uninstall used the same matcher and was leaving hooks behind too. Also in this release: docs/future-work.md gains the graphify-wiring and subscription-billing proposals, and the launch article draft is checked in. |
| 0.97.1 | fix(auth): the dedicated sign-in window now actually comes to the front, and the dashboard's fallback link no longer routes you into the wrong account. First real use of 0.97.0 on Windows: the launcher did everything right (Chrome, dedicated profile, email pre-filled) and the user saw nothing, because Windows refuses foreground activation to a window created by a background process and the tray service is one. The window opened behind the dashboard. The natural next move was the banner's "Open the authorization page" link, which opens in the dashboard's own browser, signed in to some other Claude account, and with orgUUID naming an org that account is not in, claude.ai answers "Can't access this organization". A dead end that looked like a jacked bug. Two fixes. New jacked/web/window_focus.py runs a focus pass on a daemon thread after every launch on Windows: it polls for the visible window owned by the spawned browser process (and, after three seconds, for a Claude-titled window from the same executable, since Chrome hands the URL to an already-running instance of that profile and exits), then escalates through SetForegroundWindow, a minimize/restore round trip, and finally a taskbar flash, and logs which one worked. Verified from a console-less detached process: the new window took the foreground on the first attempt. On macOS the launcher now goes through open -n -a <bundle> --args ... so Launch Services activates the app instead of leaving it behind. And the banner's primary action in profile or private-window mode is now a "Bring up the sign-in window" button backed by POST /api/auth/flow/{id}/open, which re-launches into the same profile (existing instance gets a tab, focus pass runs again); the raw link is demoted to "Open in this browser instead" with a plain warning that it uses whatever account that browser is already signed in to. The subtitle names the browser and says the window may be behind the dashboard or on the taskbar. Flow status now also reports browser_name, purpose, the target identity and any reopen_error. |
| 0.97.0 | feat(auth): re-auth now knows who it is for. The Claude login opens with the right email pre-filled, in a browser profile dedicated to that account, and the dashboard says whose token it is waiting on. Re-authenticating an account used to mean: log out of whatever claude.ai account the browser had, remember which card you clicked, log in as that one, watch claude.ai drop you into the chat instead of back at the consent page, and go click the jacked link a second time. Anthropic's authorize endpoint accepts login_hint and orgUUID (Claude Code's own login sends both; jacked sent neither), and with them claude.ai redirects to its login page with the email already in the box, selectAccount=true set so a different signed-in account is not silently reused, and a returnTo that carries the whole OAuth request so you land back on the consent page after logging in. Every flow that targets a known account (re-auth and CC authorize) now sends them; Add Account has no identity yet and sends nothing. On top of that, the authorize URL is opened by a new launcher (jacked/web/browser_launch.py) in a browser profile dedicated to that account under ~/.claude/jacked-browser-profiles/<email>, so each Claude account keeps its own claude.ai cookies and a later re-auth is a single Authorize click. Profiles are keyed by email rather than account id on purpose: one login covers every org that email belongs to, and orgUUID picks the org. Chrome, Edge, Brave, Chromium and Firefox are detected in that order (or set JACKED_OAUTH_BROWSER to an executable); Add Account gets a private window instead of a shared profile so it can never authorize whoever happens to be signed in; no supported browser, or any launch failure, falls back to the system default. A "Re-auth browser" card on Settings > Advanced picks dedicated profile (default), private window, or system default. The waiting banner now reads "Authorizing jack@example.com · Org name", the link says which email it opens for, and the subtitle says whether a dedicated profile or a private window was used. Background, since it is why you re-auth at all: an investigation across two of the maintainer's machines found that Anthropic returns invalid_grant with error_description: "Refresh token expired" for every dead token, and every measurable OAuth session died 27 to 30 days after its interactive login regardless of how many times the refresh token had been rotated in between; a token consumed by a competing refresher returns "Refresh token not found or invalid" instead, which appeared exactly once. jacked currently labels the expiry "Refresh token consumed (will retry)" and retries it every five minutes; treating that expiry as terminal, predicting it from the login timestamp, and dropping the redundant second login are the follow-ups. New tests cover the URL params, the flow status fields, the launcher (every browser and mode combination, the fallbacks, and the private-window rule for unknown identities) and the banner; an autouse fixture keeps the suite from ever launching a real browser. |
| 0.96.0 | refactor(skills): ten commands that shipped twice now ship once, as skills. Claude Code merged commands and skills into one slash namespace, and a same-name skill shadows the command, so /dcr, /qa, /ux, /whats-next, /docs-sync, /lockdown, /demo-video, /qa-video, /swarm-research and /release were each carrying a full engine body in jacked/data/commands/ and a thin pointer-wrapper skill that deferred to it. The command copy was dead weight: it cluttered /commands with duplicate entries for something the skill already answered, and the two halves could drift. Each of the ten skills now carries the repo-dispatch preamble and the complete engine body directly, and the command files are gone, taking the count from 30 commands / 28 skills to 20 / 28 with no loss of surface - every one of those names is still typed the same way. /release gets a skill for the first time. /jacked-setup follows: it now writes one repo-specific skill file per target instead of the command-plus-stub pair it used to generate. jacked install prunes the stale ~/.claude/commands/ copies left behind by an earlier version, so upgrading does not leave you with both. And the Codex mirror keeps parity: the $dcr, $qa and friends prompts are generated from the skills now rather than from command files that no longer exist. |
| 0.95.0 | feat(webux): skills get their own Settings section, every feature tab gets a filter, and Installations finally says WHICH agents and commands are off. Plus the ui-skills pack and a frontmatter parser fix. Every artifact class was already installable and uninstallable from the dashboard; the problem was finding anything, and one class was filed under a heading that misdescribed it. All 27 bundled skills rendered inside Knowledge, under a description reading "Documents and rules that Claude reads for context and behavior" - which describes the two rows that genuinely belong there (Behavioral Rules, Reference Doc) and not the 27 skills buried under them, and disagreed with the Installations page, which already treated Skills as a first-class group. Skills now render in their own section, split on the skill_ prefix the API already returns; both halves still toggle through the knowledge category because PUT /api/features/{category}/{name} takes a Literal with no skills member, and a test pins that so the presentation split never becomes an API one that 422s on every click. A single filter now spans the Agents, Commands and Features tabs, needing no row-markup churn because every row already carried data-feature-row; it matches rendered text rather than names, so "supply-chain" finds /lockdown, whose name contains neither word, and sections tagged data-feature-section collapse when all their rows filter out so a heading never hangs over empty space. On Installations, 8/10 raised exactly one question and then refused to answer it: chipping out all 40 agents and commands would have wrecked the four-column grid cell they live in, so the count stays and a short amber line names the disabled ones, rendering nothing at all in the normal everything-installed case. Also fix(api): _parse_frontmatter read one line at a time, but a YAML block scalar (description: >-) carries its value on the FOLLOWING indented lines, so it stored the indicator and deploy-to-railway's dashboard description was the literal string ">-"; found by looking at the new Skills section in a browser rather than by reading code, and now covered by a doctest. New ui-skills pack from ibelick/ui-skills: baseline-ui, create-design-md, fixing-accessibility and fixing-motion-performance, a deliberate 4-of-7 subset (improve-ui duplicates aesthetic-dogfood-audit/ux; ui-skills-root shells out to an npx ui-skills CLI jacked does not ship and routes agents at skills they have not installed; fixing-metadata is covered by the marketing pack's seo-audit plus schema), install-verified in a sandbox HOME with jacked's exact argv. Ships with 9 new tests whose cross-tab wiring guard is mutation-verified, and the new suite loads component JS by concatenating it into one temp file for node instead of the eval the older test_web_js_* suites use. |
| 0.94.2 | fix(webux): you can add or re-auth an account from a REMOTE dashboard again - returning from Claude's authorization tab no longer destroys the code paste box. docs(readme): rewrite the README's opening and add an FAQ so coding agents can actually find this project. The remote (manual) OAuth flow hands you an authorization link rather than popping a browser on the server: you approve in a second tab, Claude shows a code, you paste it back. Except switching back to the dashboard fired the visibilitychange handler in websocket.js, which calls renderRoute() - a wholesale re-render of the accounts view that takes #oauth-flow-status with it, destroying the authorization link and the paste box at the precise moment you returned holding the code. The flow then kept polling invisibly until it timed out, with nowhere left to paste, which made adding or re-authing an account from another machine effectively impossible. rerenderAccountsView() has carried that banner across re-renders since 0.85.0, but this path never went through it. The handler now bails on _accountActionInFlight before re-rendering, exactly as startPolling() already did with the same flag. The regression test is mutation-verified: pull the guard out and it fails. Separately, Firecrawl launched a Developer Index on 2026-08-20: a semantic retrieval layer over 70M+ developer artifacts (READMEs, issues, merged PRs, docs, OpenAPI specs) that coding agents increasingly use to pick tools. Our README was already indexed (confirmed via the API's repos echo, readme: true) and still ranked outside the top 50 for the query that literally describes this project, behind repos with 7 and 9 stars - so not a popularity problem. The cause was semantic: the H1 was a bare brand token that means nothing to an embedding model, and the section headings ("What You Get", "Quick Start") carried none of the vocabulary people actually search with, which matters because this index retrieves PASSAGES and the extracted passage includes the headings verbatim. The H1 now names the function, the opening is phrased as the user's problem ("when you hit a Claude Code usage limit"), the three vocabulary-free h2s were renamed (no TOC anchors broke - only the TOC links internally and none of the three were in it), and a new 10-question FAQ gives passage retrieval something to match, every answer grounded in shipped behavior rather than aspiration. Two accuracy bugs fell out of the same pass: the intro described the tray as "a macOS menu-bar app" when select_menubar_backend() in jacked/service/tray.py falls back to pystray on every non-darwin platform, so Windows and Linux support was being hidden from readers and search alike; and the command/skill counts were stale in three separate places (29 commands / 27 skills in both the intro bullet and the What's Included table, plus a third figure in the PyPI summary) against a real 30 / 28 / 10 counted off jacked/data/. The pyproject.toml description, which is the user-facing PyPI project summary, was refreshed to match and had its em-dash removed. Also investigated and rejected: moving jacked/data/skills/ to a root-level skills/ dir to get our 28 skills indexed individually - the repo already ships six tracked SKILL.md files at .claude/skills/, the exact path pattern the index picks up for other repos, and none are indexed, which means skill and doc ingestion is popularity-gated rather than path-gated. No code changes. |
| 0.94.1 | fix(windows): the tray's Update button silently did nothing and left you with no tray icon at all. Clicking Update ran for five seconds, marked every phase ok, and performed none of them: the package upgrade, the settings migration and the service start were all skipped, leaving the old version installed with no service and no icon. The tray-update helper is a cmd.exe batch, and 0.92.1 began spawning it with its stdout bound to an open handle on ~/.claude/jacked-update.log so its output would be captured instead of vanishing. But cmd.exe cannot open a redirection target that another handle already holds open for writing, so every >> "%LOGFILE%" step failed with "The process cannot access the file because it is being used by another process" - and cmd then SKIPS the command while leaving ERRORLEVEL at 0, so every if errorlevel 1 guard sailed straight past a step that never ran. The status file recorded installing_package as ok in 0.33 seconds, which is not a duration in which uv tool install --force completes. Only verifying_service, which actually probes the port, reported the truth, by which point there was nothing left to recover. Every %LOGFILE% redirection is gone from both Windows batches: cmd's stdout IS the log, so bare output both works and is strictly better than before, since steps outside a redirect previously died completely silently. Two further faults in the same batch are fixed: timeout /t 1 /nobreak was the poll sleep, but the helper is spawned with stdin=DEVNULL and timeout refuses a redirected stdin (ERROR: Input redirection is not supported), so the bounded 120-second wait for the tray to exit completed in milliseconds and raced uv tool install --force against a live python.exe - the long-standing "Access denied unless you stop the service first" upgrade folklore, which also affected jacked upgrade; it is now ping -n 2 127.0.0.1, which needs no console. And the poll loop's tasklist/find, whose exit code decides whether the parent is still alive, are pinned to %SystemRoot%\System32 so a Git Bash, Cygwin or GnuWin32 find on PATH cannot make the loop conclude the tray died on its first pass. Both Windows helpers now build the wait loop from one shared wait_for_parent_block() instead of two hand-copied blocks that had independently regressed twice, and the tray path retries jacked service start once before declaring failure, because an update that ends with no tray icon is the one outcome that leaves no way back in. 15 new tests cover both batches, one of them pinning the real cmd.exe sharing-violation and ERRORLEVEL-stays-0 behaviour so the reason for the others stays visible; they were mutation-checked by reintroducing the bug and confirming the suite goes red. |
| 0.94.0 | feat(tray): the tray/menu-bar icon is now the jacked arm - visible at 16px on Windows for the first time. The old icon drew the letter "J" with a TrueType font onto a purple rounded rect; thin font strokes plus Windows font-resolution failures shrank it to an invisible speck in the system tray (~2% pixel coverage of a 16px cell). The new mark is a bold flexed-arm silhouette (matching the dashboard's flexed-biceps favicon), shipped as a 4.8KB grayscale mask (jacked/data/icons/tray-mark.png) and tinted at render time by a new shared renderer (jacked/service/icon.py) - ~42% coverage of a 16px cell, and the entire font-resolution failure class is deleted along with _load_glyph_font. Windows/Linux tray tints by service state (green running / amber starting / gray stopped; the old purple gradient is retired), macOS tints by live usage color with the update badge and provider dot intact. The macOS icon cache moves to jacked-menubar-arm-* names with a once-per-process sweep of the legacy PNGs (mtime-guarded so a still-running pre-upgrade process's fresh files survive). A font-free fallback mark renders if the asset is ever missing or corrupt, so the tray never goes blank. Tests pin 16px visibility with thresholds calibrated against measured reality (shipped mark 42%, old bug 2%, floor 15%), per-state tint distinctness, the fallback path, and the guarded cache sweep. |
| 0.93.0 | feat(dcr): risk-tiered review depth. /dcr and /dc stop spending LARGE-tier tokens on every bugfix. feat(usage): provider usage normalization (Claude + OpenRouter) reaches the statusline and analytics. /dcr now classifies every change into a RISK TIER before spawning anything: SMALL (mechanical, nothing sensitive) runs ONE consolidated reviewer carrying all selected lenses; MEDIUM runs two; only LARGE (sensitive areas - auth, credentials, RBAC/tenancy, billing, migrations, concurrency - or >~600 lines or an architectural plan) gets the full fan-out with personas, wild cards, and the dedicated pre-mortem analyst, and selecting the Security or Access Control lens promotes the tier to LARGE even after an earlier SMALL/MEDIUM call. Re-check waves now verify fixes and their adjacent code ONLY instead of the old "FULL fresh review as if seeing the code for the first time" every wave (the single biggest token sink in the recursive loop, and structurally non-convergent since fresh eyes always dredge up one more marginal item), and the wave loop gains a default cap of 3. The findings policy flips from "report every issue including ones you are not fully sure about" to confidence-first: CRITICAL/MEDIUM only when the reviewer would stake the review on it, with the parent validation gate disproving rather than completing findings - matching how production reviewers (including Anthropic's own Code Review) filter noise. Deterministic diagnostics (lint/type/tests) move to a pre-gate that runs and gets fixed BEFORE any reviewer spawns, and the frontend design reviewer now requires a UI-meaningful diff (markup/styles/DOM/animation) instead of firing on any .js file. /dc gets the matching surgery: pre-mortem conditional on the same large/sensitive/architectural criteria and a default 3-cycle cap on the planning-phase re-verify loop. /jacked-setup dcr templates gain a Sensitive Areas key so each repo can name the paths that force LARGE. Grounded in 2026 research: same-family judge panels have correlated errors (7 same-model reviewers ≈ ~2 independent votes), marginal returns drop sharply past ~3 agents, and modern frontier models hold 5+ review lenses in one prompt without losing depth - so the median run drops from 5-8 agents times uncapped fresh-review waves to 1-3 agents times capped verify waves (~70-85% fewer tokens) while big or security-sensitive changes keep full thoroughness. 17 new content-contract tests pin the doctrine, including a verbatim-embed check that fails the moment the repo's .claude/commands/dcr.md wrapper drifts from the shipped engine body. Separately, the new jacked/usage_normalizer.py normalizes token-usage payloads across Claude and OpenRouter response shapes (input/output/cache tokens, cost, bool/NaN/negative guards) and is wired through the statusline (OpenRouter per-request cost rendering), the analytics scanner/db/anomalies pipeline, and the dashboard usage components. |
| 0.92.1 | fix(service): the Windows login autostart has been silently dead on every boot, and jacked doctor was covering for it. The Startup-folder VBS launches the tray with pythonw.exe -m jacked service start, and pythonw has no console, so CPython sets sys.stdin, sys.stdout and sys.stderr to None. Two separate isatty() calls then killed it. First, the first-run install nag ran sys.stdin.isatty() straight off the top-level main() callback, raising AttributeError before any subcommand could dispatch, so every pythonw -m jacked ... invocation exited 1 with no console, no log line, and no tray icon, boot after boot. The guard exists precisely to bail out for non-TTY callers, and it was crashing on the most non-TTY case there is. Fixing that alone only moved the failure, because uvicorn's own log formatter does self.use_colors = sys.stdout.isatty(), which blows up inside dictConfig and takes the uvicorn thread with it, leaving the worst possible state: tray process alive, PID file written, jacked service status reporting running, and the port answering nothing. Rather than patch call sites (the second one is third-party, and the next dependency will do the same thing), a new jacked/headless.py gives the interpreter real streams once at entry. It is wired into __main__.py ahead of the cli import, because cli.py builds a rich Console at module scope, and again in main() for the jacked.exe console-script path that skips __main__ entirely. The fallback sink is deliberately not a raw os.devnull handle: on Windows NUL is a character device and open(os.devnull).isatty() returns True, which would tell rich and uvicorn to paint ANSI color for a terminal that does not exist. Crash output from a console-less run now lands in ~/.claude/jacked-headless.log (2 MB cap, rotates) instead of the void, so the next one of these takes minutes to find instead of a week. Separately, jacked doctor reported HEALTHY for eight days straight while the tray was missing: it only probed the port, so it could not tell the tray service apart from a hand-run jacked webux (dashboard only, no tray icon, no PID file) that was squatting 8321 and starving every service start of its port, all while jacked service status correctly said stopped. doctor now cross-checks the PID file before claiming health and reports DASHBOARD UP, NO TRAY SERVICE with the actual recovery steps, and its "who is holding the port" hint is no longer a hardcoded lsof on the one platform that has this bug. 20 new tests. |
| 0.92.0 | feat(webux): account cards get an overflow (kebab) menu, and the color theme finally reaches the menu-bar tray. feat(statusline): the model-scoped weekly limit is now on screen. fix(statusline): the FALLBACK warning is no longer sticky or inverted. The account card's action row collapses to [Use Account] ... [kebab], with the rare actions behind the three-dot menu: a metadata header (account id and organization, the id being what the REST fallback needs), Copy launch command (resurrecting a dead commented-out path), Rename, Re-auth, Enable/Disable, and Delete behind a separator, with a full keyboard and ARIA contract (Escape restores focus, arrow keys navigate, one menu open at a time, and an open menu survives a background re-render). This closes a real gap: Re-auth used to render only when validation_status was invalid or expired, but accounts revalidate at most hourly, so a token that died inside that window left the dashboard showing "valid" with no re-auth affordance anywhere, exactly when Claude Code was demanding a relogin. Re-auth now renders for every Claude account regardless of status (never for Codex, whose re-auth is codex login), and an attention dot on the kebab flags the cases jacked does know about. Account cards also lose their 3px colored left border, which was redundant decoration over an already-labeled provider chip. The color theme moves from localStorage to the color_theme server setting, because the tray dropdown is a WKWebView inside the jacked process with its own storage, entirely separate from the browser: switching to Classic in the dashboard never reached the tray, which kept rendering America 250 forever. localStorage is demoted to a per-webview pre-paint cache (still no flash), an existing local choice migrates up once so nobody re-picks, the panel folds the read into its existing refresh cycle with no added polling, a user's pick always beats an in-flight reconcile, and a reconcile that changes the theme repaints the surfaces that bake theme classes into HTML. The statusline gains the model-scoped weekly bucket read read-only from jacked's own database, rendered as Fable 96%->Sat 10:59: Claude Code's payload carries only the aggregate five_hour and seven_day windows, and on every real account measured the model-scoped percentage sits above the aggregate one (96% vs 76%, 100% vs 90%), so 7d alone was hiding the limit that actually stops the session. The account is resolved by email AND organization uuid (an email alone is ambiguous across organizations), stale data is marked and dropped past 24h, and stdlib-only, never-read-credentials, revision-cached (~0.2ms warm), fail-silent constraints all hold. Finally, the 0.89.0 FALLBACK warning is corrected: it compared the newest served model against the session's FIRST assistant turn, a baseline frozen for the life of the session, so every deliberate /model switch read as a gateway fallback and then never went away. Observed live, a session configured on Opus 5 with Opus 5 actually serving still rendered "claude-opus-5 (FALLBACK, not claude-fable-5)" because it began on Fable, and another real transcript labeled a deliberate upgrade a downgrade. The baseline is now the payload's model id, which Claude Code rewrites on every switch, so it self-clears; comparison normalizes both sides so a gateway's namespaced id is not flagged; the old first-turn baseline remains only when the payload has no model id; and skipping the head read on that path drops up to 4MB off every refresh. Across 12 real transcripts the false-warning count went from 3 to 0. |
| 0.91.0 | feat(dcr): configurable review engine - route /dcr reviewers to the OpenAI Codex CLI. New config (~/.claude/jacked-dcr.json) lets /dcr's volume reviewers run as parallel codex exec jobs (default gpt-5.6-luna at xhigh effort, read-only sandbox, schema-validated JSON findings) instead of Claude Task subagents, so review fan-out spends an OpenAI subscription instead of the Anthropic plan. Judgment never moves: lens selection, per-finding validation, fixes, and the verdict stay in the parent Claude session, and keep_on_claude lenses (default Security + Frontend Design) always dispatch as Claude reviewers, with the carve-out applied before lens pairing so no lens is dropped or double-reviewed. Three surfaces share one contract: jacked dcr engine / engine set / engine clear (CLI, --json for the command), GET/PUT /api/dcr-engine, and a Review Engine card in Settings > Features (live Codex preflight with Check again, saving feedback, data-driven carve-out note). Fail-safe throughout: resolve() re-validates every field on the way out (shell-unsafe model ids, unknown efforts, and malformed lens lists are replaced with defaults plus a human reason), update_config() self-heals stale invalid stored values under a cross-process lock, and every failure shape - no config, no CLI, signed out, corrupt or permission-denied file, a failed or hung Codex job - falls back to Claude without ever silently dropping a lens. Schema live-verified against a real codex exec --output-schema run; 92 new tests including injection shapes, the lockout regression, and a cross-process write race. |
| 0.90.1 | fix: the code-review plugin's marketplace reference corrected to claude-plugins-official. jacked install warned "Plugin code-review not found in marketplace claude-code-plugins" on every run; that marketplace does not exist. The plugin ships in claude-plugins-official like the other required plugins, so the install no longer warns. |
| 0.90.0 | fix(hooks): all SessionStart work collapsed into ONE in-order hook, so the session preamble stops shuffling. Claude Code runs every SessionStart hook entry concurrently and concatenates stdout in completion order; jacked's three separate entries made the preamble land in a random order per session, which defeated inference-side prompt prefix caches (byte-captured proof, 2026-08-04). Now a single jacked _hook session_start entry runs everything sequentially in-process from one stdin read, producing byte-stable preamble ordering every session. |
| 0.89.2 | fix(memory): the memory-vault SessionStart brief no longer defeats prompt prefix caches. Prefix caches (Anthropic's, and self-hosted gateways) match byte-for-byte from the front, and two brief sections churned every session - the last episodic entry (new content after every capture, emitted 3rd of 6) and the drift nudge's live note counts - measured on a self-hosted gateway (2026-08-03) to cap cross-session cache reuse at the ~16% mark of the hook block. fit_to_budget gains an emit_order param decoupling output order from trim priority: volatile sections (episodic entry, drift nudge) now emit last and the stable tiers (header, hot, decisions, index) first, so between librarian grooms the brief's front is byte-identical across sessions and cache divergence moves from ~16% into the block to its tail. The drift nudge drops its live counts (byte-stable while over threshold; the librarian skill reports the real numbers when run). Trim behavior under budget pressure is byte-for-byte unchanged. New tests: emit-order output vs trim invariance, drift-nudge byte-stability as drift grows, volatile-sections-last on a real assembled brief. |
| 0.89.1 | fix(statusline): account switches now refresh the plan tier with the email and organization. The shared credential-sync path now projects the incoming account's identity and rate-limit tier into ~/.claude.json, clearing stale tier keys when the target account has no tier and choosing the organization or user tier key based on account type. A switch from Max 5x to Max 20x can no longer retain the outgoing account's badge. The statusline account cache is now bound to the exact config contents, preventing future timestamps, coarse file times, reused file identities, or overlapping renders from pinning stale metadata. Tokens remain confined to credential stores; the cache contains only the rendered account segment and its non-secret source signature. Regression coverage includes organization and personal account transitions, missing tiers, legacy identity-only updates, malformed caches, cache races, same-stat replacements, and an end-to-end Max 5x to Max 20x switch. |
| 0.89.0 | feat(statusline): the statusline now warns when a gateway has swapped the model mid-session. Claude Code's statusline payload only ever carries the model the session was CONFIGURED with, so when Claude Code runs against a gateway that does fallback routing (OpenRouter presets, claude-code-router, LiteLLM), the model actually answering can silently switch to a pricier or weaker one with nothing on screen to show it. The case that motivated this: a text-only primary model returns a hard error the moment an image enters the conversation, and because the image stays in history, EVERY later turn quietly rides the fallback - which is then doing your real coding work, at its prices, invisibly. The transcript does record the serving model on every assistant message, so the renderer compares the newest against the session's first and adds "gpt-5.6-luna (FALLBACK, not deepseek-v4-flash-0731)" in red only on a mismatch. Silent in the normal case (a session that never switched already has its model named by the model segment, so a second copy would be noise) and it clears itself, because OpenRouter re-evaluates routing per request and the warning drops once routing reverts. Deliberately reads no environment variables: a statusline subprocess is not guaranteed to inherit the session environment, and depending on that would fail silently on exactly the gateway setups this exists for, so the session's own first turn is the baseline. Reads stay bounded because transcripts reach 100MB+ and this runs on every refresh - the head read grows 64K to 4M only until a model turns up (one assistant message can exceed the window, and a window landing mid-line parses to nothing - a real bug the seek-boundary test caught before release), tail fixed at 256K, measured about 3ms on a real 103MB transcript. stdlib only, never raises, absence drops the segment. 9 new tests plus a doctest, including a perf assertion that turns red if the bounded reads regress. |
| 0.88.0 | feat(commands): /goal briefs are file-backed and verbose by default. The /whats-next, /goal-maker, and /bhag forges no longer trim a brief to squeeze under /goal's 4,000-character condition cap. The full brief - complete context, every milestone with its observable acceptance signal, per-milestone implementation notes and edge cases, the full Approach, the complete Verify checklist with exact commands and expected outputs, DONE conditions, and next phases - is written to a gitignored file at .claude/goals/<date>-<slug>.md with no size budget, and /goal receives only a short self-bootstrapping pointer (still measured with wc -c). On turn one the pointer makes the run paste the milestone list, Verify checklist, AND DONE conditions into the transcript verbatim, so the file-blind /goal judge has concrete criteria to check; /bhag gets its own pointer variant that pastes the Loop steps, STOP/BLOCKED rules, and DONE conditions while the .bhag/ ledger stays the source of truth. Rationale: trimming to fit cost exactly the detail an autonomous overnight run needs. Content tests re-pinned so a regression back to trim-to-fit turns red. Also fix(logo-forge): the flux_2 generate path uses --variant (the Higgsfield CLI renamed --model). |
| 0.87.0 | feat(statusline): a live Claude Code statusline on every session, installed and managed by jacked (on by default). One line at the bottom of each session: model and reasoning effort (plus a fast-mode badge), context-window pressure with real token counts ("ctx 63% (633k/1.0M)"), both rate-limit windows with their reset times ("5h 7%->14:00 |
| 0.86.0 | feat(lockdown): /lockdown closes three supply-chain blind spots. The audit now detects unpinned git-source dependencies across ecosystems (pip/uv VCS requirements, npm-family git+ and shorthand specs, Dockerfile clones) and flags any mutable ref (branch, tag, or no ref) where a full commit SHA belongs; it resolves the transitive dependency closure from lockfiles and probes each name against its public registry to catch phantom or squatted packages, with a two-proof provenance rule (a package clears suspicion only with two independent signals, for example a repo tag AND a matching registry publisher) plus a self-name squat check on the repo's own package name; and it verifies build-time remote asset fetches (curl/wget in Dockerfiles, CI, and install scripts) carry checksum enforcement. Salvaged from PR #22 onto the current command structure. Also chore(deps): refreshed the CI action pins to current releases (checkout v7.0.1, setup-python v7.0.0, upload-artifact v7.0.1, download-artifact v8.0.1, harden-runner v2.20.0), every SHA resolved from the upstream repo's own tag refs, with the tests workflow proving the pins by running on them; widened packaging to <27 and the pyobjc frameworks to <13 with a real uv.lock relock (packaging 26.2, pyobjc 12.1); and capped dev ruff at <0.16 so a future relock cannot silently adopt ruff 0.16's broadened default rule set (~1,250 new findings on this tree) outside a deliberate migration. This lands the work of 9 stale open PRs (8 Dependabot bumps and PR #22) that predated the current tree, evaluated and superseded rather than merged. |
| 0.85.0 | feat(oauth): add and re-authenticate accounts from a remote dashboard - manual code entry. The Add Account, Re-auth, and CC-token flows only worked on the machine that runs jacked: the server opened its own browser and listened on its own localhost for the OAuth callback, so a dashboard opened from another machine (for example over Tailscale) spun on "a browser window should open" until timeout. Flows started from a non-loopback client (or with ?remote=true) now run in manual mode: no server-side browser, the redirect targets Anthropic's registered code page (platform.claude.com/oauth/code/callback), and the banner shows an "Open the authorization page" link plus a paste box for the code Claude displays after approval. The paste parser accepts code#state, a bare code, or a full callback URL; state is validated when present; PKCE makes a code from any other flow unexchangeable; submissions lock out after 10 attempts; manual flows get a 10-minute window (browser flows keep 2). New POST /api/auth/flow/{id}/code endpoint, and flow status now carries auth_url, mode, submit_error, plus the previously stripped organization_name and redirected_from_account_id (the "you authorized a different org" notice can now actually render). The three duplicated dashboard pollers collapsed into one engine, every banner (local included) carries the link and paste fallback, and an in-flight banner now survives the session-event re-render that used to destroy it mid-flow: the live nodes move across the re-render with the typed code intact, and success messages render after the account refresh instead of being wiped by it. Also fix(cli): jacked claude accepts a unique part of an account email (jacked claude udifi), scoped to Claude accounts so a same-email Codex account never collides (a Codex-only match points at jacked codex launch), and every account-not-found error lists the launchable accounts with a note that the number is the account ID (IDs keep holes after deletions), not the row position. 50 new tests. |
| 0.84.0 | feat(skills): night-shift - the autonomous multi-brain product loop (skill count 26 -> 27). One front door for daily or overnight autonomous product work: $night-shift [steer] [auto-merge] alternates PATROL (a rotating brain roster - user personas, designer, security, compliance, SRE, DX, product - researches best-in-class and walks the product in a browser, filing findings deduped against a ledger) with BUILD (done-contract, implement, then a dispatched fresh-context skeptical evaluator that re-runs tests and drives the UI itself - the implementer never grades its own work - then evidence-gated serialized landing and a compound learning pass). Merge posture is per request: one consolidated PR by default; per-item auto-merge to main only behind a two-gate production guard (evidence-based maturity plus a fresh verbatim human "yes" at run start, never overridable from inside a run, never inherited on resume - a resumed session re-runs the gates before mutating anything). State is crash-proof by construction (.night-shift/: a HOOK.md resume pointer carrying authorization state, a filename-status queue, findings ledger, durable restore points, kept evidence, and a morning report), so killed sessions resume instead of restarting. The loop is usage-aware: it reads the new jacked usage --json pacing summary at iteration boundaries and pauses until the fleet's earliest genuine reset instead of dying mid-night - staleness-correct effective percents (a cached percent is stale headroom only when it PREDATES a reset that has since passed), eligibility filtering (disabled or revoked accounts never report headroom), per-account workability for pause_until (the latest constrained reset per account, min across accounts - one window resetting while the account's other window is still walled never wakes the loop early), and a signed cache age so clock skew reads as no-data rather than fresh. Account rows in the JSON are field-allowlisted so token material can never reach stdout. The recursive-10-10-product-hardening skill picked up five upgrades from the same research pass (restore point, generator/evaluator split, anti-compression clause, binary LLM-as-judge backpressure, failure-fingerprint over-testing). The review also hardened the installers against user-data loss: a skill install that fails halfway can no longer record YOUR dir as jacked-owned (a later uninstall would have deleted it - reproduced end-to-end, now regression-tested from the worst case); a Finder .DS_Store inside jacked's own Codex skill dirs no longer triggers a spurious "preserved your existing skill" backup on every install (comparisons tolerate OS droppings, recorded hashes stay strict so existing manifests keep validating); and uninstall unlinks a symlinked skill dir instead of aborting the whole uninstall on it, skipping one unremovable skill instead of dying. Also fix(memory): vault commits disable git auto-maintenance and retry once, so rapid note writes (rollup, migrate) can no longer die on a background git gc ref race ("could not parse HEAD"). Ships with ~90 new tests including mutation-verified pins on the staleness rule. |
| 0.83.0 | feat(memory): Memory Vault - cross-repo, event-triggered memory in a git-backed Markdown vault (opt in). Claude forgets between sessions and learns nothing across repos; Memory Vault fixes both. A new jacked memory init|status|add|search|rollup|migrate CLI group manages a self-contained git vault at ~/jacked-vault: typed Markdown notes (decision/convention/vision/reference/progress) carrying [[wikilinks]] and a vault.json repo-to-group mapping, Obsidian-compatible as a viewer but with no database, no embeddings, and no MCP server (recall is grep plus a budgeted index; native Claude Code auto-memory is left untouched). Capture is event-driven and quiet: a SessionEnd hook runs one local claude -p triage over the transcript and writes an episodic entry every time but a durable semantic note only when it finds a real decision or accomplishment (most sessions write nothing lasting), a PreCompact hook captures handovers, and a post-merge git hook on main/master distills each landed branch (branch, PR title and body, changed files) into a candidate note. Recall is a SessionStart hook that injects a group-scoped brief hard-capped at 1,500 tokens (current progress slice + index excerpt + top-linked decisions + last episodic entry for the cwd's repo), ending with an explicit pointer to the paths worth reading. Housekeeping ships as a deterministic jacked memory rollup (today -> recent -> archive) plus a memory-librarian skill that dedupes, reconciles contradictions newest-wins-with-a-trail, archives stale entries, validates frontmatter, and re-syncs the index. jacked memory migrate imports existing .remember/ history into the vault, flags core memories as semantic candidates, and VERIFIES imported file/entry counts against the source (failing loud on mismatch); it never modifies or deletes the source dirs, and retiring the third-party remember plugin happens only after migration verifies AND you confirm a printed summary. Every hook fails open (exit 0 on any error) so memory never blocks a session, all processing is local (transcripts never leave the machine), and multi-machine sync is git pull --ff-only only (never reset --hard). Enable from the dashboard (Settings > Features > Memory Vault) or jacked memory init; disabling removes the hooks and leaves the vault intact. Ships with roughly 210 new tests covering mapping resolution, triage handling, rollup, migration count-verification, recall budget, and hook fail-open paths. Also fix(codex): Codex app-server now sends weekly-only rate-limit payloads (one primary window with windowDurationMins: 10080, secondary: null); the old positional mapping filed the weekly percent under the 5h column and froze a dead 100% in the 7d column, which the dashboard displayed and auto-swap read as "exhausted". Windows now classify by duration, a cache column clears only when an authoritative payload stops reporting that window (partial or unrecognized reads preserve last-known-good and log a WARNING), the usage poll re-verifies the live account identity inside the swap lock so an account swap can never write another account's numbers, and the fetch log line states each window's value or clear. 21 new tests including a live-captured weekly-only payload fixture. |
| 0.82.0 | feat(packs): curated third-party skill packs, installed by default and pulled live from upstream (never vendored). A plain jacked install now also installs skill packs, named bundles of skills that live in third-party GitHub repos, orchestrated through the vercel-labs skills CLI (npx skills; Node 18+, skipped with a note if Node is absent so the rest of the install is unaffected). Two packs ship default-on (jacked/data/packs.json): marketing (28 of the 47 skills in coreyhaines31/marketingskills: paid ads, AI SEO, pricing, prospecting, cold email, PR, RevOps, and more) and design-extras (improve-animations from emilkowalski/skills). jacked never vendors the content, it records only which packs you enabled and every jacked install refreshes them from upstream. Opt out per-run with jacked install --no-packs, or durably with jacked packs disable NAME; a new jacked packs list/enable/disable/update group and a dashboard toggle (Settings > Features > Skill Packs) manage the rest. Enable-state is a durable three-state model (~/.claude/jacked-packs.json: enabled / disabled / unset-so-the-registry-default-decides), so a default-on pack you turn off stays off across future installs instead of silently reinstalling. Safety is the whole design of jacked/packs.py: the skills CLI exits 0 even when it installs nothing (an upstream skill renamed or removed), so exit codes are never trusted, every install/remove is VERIFIED against the filesystem and any drift is surfaced loudly; a ~/.claude/skills/<name> you already own is never clobbered, and removal is source-checked against the CLI lockfile so a same-named skill you installed from another repo is never touched; the CLI is pinned to skills@1.5.17 (its on-disk layout, lockfile schema, and argv flags re-verified on any bump) and run with cwd and $HOME pinned to your home so a spoofed node_modules/skills in an untrusted checkout cannot hijack it; every registry value is regex-validated before it can reach the subprocess argv. Skills install into Codex too when it is present. The dashboard route (/api/packs, jacked/api/routes/packs.py) rides the same Host / CSRF / DNS-rebinding guard as every other state-changing request. Also fixed: a claude-code-only install layout (a real ~/.claude/skills/<name>/ with no ~/.agents canonical, which a normal jacked install produces) was read as "missing" and reinstalled on every run; the on-disk check now resolves both layouts. |
| 0.81.0 | feat(dashboard): Remote access (Tailscale) toggle in the GUI, with the settings DB as the authoritative bind host. Settings > Advanced gains a Remote access card: a master toggle plus a scope picker (Tailscale only, the recommended default binding loopback + this machine's 100.x address, vs All interfaces / 0.0.0.0 behind a mandatory "I understand" acknowledgement). Flipping it persists to ~/.claude/jacked.db and applies via an immediate self-restart; the card's status line shows the addresses the server is actually listening on, so it can't lie. No more remembering jacked service restart --host 0.0.0.0. The bind is now DB-authoritative and re-resolved on every service start (jacked/service/bind.py: precedence explicit CLI --host > DB > loopback; pre-bound sockets handed to uvicorn's multi-socket serve; Tailscale IP detected via a UDP route trick with a tailscale ip -4 fallback, degrading to loopback-only with a logged reason when the tailnet is down, never silently widening). This fixes two long-standing bugs: jacked install --force (which every upgrade runs) no longer silently reverts a 0.0.0.0 bind, because autostart artifacts (launchd plist / Windows VBS) stop baking --host and a data-preserving migration copies any old baked host into the DB before regenerating host-free (never clobbering a GUI choice); and service restart --host X is no longer a no-op on macOS. New jacked/api/routes/settings_remote.py (GET/PUT + a restart endpoint, keys protected from the generic settings PUT) and a jacked/service/restart.py seam that lets the API restart in-process (tray, same PID) or via execv (webux). The server-side trust model (jacked/api/security.py: no CORS wildcard, WebSocket + CSRF origin checks, DNS-rebinding Host guard) is unchanged and enforces identically on every bind. README's Remote Access section rewritten GUI-first. |
| 0.80.0 | feat(codex): true Claude/Codex install parity, plus the viral website-cloner skill (skill count 24 -> 25). jacked install now deploys into Codex's native formats instead of shoving Claude artifacts at it: skills land in ~/.agents/skills; every non-excluded command ships as a command-derived skill there too (OpenAI deprecated the ~/.codex/prompts surface on 2026-01-22, so the prompt copy stays only for back-compat); the behavioral rules are rewritten for Codex (CLAUDE.md references become AGENTS.md) and gain a runtime-adapter section that maps Claude vocabulary to Codex equivalents (Task tool to native subagents, model lanes ignored, $name skill invocation, MCP tool names); the 10 review agents become Codex custom-agent TOMLs in ~/.codex/agents; the chrome-devtools MCP server is registered in ~/.codex/config.toml; and the QA-suggest hook installs into Codex hooks.json (with the one-time /hooks trust step surfaced). Claude-only artifacts are held back (the chain-of-command and recover skills, and the swarm, goal-maker, browser-reset, jacked-setup commands), and everything is tracked in ~/.codex/jacked-codex-manifest.json so jacked uninstall reverses exactly what jacked wrote and never a user's own entry. The installer is hardened against user-data loss: a colliding ~/.agents/skills dir you own is preserved as <name>.pre-jacked (never clobbered), a malformed hooks.json is left byte-identical rather than reset, every managed config write is atomic, and all text IO is UTF-8-pinned (no more Windows/C-locale crash on the emoji-bearing agent files). New: the clone-website skill, vendored with credit from JCodesMore's ai-website-cloner-template (MIT, 27k stars): reverse-engineers a site into a modern Next.js codebase, with two jacked additions over upstream, an authorization gate (ownership/permission confirmation, robots.txt check, refusal of impersonation-shaped requests) and scaffold independence (it bootstraps or targets your existing frontend instead of assuming a template). Also new: a tests.yml CI workflow that runs pytest on every pull request. |
| 0.79.0 | feat(skills): Emil Kowalski's design-engineering skills bundled in (skill count 20 -> 24), plus the README's first honest overhaul since 0.3.x. Four skills adopted as-is (MIT, credited, license shipped per skill dir) from emilkowalski/skills: emil-design-eng (UI polish + animation craft: easing choice, duration budgets, springs, clip-path, GPU-only properties, reduced-motion), review-animations (strict motion review against ten non-negotiable standards, with a STANDARDS.md value catalog so findings cite exact curves/durations), animation-vocabulary (reverse-lookup glossary that names the effect you can only describe), and apple-design (Apple's fluid-interfaces, materials, and typography principles translated for the web). Wired in, not just dropped in: /dcr's Frontend Design reviewer now invokes review-animations whenever a diff touches motion code, and jacked behaviors carry trigger lines for all four (emil-design-eng before writing motion code, apple-design for gesture-driven work). The behaviors file also stops suggesting /freeze, a command removed with the gatekeeper in 0.70.0. And the docs finally show the product: every README screenshot regenerated at current UI from a seeded demo fleet (the old hero showed a v0.3.11 sidebar), a hero that leads with the menu-bar app (pill, one-click fleet dropdown, pinned side panel, per-model bars, update badge + banners), a grouped table of all 24 skills, 0.77.0/0.78.0 history entries, and an accuracy sweep: the false "30 commands" claim, Settings tab list (+ Appearance), env-var table (+ JACKED_ALLOWED_ORIGINS/JACKED_ALLOWED_HOSTS/JACKED_HOME), API endpoint list, and hook docs (chain_of_command_context + UserPromptSubmit). |
| 0.78.0 | feat(theme): America 250 usage colors (red, white, and blue) with a Classic toggle. For the semiquincentennial the new default theme repaints the usage bars patriotic: healthy=blue, warning=white, critical=red (red stays bad, so nobody relearns that instinct on the 4th). The sidebar gains an inline-SVG flag (not the flag emoji, which Windows renders as the bare letters "US"), a "1776 - 2026 - 250 YEARS" badge, and a tricolor accent stripe. Settings > Appearance holds the toggle (America 250 or Classic), saved per-device in localStorage and applied before first paint in both the dashboard and the compact panel so there's no flash of the wrong scheme. The semantic color classes (green/yellow/red) stay load-bearing across menubar_summary.py and the API; only the presentation shifts. The white warning bar would have swallowed the white elapsed-time marker, so the theme darkens and rings it. Also shipped: fix(update-ux): a self-healing file:// bootstrap for the tray update progress page. The tray used to open http://127.0.0.1:8321/update.html and then immediately kill the server, so the browser's first GET landed on a corpse and the user stared at "site can't be reached" (Windows made it worse by opening a second guaranteed-dead tab from the updater batch). Now the tray writes a self-contained bootstrap page to ~/.claude and opens it as file://, a page that physically cannot fail to load: it pings /api/version (no-cors, so it pokes no holes in the origin allowlist), shows an honest amber "service is restarting" banner while the server is down, and hosts the real update.html in an iframe it force-reloads on every down-to-up transition, falling back to the old direct URL if the template is missing. update.html now actually renders the service-down state it was already tracking and ignoring, posts its status to the parent frame, and targets _top on its dashboard links so they escape the iframe; the batch opens nothing. |
| 0.77.0 | fix(windows): tray update stops deadlocking on its own lock file, plus a cross-platform update badge. Every Windows tray update was a coin flip between nothing happening and the tray dying. The tray pre-inits the update-status file so the progress page has data from t=0, then spawns the cmd.exe updater batch whose first move is jacked _update_status_init, which saw the tray's own ~2-second-old in_progress file, cried LockBusy, and exited 2, aborting the batch before it upgraded OR restarted the service. The POSIX updater had an adopt-the-pre-init carve-out from day one; the Windows shim never got the memo. The logic is now hoisted into update_status.init_or_adopt_status() with both paths pointed at it so they can't drift apart again. Second fix: Windows and Linux now get the same white-ring + blue-dot update badge macOS already drew on the tray icon (create_icon_image() renders it and the version-check paths re-render when outdated flips), instead of a hint buried in right-click menu text you'd never see. Bonus: read_status() now treats a >5min-stale in_progress file as abandoned (matching the rule init_status already used), so an aborted updater can no longer leave a zombie "updating..." banner on the dashboard forever. |
| 0.76.0 | feat(dashboard): safe remote access over Tailscale - network-bind hardening. Binding beyond loopback (--host 0.0.0.0) no longer flips CORS to *, which had let any website open in a browser on a network-allowed machine read and mutate the (unauthenticated) API. The frontend is same-origin by construction, so cross-origin allowance is now loopback-only plus an explicit JACKED_ALLOWED_ORIGINS opt-in. New jacked/api/security.py: pure-ASGI HostValidationMiddleware rejects untrusted Host headers on HTTP and WebSocket handshakes (DNS-rebinding guard; IP literals, single-label MagicDNS names, *.ts.net, *.local, localhost, and JACKED_ALLOWED_HOSTS extras pass) and 403s unsafe-method requests carrying a foreign Origin (blind CSRF via non-preflighted form posts). The /api/ws gate, previously disabled entirely on a network bind, now enforces same-origin-with-Host or allowlist on every handshake. README gains a "Remote Access (Tailscale)" section: bind commands, ACL example, env knobs, and the tailscale serve alternative. Also: a shipped writing-style behavior - never em-dashes in public/user-facing content (UI copy, marketing, legal docs, end-user docs); internal code/docs exempt. And: chain-of-command auto-load - jacked install now registers a synchronous SessionStart hook (jacked _hook chain_of_command_context) that injects the chain-of-command dispatch policy into every new Claude Code session's context, so the model split (best-tier judgment, Opus volume work, cheap-tier pure search) is binding from the first turn without typing /chain-of-command. Toggle off by disabling the chain-of-command skill in the dashboard (the hook goes silent when the skill file is absent); jacked uninstall removes the hook entry. |
| 0.75.0 | feat(skills): research-hardened dispatch policy + Sonnet 5 intro pricing. Community/primary-source sweep (July 2026) surfaced three things worth shipping. (1) Sonnet 5 introductory pricing: the analytics cost map now charges Sonnet 5 at its real $2/$10 intro rate through 2026-08-31 (then $3/$15 automatically, keyed on each message's timestamp) - it was overcounting Sonnet 5 by 50%; Sonnet 4.x and the undated sonnet alias stay at standard rates. (2) Defensive security framing: Fable 5 returned (2026-07-01) behind safety classifiers that can block security-flavored prompts and silently fall back to Opus 4.8 - /dcr's Security lens now prepends a defensive-scope preamble to its reviewer prompt (own authorized codebase, no exploit chains, remediation + regression test per finding), /cso states the same scope up front, and the policy is explicit: accept an Opus fallback, never rephrase to evade a classifier. (3) Final senior review: jack-it-up Phase 7 now has the main loop do one holistic senior-engineer diff review (must-fix / should-fix / ship-no-ship) before /pr - the last line before human review. Plus an effort lane: Workflow agent() stages carry effort matched to the lane (volume 'medium', locate/sweep 'low', hardest verify/judge 'high'+). And version-proofing: skill/command text now speaks in model tiers ("any session model above Opus"), never versioned names that rot on every release, and the pricing map infers the tier from the family name for model IDs it hasn't caught up with (a future fable-6 prices as Fable tier, not a silent 2x-undercounting Opus fallback). |
| 0.74.1 | fix(skills): the search lane actually uses the cheap tier. The pure-search carve-out was permissive ("may use a lesser model"), so in practice every grep fan-out, call-site inventory, and convention sweep still landed on Opus - and chain-of-command's Opus lane even listed "searching/exploring" outright. Now pure locate/sweep dispatches carry explicit model: "haiku" (mechanical sweeps executing patterns the main loop wrote - the deterministic tools carry the recall) or model: "sonnet" (bulk read-and-filter where a miss costs a few extra reads), gated by two tests that must BOTH pass: output is pointers/excerpts with zero interpretation, and the consumer reads what comes back so a miss is recoverable. Load-bearing completeness claims ("these are ALL the call sites") get their exact patterns written by the main loop or go to Opus; semantic hunts ("find where we handle X") are comprehension and never leave the Opus lane. Applies on every session tier, wired through chain-of-command, jack-it-up (new Search dispatches lane), and /swarm teammate rules. |
| 0.74.0 | feat(skills): tiered dispatch - Fable judges, Opus swarms; new chain-of-command skill. On a Fable-class session, jack-it-up and every spawn-heavy orchestrator were ~80% dispatched tokens all inheriting the session model, billing reviewer waves, implementers, pre-mortems, validators, and doc agents at the Mythos tier (2x Opus per token). New policy across /dcr, /dc, /ux, /docs-sync, /swarm, /swarm-research, and coverage-matrix: volume dispatches carry explicit model: "opus", and the 0.71.0 Mythos consolidation is unwound for those lanes (full 2-lens pairing, dedicated pre-mortem agent, /ux back to 4 agents, swarm bands and research tiers as written) - recursion redundancy comes back at half the per-token price. Two lanes stay on explicit model: "fable": the Security lens (own single-lens reviewer; Fable is materially better at real vulnerabilities in code we own) and visual-design judgment (dcr frontend reviewer, /ux Visual & Layout agent). The parent loop keeps all Fable-grade judgment: lens selection, finding adjudication, fixes, gate verdicts. jack-it-up gains a Model Economics section, a Phase-4 dispatch overlay, and a proactive /cso security cadence at the ship gate. Also new: the chain-of-command skill (/chain-of-command, formerly the personal model-split skill) locks the same dispatch policy into any session on demand; it is Claude-only and excluded from the Codex install pass. |
| 0.73.1 | fix(windows): tray update no longer crashes or silently kills the service. ASCII-safe install summary + console errors=replace; update status-tracking made non-fatal with logged batch output. |
| 0.73.0 | feat(commands): /blindspot unknown-unknowns discovery command. Pre-build discovery pass for vague or unfamiliar requests, plus auto-recommendation wiring in jacked behaviors. Command count 28 -> 29. |
| 0.72.0 | feat(dashboard): per-model usage caps on account cards. Fable/Sonnet/Spark per-model bars on the dashboard and tray panel. |
| 0.71.0 | feat(skills): model-adaptive fan-out - fewer, bigger agents on Fable-class sessions; Opus 4.8 review tuning. Every spawn-heavy orchestrator (/dcr, /dc, /ux, /docs-sync, /swarm, /swarm-research, coverage-matrix) now scales agent count to the session's model tier: on a Mythos-class session (Fable 5 or newer) reviewers carry 3-4 lenses each with the pre-mortem folded into a reviewer's prompt, /ux caps at 2 browser agents, /docs-sync batches 3-5 docs per agent, /swarm sizes teams to the bottom of each band, and /swarm-research calibrates one tier down (max 3 researchers) with verification + devil's advocacy merged into one pressure-test agent. Consolidation changes who does the checking, never what gets checked - on Opus and below the full fan-out applies as written. Also: /dcr finder prompts are coverage-first (uncertain findings ship with stated confidence instead of being self-filtered - Opus 4.8 follows conservative-reporting filters literally and silently drops real bugs; the file:line + concrete-trigger evidence requirement remains the gate), and the analytics pricing map now knows Opus 4.8/4.7, Sonnet 5, and Fable 5 (Fable rows previously fell through to Opus pricing and undercounted cost 2×). |
| 0.70.1 | fix(skills): stop forcing Opus - agents/commands inherit the session's best model (Fable-ready). Three shipped artifacts hard-forced a model tier, which silently downgraded work on a Fable 5 session: the double-check-reviewer agent pinned model: opus (with a note forbidding the fix), /cleanup pinned model: opus, and /swarm recommended Sonnet/Haiku for teammate tasks. Now: reviewers and commands run model: inherit (a Fable session reviews on Fable), the model note is floor-not-ceiling (never below Opus - if the session runs cheaper, spawn on the best available), and /swarm teammates default to the session model with cheap tiers allowed only for pure search/retrieval work. |
| 0.70.0 | BREAKING: the security gatekeeper and Qdrant session search are removed. jacked is now squarely what it's actually used as - a multi-account manager + skills suite. Gone: the LLM gatekeeper hook (superseded by Claude Code's native auto permission mode) with its dashboard tab, decision logs, analytics, security profiles, and the /freeze+/unfreeze commands it enforced; and Qdrant semantic session search (indexer/searcher/retriever, jacked search/backfill/retrieve/sessions/delete/cleardb/status/configure, the /jacked skill, the [search] extra). Migration is automatic and fail-safe: jacked install prunes the old gatekeeper PreToolUse/PermissionRequest entries and the session-indexing Stop hook from ~/.claude/settings.json (Claude and Codex both), and the jacked _hook shim now FAILS OPEN (exit 0) for retired hook names so a stale entry can never block tool calls between upgrading the package and running jacked install. Old [search]/[security]/[all] extras still resolve as empty aliases. The permission-rule audit survives as jacked permissions audit [--fix]; the analytics Gatekeeper tab became an Activity tab (agents / hook health / lessons). Your DB is untouched - legacy gatekeeper_decisions rows just stop being read. |
| 0.69.1 | fix(menubar): event-driven tray freshness - the pill and /panel dropdown update within ~1s of a dashboard usage refresh or account switch. Two staleness bugs stacked: the pill only re-polled every 30s, and the dropdown/side-panel WKWebViews suspend their JS timers while offscreen, freezing the panel's own 15s reload the moment it closed. Now a stdlib-only in-process change counter (jacked/usage_events.py) is bumped by every usage-cache write, Claude credential switch, and Codex swap; the mac agent watches it on a 1s timer (an int compare - no HTTP/DB) and on change refreshes the pill and nudges both /panel webviews via evaluateJavaScript (which runs even while detached). Webviews also reload on popover/panel show and on visibilitychange, with a load-sequence guard so a slow stale response can't overwrite a fresher render. The 30s poll remains as the heartbeat for cross-process writers (a separately-run webux). |
| 0.69.0 | /release ships the way each repo actually ships - no longer hardcoded to claude-jacked/PyPI. The engine was baked to one pipeline (version in jacked/__init__.py, gate uv build+twine+pytest, publish via GitHub-Release→PyPI, push master) - so on any other repo it read a nonexistent version and ran the wrong publish. Now it detects the shipping model (pypi / npm / npm-changesets / calver / cargo / go-module-tag / pr-to-main-deploy / github-release-only) from the manifests + what CI actually does, reads/bumps the real version source (or none, for CalVer / deploy-on-merge repos), gates on the repo's own build+test, then publishes/deploys the right way and verifies it landed (index-installable, or the deploy is green and the app URL is actually up). Critically it recognizes PR-to-main-deploy repos that have no package at all - the release is getting the change merged so CI deploys it, and it will never invent a PyPI/npm publish the repo doesn't do. A new ## Config Override block + /jacked-setup release target let a repo pin its model, gate, and publish mechanism; safety rails stop it dead when the publish target is ambiguous. |
| 0.68.0 | coverage-matrix + /whats-next are monorepo-aware. Both treated a repo as ONE product, so a monorepo's unrelated apps (marketing site + admin dashboard + API) got blended into a single persona×domain grid and the forged initiative spanned apps that share no lever. Now: coverage-matrix opens with a product-boundary check (detects pnpm-workspace.yaml, a workspaces field, turbo/nx/lerna, a Cargo [workspace], go.work, or apps/*/+packages/*/) and scores one product at a time - roles/domains discovered from that product's dir, not repo-wide; shared packages/* are treated as cross-cutting levers, not matrix rows. /whats-next scopes its coverage read + forged /goal brief to a single product in a monorepo, and its version detection no longer collapses to whichever manifest sorts first - it walks workspace members when the root is private/version-less, prefers the manifest whose name matches the product over a *-tests decoy, and recognizes .changeset//releases/ (changesets/CalVer). |
| 0.67.0 | Engines stop assuming they're claude-jacked itself: config-declared + HTML docs, and monorepo-aware browser QA. A fleet audit found the commands hardcoded a single-repo, docs/-only, one-dev-server shape. Fixes: (1) /docs-sync + /whats-next + /jacked-setup doc discovery now sweeps .html alongside .md (this project defaults docs to HTML) and probes specs/, guides/, rfcs/, adr/, planning/, product/ - not just docs//_wiki/ - so canonical docs kept in specs/ or an all-.html tree are no longer silently skipped; the ## Doc Inventory/## Planning Artifacts a config generates also seed the staleness sweep. (2) /qa + /ux are monorepo-aware: a new ## Dev Servers config block brings up all required servers before testing (a frontend pointed at a dead backend API was passing as "works"), per-app Component Paths, a broadened dev-server port scan (adds 1420/1421 Tauri, 4000, 4173, 4321, 6006, 8001…), and apps/*/-scoped blast-radius so a apps/web change doesn't fan out across every app. (3) A 3-pass README accuracy audit reconciled three inconsistent command counts (25/26 → 30) and rebuilt the list; fixed a dead jacked install --force --security flag (now --force; enable the gatekeeper from Settings), the pre-0.41.0 hook-config python /path form (→ "<path>/jacked" _hook … shims), a nonexistent /api/permissions/* route (→ /api/claude-settings/*), and stale [tray] install extras. |
| 0.66.0 | recursive-10-10-product-hardening skill ported in (from Codex). An autonomous product-hardening skill whose distinct move is a code-derived behavior-spec workbook: inventory every feature, write each one's expected behavior from the source (cited file:function), then loop test→fix→retest until every row is evidence-Verified. Thin glue over existing capabilities - delegates scoring to coverage-matrix, the persona×workflow crawl + measure.js to aesthetic-dogfood-audit, and the browser toolchain to /qa//ux - and carries their UI-isolation fail-closed gate verbatim (it writes fixes against a running app), the backstop philosophy (no success caps; halt only on a no-progress loop, an unsafe step, or an all-blocked worklist), and the evidence-over-assertion + test-integrity rules. Defaults the workbook to HTML (xlsx optional export) and never auto-merges - fixes land in the working tree and hand off to /pr (continuous matrix auto-merge stays /bhag's job). |
| 0.65.0 | Two launch/branding skills bundled in (launch-post, logo-forge). launch-post (skill) - turns the current repo into a high-performing X/Twitter launch: survey the work for the demoable "wow," draft the main tweet + threaded replies (link in the FIRST reply, never the main tweet), make mandatory media, get explicit human approval, then publish via a hand-rolled OAuth 1.0a poster (x_post.py) with chunked video upload. Hardened for distribution: the success URL is now derived from the authed account (no hardcoded handle), and x_post.py carries PEP 723 inline metadata so uv run provisions requests with no venv/pip. logo-forge (skill) - designs an ownable logo set (icon + full favicon set + apple-touch + Open Graph/Twitter social cards) via Higgsfield image models + ImageMagick and deploys it into a target repo (Next.js or static; worktree-safe branch+PR). og-card.sh now resolves a bold sans on macOS, Linux (DejaVu/Liberation/Noto or fontconfig), or Windows, and every script fails loud if ImageMagick is missing. Both need their own external setup (X API OAuth 1.0a creds for launch-post; the paid Higgsfield CLI for logo-forge's generated-art path). |
| 0.64.3 | fix(codex): usage stuck at 0% fixed; Codex vs. Claude made obvious in the account dropdown. |
| 0.64.2 | fix(menubar): restore macOS update notifications (osascript banners). |
| 0.64.1 | fix(menubar): macOS "Check for Updates" now gives visible feedback. |
| 0.64.0 | Codex as a first-class provider - dual-provider account model. Provider-aware accounts + crash-safe migration (M1), Codex credential read/identity (M2), add-a-Codex-account login/import (M3), usage via the Codex app-server JSON-RPC behind provider dispatch (M4), a Claude-vs-Codex indicator on every account card (M5), guardrailed account switching + per-account launch (M6), and installing jacked's skills/commands/rules/gatekeeper into Codex (M7). Plus /cso + /dcr hardening passes that closed Codex→Claude leaks (e.g. blocking jacked claude <codex_id> from launching Codex as Claude), provider colors that don't collide with usage semantics, an instant tray dropdown with the active account pinned, and per-window reset times shown inline. |
| 0.63.0 | feat(menubar): refresh all accounts (10-min loop + manual button), faster active-account poll, and an update badge. |
| 0.62.6 | feat(panel): show the active account's next-refresh countdown + the real poll interval. |
| 0.62.5 | feat(panel): in-panel ⋯ button opens the actions menu (right-click discoverability); corrected the active-poll-interval docstring. |
| 0.62.4 | fix(panel): denser, aligned dropdown for many accounts + data-freshness indicators. |
| 0.62.3 | fix(ui): call linked accounts "Claude account", not "Google account", in auth copy. |
| 0.62.2 | fix(menubar): restore the version line, click-to-update, Check for Updates, and Start on Login in the macOS menu-bar menu. |
| 0.62.1 | fix(menubar): track the ACTIVE account; colored "J" icon; left-click opens the dropdown. |
| 0.62.0 | macOS menu-bar app - live usage pill, /panel dropdown + pinned side panel. Plus /cleanup shipped into jacked (with stale-worktree removal), assigned Asana tasks blended into /whats-next's coverage-led recommendation, and a gatekeeper dedup fix (location-independent marker). |
| 0.61.1 | UI-driving skills: isolate-then-go-ruthless, behind a fail-closed isolation gate. The five skills that click through a real app (aesthetic-dogfood-audit, /qa, /ux, /qa-video, /demo-video) now (1) prefer an isolated environment in priority order - a PR/preview/ephemeral deploy → a full local stack (dev server + local DB with seed/fixture data) → a disposable staging → production only as a read-only last resort; (2) are told to be exhaustively aggressive ON an isolated env (exercise destructive paths, edge inputs, every button) precisely because nothing can reach real data or users (demo-video stays clean-staged); and (3) must PROVE isolation before any write - fail closed: verify the host is local / the exact preview URL (never the prod domain), the app's actual DATABASE_URL/DB env points at a local/throwaway store (nothing prod), and the server is the one you started - and when unsure, treat it as production and stay read-only. The aggression license is granted ONLY after isolation is positively confirmed. |
| 0.61.0 | Backstop philosophy fix + run-against-local safety + adversarial-verification fixes. (1) Autonomous runs now drive to TRUE completion - /whats-next, /goal-maker, and /bhag no longer forge briefs that halt after N merges / N turns / a time-cost cap; the only backstop is genuine stuck-detection (a no-progress loop, an unsafe step, or a fully-blocked worklist), and completed work never triggers a stop. Captured as a permanent rule in jacked_behaviors. (2) UI-driving skills run against a LOCAL instance, never prod - aesthetic-dogfood-audit, /qa, /ux, /qa-video, /demo-video now spin up the app locally with seed data (or go read-only on a deployed env) so clicking/saving/deleting can't mutate real data or hit real users. (3) /retry hardened - it now forbids substituting a weaker check for what failed and forbids declaring "done" while any dispatched unit is still failed. (4) A 50-reviewer adversarial pass verified every upgraded capability; fixed what it found - invalid gh pr checks --json conclusion, a wrong Postgres lock level, a bogus .claude.md filename, jacked-setup's fingerprint described-but-not-implemented, and more. |
| 0.60.0 | aesthetic-dogfood-audit rebuilt into a full end-to-end product evaluator + new /demo-video skill. aesthetic-dogfood-audit is no longer aesthetics-only - it now drives the app as EACH persona through EVERY workflow (login → core jobs → nitty-gritty) and judges both function and finish: a Functional/interaction lens (modals that actually open AND close, buttons that do their job, actions that update the view with no stale data), a Data-accuracy lens (totals that match their parts, counts that match the rows), a Discoverability lens (frequency-weighted effort/findability - not the debunked 3-click rule, per NN/G), explicit dark-mode dark-text contrast, and repo-callable auto-detection of app/personas/creds. New demo-video skill + /demo-video command: produces a polished, narrated feature-walkthrough video for docs/education from a committed narration script (Playwright recording, timed say/TTS voiceover, captions, ffmpeg mux with -shortest), distinct from /qa-video's bug evidence and regenerable when the UI changes. Plus verification-pass fixes across 16 capabilities ($CWD→$PWD, removed a false "Opus is the project standard" claim, dropped a non-shipped /verify route, corrected the Chrome DevTools MCP Node floor, fixed example arithmetic, and more). |
| 0.59.0 | Best-in-class upgrade pass across the entire command / skill / agent / lens suite. Researched all 50 shipped capabilities against the field (Claude Code ecosystem, other agentic-coding tools, domain best practice) via Firecrawl and baked in 284 cited improvements. Highlights: review commands (/dcr, /dc, /cso) gain a per-finding false-positive validation gate + evidence requirement + "do-NOT-flag" suppression list (plus /cso precedent rulings) - mirroring Anthropic's official /code-review & /security-review; /swarm rewritten off the defunct TeamCreate API to the current agent-teams model (preflight feature-flag check, plan-first gate, git-worktree isolation, self-contained spawn prompts); monitors (/canary, /benchmark) get consecutive-failure budgets + absolute thresholds + real trace/DevTools capture instead of single-sample alarms; the four review lenses gain WCAG 2.2 (correct 24×24 target size), RFC 9457, Postgres CONCURRENTLY/NOT VALID migration safety, and circuit-breaker/idempotency depth; readme-maintainer + wiki-documentation-architect genericized and made non-destructive with source-grounding/anti-fabrication rules; /bhag gains a durable on-disk progress ledger + test ratchet; /qa+aesthetic-dogfood-audit gain keyboard/axe a11y passes; /qa-video adds a Playwright trace path. Full cited research report in docs/superpowers/research/. |
| 0.58.0 | Three skills ported in from personal use. aesthetic-dogfood-audit (skill) - a measure-driven, design-director fit-and-finish pass that drives every route/persona/state in a browser and flags pixel-level defects via an in-page measure.js instrument (type-scale sprawl, spacing dupes, edge misalignment, WCAG contrast); disambiguated from /qa//ux. deploy-to-railway (skill) - an opinionated, gotcha-laden end-to-end Railway provisioning playbook (Postgres + services + bucket + shared env + GitHub auto-deploy + SSO), companion to the official railway:use-railway. qa-video (skill + /qa-video command) - records a playable video of a QA journey plus a video-synced narration: true-motion via Playwright MCP's native video + chapter markers when available, else a frame-stitched MP4 (ffmpeg) or zero-install animated GIF (ImageMagick), with up-front path selection and playback verification. |
| 0.49.1 | /whats-next now MEASURES the /goal brief instead of eyeballing it. A soft “target ≤3600” was still producing 4,100–4,400-char briefs that /goal rejects/truncates. Step 8 now writes the drafted brief to a scratch file and wc -c-checks it ≤3600 bytes (bytes ≥ chars, so that guarantees under the hard 4,000-char cap) before it can be emitted, trimming Why-now/Approach prose and re-measuring until it fits. The Next phases: line counts and is never dropped. |
| 0.49.0 | /whats-next /goal brief: char-safe + file-backed for big initiatives. Brief target lowered to ≤3600 chars (a buffer under /goal’s hard 4,000-char condition cap, so briefs stop spilling over). When even one phase’s brief won’t fit, it’s written to a gitignored .claude/goals/<date>-<slug>.md and replaced by a short, self-bootstrapping pointer-goal (/goal’s evaluator can’t read files, so Claude pastes the milestone+Verify list into the transcript first) - never truncated, never committed. Optional turn/time backstop for unattended runs, framed as a non-success halt. |
| 0.48.0 | /whats-next → decisive, coverage-matrix-led recommendation. /whats-next no longer returns a ranked menu - it weighs a coverage-matrix read (personas × contexts, capability and lived experience, toward 10/10) alongside plans/issues/TODOs/commits/lifecycle, then commits to ONE ambitious cross-cutting initiative and forges its /goal brief directly. Biased toward big combinatorial levers over nitpicky one-offs, with confidence calibration (thin signal → smaller high-certainty move), anti-fabrication guards on the inline read, and convergence sizing (XL initiatives forge the first shippable phase + Next phases:). /jacked-setup whats-next config switches ## Tier Weights → ## Strategic Emphasis. |
| 0.47.0 | /whats-next forges a ready-to-run /goal brief. After deciding the work, /whats-next emits a paste-ready, ≤4000-char brief you run as Claude Code's built-in /goal (a session-scoped Stop-hook completion condition) for autonomous, tested delivery - objective DONE condition, transcript-checkable verification, conditional browser-QA//cso gates, injection-safe refs, and destructive-action guardrails. |
| 0.41.25 | Per-account timeout: 60s → 10s. Happy-path usage fetch is 1-2s; prior 60s bound made a transient upstream hiccup look like 60s of "stuck" in the UI. 10s is plenty of slack for a slow Anthropic OAuth refresh (whose SLA is well under 30s); if something takes longer, waiting doesn't help - we give up, mark the account failed for this cycle, and retry on the next sweep. Applied to both the bulk refresh (_BULK_PER_ACCOUNT_TIMEOUT in api/routes/auth.py) and the sweep's internal fetch_usage wrap (api/usage_monitor.py). |
| 0.41.24 | Upgrade + restart hardening. Stops the whack-a-mole across 0.41.16-23. (1) New ensure_native_lifecycle() in jacked/service/platform.py calls install_autostart() in-process (no subprocess, no non-existent jacked install --tray flag) to auto-create the launchd plist when missing. jacked service restart + tray Update's starting_service phase use it to eliminate the "Port 8321 already in use" race for users who set up jacked via raw uv tool install without ever running jacked service install. Returns a state enum so callers skip launchctl kickstart when launchd just freshly loaded the plist via RunAtLoad (kickstart would race the boot). Also stops any ad-hoc service holding :8321 before loading the plist so RunAtLoad can bind cleanly. (2) Deleted dead pip branches from upgrade_command() and upgrade_command_label() - can_auto_upgrade() has refused pip since 0.41.19 so they were unreachable, but the old code (pre-0.41.19) crashed with No module named pip in uv venvs. Both now raise ValueError loudly if reached. run_update wraps the call in try/except ValueError + writes recovery instead of crashing the detached helper. _spawn_windows_tray_updater now gates on can_auto_upgrade() before calling upgrade_command (was the one path the CLI gate didn't cover). Deleted the now-unreferenced is_user_site_install(). (3) New jacked doctor command: reports version, install method, plist/unit presence, and service health via PID + HTTP probe (not just port-in-use - distinguishes healthy, crashed-mid-init, and foreign-process-squatting). Prints exact recovery commands for every detected issue. Gives stranded users a clear out without having to remember uv tool install --force. |
| 0.41.23 | Stuck-checking watchdog + sweep resilience. On 2026-04-19 user3@example.com stayed stuck showing "Checking usage…" in the dashboard for ~14 hours after the overnight bulk refresh hung. Root cause: validate_account() writes validation_status="checking" before the network call; if the owning coroutine is abandoned (server restart mid-call, asyncio cancellation, orphan task left behind by the 180s stale-lock force-reset), nothing ever resets the DB row - the 0.41.18 120s watchdog only clears the UI card display, not the DB. Fixes: (1) new jacked/web/database.py::reset_stuck_checking() with an atomic WHERE-guarded UPDATE (WHERE validation_status='checking' AND ...) that can't clobber a row a concurrent validator raced back to 'valid'; (2) new background task in lifespan runs every 60s, resets any row stuck in 'checking' for >120s; NULL updated_at is treated as "definitely stuck"; (3) bulk /accounts/refresh-all-usage wraps each fetch_usage in asyncio.wait_for(60s) and, on timeout, explicitly writes validation_status='unknown' at the same call site so the row doesn't sit at 'checking' waiting for the watchdog's tick; (4) stale-lock force-reset now calls orphan.cancel() (fire-and-forget - no await, keeping the code Python 3.10 compatible without 3.11's Task.cancelling()); task-slot cleanup uses if _bulk_refresh_task is my_task so a late-finishing orphan's finally can't wipe a newer holder's slot; (5) validate_account success paths now clear last_error/last_error_at so a watchdog-reset row doesn't keep the stale "timed out" banner after it validates successfully; (6) full_sweep_loop emits Full-sweep heartbeat: iter=N at the TOP of every iteration (before any early-return shortcut, so it fires even with window_keeper_enabled=False, the default) and bounds its own internal fetch_usage in asyncio.wait_for(60s). |
| 0.41.22 | jacked service restart + tray Update now delegate to the native lifecycle manager. On macOS, stop && start was racing launchd's KeepAlive respawn - whoever bound :8321 first won, the loser logged "Port 8321 in use." This is the actual root cause of the "new service did not bind :8321" error users kept hitting on tray-update clicks. Fix: new jacked/service/platform.py::native_restart() uses launchctl kickstart -k gui/<uid>/ai.hank.jacked on macOS (atomic, no race) and systemctl --user restart jacked on Linux (for DIY'd systemd units). Windows has no supervising manager so the existing detached stop+start path stays. Both jacked service restart and the updater's starting_service phase now try native-restart first and fall back to manual stop+start only when no manager is installed. |
| 0.41.21 | Hotfix: macOS users' auto-updates were being refused as "editable". detect_install_method() called Path(sys.executable).resolve() which follows symlinks. uv-tool venvs on macOS symlink bin/python to the real Python binary (miniconda, pyenv, etc.), and after resolve the path no longer contains uv/tools/<pkg>/ - so the uv fingerprint failed, fell through the gate, and jacked upgrade + the tray Update button refused the install as "editable" (or "pip"). Fix: uv/pipx detection now uses sys.prefix (the venv root - immune to symlinks) in addition to the resolved exe path. Any one of the three candidates matching wins. |
| 0.41.20 | Post-ship fixes for 0.41.19. (1) Tray Update click writes a breadcrumb to ~/.claude/jacked-update.log + init_status before spawning, and a new FileHandler routes jacked logger output to ~/.claude/jacked-tray.log - eliminates the "tray dead, no diagnostics" failure where the detached child crashed before its first log line. (2) run_update early-returns (uv missing, jacked missing, mark_succeeded raises) now write overall: failed with explicit error + recovery so the UI shows the actual problem instead of a 120s stuck banner. (3) _update_status CLI shim exits 1 on ValueError; Windows batch guards every status write with if errorlevel 1. (4) Tray pre-warm + browser-open use literal 127.0.0.1 regardless of self.host (host=0.0.0.0 broke Linux clients). (5) New AST-based test enforces phase-name drift across POSIX updater + Windows batch + HTML. |
| 0.41.19 | Install-method safety + tray-update progress UI. jacked upgrade and the tray "Update" button now refuse editable (dev-clone) installs and pip installs, with a clear recovery message (git pull && uv sync or uv tool install "claude-jacked[tray]") - closes the silent No module named pip crash on dev machines. Tray "Update" click now opens a browser progress page at /update.html tracking each phase (waiting for parent, installing, migrating settings, freeing port, restarting, verifying) and detects completion via /api/version. Cross-platform. Windows batch emits all 6 phases + success terminal via new hidden jacked _update_status* CLI shims. Concurrent-writer lock, stale-succeeded auto-expiry, and server-reported mtime for stuck-detection (survives page reload). |
| 0.41.18 | Stuck "Checking usage…" self-recovers. Added a 120s client-side watchdog: when a card receives usage_refresh_progress status=checking (or the single-refresh button applies .usage-checking) but the matching done/failed event never arrives - because the WS client was pruned mid-bulk by 0.41.12's slow-client timeout, the tab was backgrounded, a network blip dropped the event, or the fetch itself hung - the card auto-returns to idle after 120s so the user can click refresh again. Watchdog re-arms on every checking event, clears on done/failed/WS-close, and fails silently with a console warn. |
| 0.41.17 | README: uv-only install instructions per OS. Rewrote "Installing from scratch" with explicit macOS / Linux / Windows steps - each includes the uv installer command, shell-reload, PATH verification, and OS-specific auto-start notes. Dropped the pip / pipx options from the docs (the upgrade code still supports them for anyone who used them pre-0.41.17, but uv is now the documented path). Corrected the Linux claim - we don't install systemd units; Linux users need to wire their own auto-start. |
| 0.41.16 | Install method auto-detection. jacked upgrade and the tray "Update" button now detect whether jacked was installed via uv tool install, pipx install, or pip install [--user] and call the matching upgrade command. Prior versions hardcoded uv tool install --force, which silently failed for pip/pipx users by either erroring out (uv not on PATH) or installing the package a second time in the wrong place. New detection logic lives in jacked/install_method.py and drives both the inline POSIX upgrade and the Windows cmd.exe batch helper. |
| 0.41.15 | Windows: tray-update click now actually works + Ctrl+C stops the service. (1) Tray-update on Windows was using a Python subprocess to drive uv tool install --force, but Windows can't replace python.exe while any process holds it open, so the update reliably failed. Now uses the same detached cmd.exe batch pattern as jacked upgrade - cmd.exe is a system binary we don't own, so it survives whatever uv does. (2) jacked service start in a console on Windows ignored Ctrl+C because pystray's native Win32 message pump blocks Python signal delivery. Installed a SetConsoleCtrlHandler via ctypes (delivered on a dedicated Windows thread) + SIGINT/SIGBREAK handlers so Ctrl+C, Ctrl+Break, and window-close all trigger a clean stop. |
| 0.41.14 | Windows: fixes process-sweeper crash spam. The session process-alive sweeper and the Claude-lock stale-holder check both called os.kill(pid, 0) unconditionally - but Windows Python doesn't treat signal 0 as an existence probe, so exited PIDs raised CPython SystemError: returned a result with an exception set (which isn't an OSError and slipped past the wrapper). Both paths now delegate to the cross-platform is_process_alive helper (ctypes OpenProcess + WaitForSingleObject on Windows) and fail-safe return True on unexpected errors so live user sessions aren't incorrectly closed. |
| 0.41.13 | Tray auto-update actually restarts the tray. Two fixes: (1) the updater now SIGKILLs the parent tray if pystray doesn't exit on icon.stop(), and SIGKILLs whatever is holding port 8321 if it stays bound after the graceful wait. (2) The updater verifies the new service actually bound :8321 before declaring success; if not, writes a recovery file. Also adds a "Last checked: Xm ago" / "Checking PyPI..." line to the tray menu, and disables "Check for updates..." while a check is running - so users with system notifications muted can still see the check happened. |
| 0.41.12 | Usage refresh no longer gets wedged behind a stuck "already in progress" 409. Root cause: ws.send_text in the progress broadcaster had no timeout, so a zombie Chrome tab with a backed-up WebSocket could block the broadcast loop - which held _bulk_refresh_lock forever. Fix: per-client 5s timeout, parallel sends via asyncio.gather, and a 180s stale-lock watchdog that force-resets the lock if some future holder hangs. |
| 0.41.11 | jacked service stop now uses the same graceful-with-SIGKILL-escalation path as restart + upgrade. Recovery from a wedged tray is one command: jacked service stop. |
| 0.41.10 | Upgrade actually stops the old tray - jacked upgrade and jacked service restart now call a new stop_process_graceful helper that waits for actual PID death and escalates to SIGKILL if the graceful signal is ignored. Fixes the bug where pystray's AppKit runloop on macOS silently swallowed SIGTERM, the upgrade's port-wait timed out, and the detached service start hit "port in use" leaving the user on the old binary. README troubleshooting now explains how to confirm the live tray version via curl http://127.0.0.1:8321/api/version. |
| 0.41.0 | Upgrade-safe hooks - jacked install now writes hooks as jacked _hook <name> instead of absolute site-packages paths. Survives uv tool upgrade and Python version bumps cleanly. Settings.json writes are atomic with timestamped backups at ~/.claude/settings.json.bak-*. Tray auto-update - tray menu flips to Update to vX.Y.Z -> when a newer version is on PyPI; one click runs uv tool install --force + jacked install --force + service restart in a detached helper that survives its own binary being replaced. Cross-platform. Recovery file - if auto-update fails, ~/.claude/jacked-update-failed.txt explains what to do, and the tray surfaces the warning on next startup. Windows process-liveness fix - replaces broken os.kill(pid, 0) with WaitForSingleObject via ctypes, so jacked service status works correctly on Windows. |
| 0.40.0 | jacked service command group - run jacked as a background service with a system tray icon. Purple "J" in the macOS menu bar / Windows tray, with a right-click menu for Open Dashboard, Restart, Stop, and Start on Login. jacked service install/uninstall configures auto-start on login via launchd plist (macOS) or a Startup folder VBS script (Windows). KeepAlive scoped to SuccessfulExit=false - service auto-restarts on crash but not on a clean user stop. Requires the new [tray] extra (uv tool install "claude-jacked[tray]") which pulls in pystray + Pillow. |
| 0.26.0 | /docs-sync - new skill that diffs branch against base, maps code changes to affected docs (README, wiki, CLAUDE.md), and spawns parallel update agents. New /jacked-setup docs-sync target for per-repo configuration with Doc Inventory and Change-to-Doc Map. |
| 0.25.0 | 8 new commands from GStack analysis: /freeze + /unfreeze (edit scope restriction enforced by gatekeeper), /cso (OWASP+STRIDE security audit), /retro (engineering retrospective), /canary (post-deploy monitoring), /benchmark (performance regression detection), /land-and-deploy (merge-deploy-verify pipeline), /browser-reset (fix stuck browser MCPs). Credential write fix - server no longer overwrites Claude Code's credential files during background token refresh, fixing session logout bug. |
| 0.24.0 | Plugin marketplace - repo doubles as a Claude Code plugin marketplace for team distribution. Zero file duplication. |
| 0.23.x | /swarm-research - divergent research skill (2-5 parallel agents from different angles, synthesis, devil's advocate). Observability & Data Integrity lenses added to DCR (11 lenses total). New wild cards, pre-mortem scenarios, and reviewer personas. |
| 0.22.0 | Chrome DevTools MCP integration for /qa and /ux browser testing. |
| 0.21.0 | One-click upgrade from the dashboard (upgrade + reinstall + restart). |
| 0.20.x | DCR plan-mode support - review plan docs while in plan mode. Dynamic skills dashboard. Simplicity & Reuse lens. |
| 0.19.x | /ux parallel browser testing - spawns 2-4 agents testing different UX aspects simultaneously. /jacked-setup standalone generation for /qa, /ux, /dcr, /whats-next. |
| 0.18.x | /dcr recursive review - parallel waves of focused reviewers with lens pairing, personas, wild cards, and pre-mortem analysis. |
| 0.17.x | /release workflow - bump version, push, CI, GitHub Release, PyPI publish. |
| 0.16.x | /swarm - coordinated parallel implementation across 3-8 agent teammates. |
| 0.15.x | /whats-next - roadmap advisor with lifecycle detection, tier-based prioritization. |
| 0.9.1 | Catch-all PreToolUse hook - intercepts all tools (file tools get path-safety checks, web/MCP tools get auto-approve with logging, Bash keeps full eval chain). Tool registry with per-tool enable/disable. Labeled deny patterns for clearer audit logs. /qa command + Stop hook for browser QA. oauthAccount seeding, plugin toggle fix. |
| 0.9.0 | Analytics dashboard with charts, heatmap, and drill-down. Security profiles - export, import, and backup gatekeeper configurations. Profile API endpoints + Settings UI panel. |
| 0.8.0 | Permissions panel - manage allowed commands with project-level vs global scope. "Always Allow" from log rows. Method filter on log viewer. |
| 0.7.5 | Workspace trust, per-account config directories. |
| 0.7.4 | Per-account launch isolation, credential helpers extraction. |
| 0.7.3 | Credential sync hardening, gatekeeper security audit. |
| 0.7.2 | Fix "Set Active" on macOS - Keychain write. |
| 0.7.1 | macOS Keychain credential support, gatekeeper settings tab, uv migration. |
| 0.7.0 | Multi-account credential sync, WebSocket dashboard, session dedup. |
| 0.6.0–0.6.1 | Per-row badges, background op auto-approve, mobile responsive dashboard, security hardening. |
| 0.5.0 | Guardrails framework, lessons dashboard viewer, hardlink installs, jacked check-version command. Security hardening (shell operator regex, tightened safe prefixes, session-tagged logs, LLM reason logging). |
| 0.4.0 | Web dashboard with 5-page local UI (Accounts, Installations, Settings, Logs, Analytics). Feature toggle API - enable/disable agents, commands, hooks, knowledge from the browser. Settings redesigned as tabbed interface. Account management with OAuth, usage monitoring, multi-account priority ordering. Gatekeeper log viewer with session filtering, search, export, purge. Analytics dashboard. Web deps (FastAPI, uvicorn) now included in base install. |
| 0.3.11 | Security hardening: shell operator detection, tightened safe prefixes, expanded deny patterns, file context prompt injection defense, path traversal prevention. Session ID tags in logs. LLM reason logging. 375 tests. |
| 0.3.10 | Fix format string explosion, qdrant test skip fix. |
| 0.3.9 | Permission safety audit, README catchup. |
| 0.3.8 | Log redaction, psql deny patterns, customizable LLM prompt. |
| 0.3.7 | JSON LLM responses, parse_llm_response(), 148 unit tests. |
Advanced / Technical Reference
CLI Command Reference
# Setup
jacked install --force # Install skills, agents, commands, rules, tray
jacked install --force --sounds # Also add sound notifications
jacked install --force --no-tray # Install without the tray icon
jacked install --no-statusline # Install without the Claude Code statusline
jacked statusline enable # Adopt jacked's statusline (saves any existing one)
jacked statusline disable # Remove it; restores a saved one
jacked uninstall # Remove from Claude Code
jacked uninstall --sounds # Remove only sounds
jacked uninstall --security # Remove a legacy gatekeeper hook (pre-0.70.0 installs)
jacked check-version # Check for newer version
# Permissions
jacked permissions audit # Audit permission rules for dangerous wildcards
jacked permissions audit --fix # Interactively prune dangerous wildcards
# Dashboard
jacked service status # Show the background dashboard URL
jacked webux # Run a foreground dashboard instead
jacked webux --port 9000 # Custom port
jacked webux --no-browser # Server only, no auto-open
# Background Service (tray icon ships by default)
jacked service install # Configure auto-start on login
jacked service start # Start service with tray icon
jacked service stop # Stop running service
jacked service restart # Restart service
jacked service status # Show evidence-qualified state, build, protocol, port, autostart
jacked service recover # Safely reconcile a provably owned native definition
# Slash Commands (29 total)
# /dc /dcr /docs-sync /pr /learn /blindspot /redo /retry /techdebt /audit-rules /cleanup
# /qa /qa-video /demo-video /ux /swarm /swarm-research /release
# /whats-next /goal-maker /bhag /jacked-setup
# /cso /lockdown /retro /canary /benchmark
# /land-and-deploy /browser-reset
Environment Variables
| Variable | Default | Description |
|---|---|---|
JACKED_ALLOWED_ORIGINS |
(unset) | Comma-separated extra origins (scheme://host[:port]) allowed cross-origin API/WebSocket access on a network bind (see Remote Access) |
JACKED_ALLOWED_HOSTS |
(unset) | Comma-separated extra hostnames accepted in the Host header (DNS-rebinding guard escape hatch) |
JACKED_HOME |
~ |
Redirects where jacked looks for the .claude home dir (used by tests and unusual setups) |
JACKED_HOST and JACKED_PORT are internal runtime state set after bind resolution, not supported native-service configuration inputs. Use the dashboard's Remote access setting, jacked service restart --host, or jacked webux --host/--port instead.
Web Dashboard Architecture
The dashboard is a local web application:
- Backend: FastAPI (Python) serving a REST API
- Database: SQLite at
~/.claude/jacked.db - Frontend: Vanilla JS + Tailwind CSS (no build step, no npm)
- Server: Uvicorn, normally at
localhost:8321;jacked service statusreports a quarantine port when needed
All data stays on your machine. The dashboard reads Claude Code's configuration files (~/.claude/settings.json, ~/.claude/agents/, etc.) and provides a visual interface for managing them.
API endpoints: /api/health, /api/version, /api/features, /api/settings/*, /api/auth/*, /api/analytics/*, /api/logs/*, /api/claude-settings/* (permissions), /api/installations, /api/menubar-summary, /api/update/status, /api/ws (live updates WebSocket), plus /panel (the compact usage page the menu-bar dropdown and side panel render)
All Agents
| Agent | Description |
|---|---|
double-check-reviewer |
CTO/CSO-level review for security, auth gaps, data leaks |
code-simplicity-reviewer |
Reviews for over-engineering and unnecessary complexity |
defensive-error-handler |
Audits error handling and adds defensive patterns |
git-pr-workflow-manager |
Manages branches, commits, and PR organization |
pr-workflow-checker |
Checks PR status and handles PR lifecycle |
issue-pr-coordinator |
Scans issues, groups related ones, manages PR workflows |
test-coverage-engineer |
Analyzes and improves test coverage |
test-coverage-improver |
Adds doctests and test files systematically |
readme-maintainer |
Keeps README in sync with code changes |
wiki-documentation-architect |
Creates/maintains GitHub Wiki documentation |
Hook Configuration
The jacked install command adds hooks to ~/.claude/settings.json, written as upgrade-safe jacked _hook <name> shims (the shim resolves the current handler internally, so the entry survives uv tool upgrade and Python version bumps):
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [{"type": "command", "command": "\"/path/to/jacked\" _hook qa_suggest", "async": true}]
}
]
}
}
jacked install also registers lightweight session-tracker hooks (UserPromptSubmit, Notification, SessionEnd, Stop) that keep the dashboard's account/session views live, plus exactly one SessionStart hook (jacked _hook session_start). Claude Code runs the SessionStart entries at the same time and joins their output in completion order. One entry therefore runs every session-start step in a fixed order: it records the session account, then injects the chain-of-command dispatch policy, then injects the memory-vault recall brief. The fixed order keeps the injected preamble identical in every session, which keeps the prompt cache warm. To turn the policy off, disable the chain-of-command skill in the dashboard. The install also prunes hooks from retired features (the pre-0.70.0 security gatekeeper and session-indexing entries) and from the older multi-entry SessionStart layout, so a stale entry can never block or error.
Guided Install Prompt (Full)
Copy this into Claude Code for a guided installation:
Install claude-jacked for me.
PHASE 1 - DIAGNOSTICS:
- Detect OS (Windows/Mac/Linux)
- Check: uv --version (if missing: curl -LsSf https://astral.sh/uv/install.sh | sh on Mac/Linux, powershell -c "irm https://astral.sh/uv/install.ps1 | iex" on Windows)
- Check: jacked --version (to see if already installed)
PHASE 2 - INSTALL:
- uv tool install claude-jacked && jacked install --force
PHASE 3 - POST-INSTALL:
- Confirm the running dashboard URL: jacked service status
- Open the reported URL in my browser
- Walk me through adding my Claude accounts from the Accounts page
PHASE 4 - VERIFY:
- jacked --help
- jacked service status (confirm the background dashboard is running)
Windows Troubleshooting
Claude Code uses Git Bash on Windows, which can cause path issues.
If "jacked" isn't found:
uv tool update-shell
# Then restart your terminal
If paths are getting mangled:
# Find the uv tools bin directory
uv tool dir
# Use the full path to jacked if needed
License
MIT
Credits
Built for Claude Code by Anthropic.
The design-engineering skills (emil-design-eng, review-animations, animation-vocabulary, apple-design) come from Emil Kowalski's emilkowalski/skills (MIT), distilled from his work at Vercel and Linear and his course at animations.dev. Bundled with credit and thanks; each skill directory carries his license.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file claude_jacked-0.99.1.tar.gz.
File metadata
- Download URL: claude_jacked-0.99.1.tar.gz
- Upload date:
- Size: 5.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3f3db3c985e0e426786c60a142d83b6dc916431fa4b87540d8879a72bb117ce
|
|
| MD5 |
95a7e838978242bbffc7ad35c111d438
|
|
| BLAKE2b-256 |
af69104277172c6fda28c13eb810c21fb61b869e896e5428fb2a9f04ae98faae
|
Provenance
The following attestation bundles were made for claude_jacked-0.99.1.tar.gz:
Publisher:
publish.yml on jackneil/claude-jacked
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claude_jacked-0.99.1.tar.gz -
Subject digest:
a3f3db3c985e0e426786c60a142d83b6dc916431fa4b87540d8879a72bb117ce - Sigstore transparency entry: 2707902510
- Sigstore integration time:
-
Permalink:
jackneil/claude-jacked@b99b41a47757dc67b6c1be1db8147f717a6465e8 -
Branch / Tag:
refs/tags/v0.99.1 - Owner: https://github.com/jackneil
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b99b41a47757dc67b6c1be1db8147f717a6465e8 -
Trigger Event:
release
-
Statement type:
File details
Details for the file claude_jacked-0.99.1-py3-none-any.whl.
File metadata
- Download URL: claude_jacked-0.99.1-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69620e7a45737dd0992b826e3cba114a054407a23d5626bbace0bf39b91ba565
|
|
| MD5 |
2a64e8b96ee7cad01bc6908ef4ff82d7
|
|
| BLAKE2b-256 |
23b486c04feb09837b7c2bdaa3a21db319d0552c1ac2f0a65c08bf72cbafddf4
|
Provenance
The following attestation bundles were made for claude_jacked-0.99.1-py3-none-any.whl:
Publisher:
publish.yml on jackneil/claude-jacked
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claude_jacked-0.99.1-py3-none-any.whl -
Subject digest:
69620e7a45737dd0992b826e3cba114a054407a23d5626bbace0bf39b91ba565 - Sigstore transparency entry: 2707902553
- Sigstore integration time:
-
Permalink:
jackneil/claude-jacked@b99b41a47757dc67b6c1be1db8147f717a6465e8 -
Branch / Tag:
refs/tags/v0.99.1 - Owner: https://github.com/jackneil
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b99b41a47757dc67b6c1be1db8147f717a6465e8 -
Trigger Event:
release
-
Statement type: