{"id":50561819,"url":"https://github.com/simtabi/claude-code-install-manager","last_synced_at":"2026-06-04T12:01:09.580Z","repository":{"id":358762944,"uuid":"1242974296","full_name":"simtabi/claude-code-install-manager","owner":"simtabi","description":"Install, update, repair, and diagnose Claude Code on Windows. Single-file batch script with optional signed PE launcher.","archived":false,"fork":false,"pushed_at":"2026-05-19T00:39:10.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T02:17:00.288Z","etag":null,"topics":["anthropic","batch-script","claude-code","cli","installer","oss","powershell","windows"],"latest_commit_sha":null,"homepage":"https://github.com/laranail/claude-code-install-manager","language":"Batchfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simtabi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-18T23:59:54.000Z","updated_at":"2026-05-19T00:39:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/simtabi/claude-code-install-manager","commit_stats":null,"previous_names":["laranail/claude-code-install-manager"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/simtabi/claude-code-install-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simtabi%2Fclaude-code-install-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simtabi%2Fclaude-code-install-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simtabi%2Fclaude-code-install-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simtabi%2Fclaude-code-install-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simtabi","download_url":"https://codeload.github.com/simtabi/claude-code-install-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simtabi%2Fclaude-code-install-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33903134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anthropic","batch-script","claude-code","cli","installer","oss","powershell","windows"],"created_at":"2026-06-04T12:01:08.527Z","updated_at":"2026-06-04T12:01:09.566Z","avatar_url":"https://github.com/simtabi.png","language":"Batchfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Claude Code Install Manager\n\nInstall, update, repair, and diagnose [Claude Code](https://claude.com/claude-code)\non Windows. Single-file batch script (`claude-code-install-manager.cmd`) plus\nan optional signed `.exe` launcher for SmartScreen-friendly distribution.\n\n## Why this exists\n\nWindows has no first-class package manager. The official Claude Code\ninstaller (`irm https://claude.ai/install.ps1 | iex`) drops a binary\ninto a per-user directory and appends that directory to your User\nPATH — and that's it. After that succeeds, the operating system\nitself has no record that anything was installed:\n\n- No entry in **Add or Remove Programs**.\n- No MSI receipt, no AppX manifest, no Windows Installer database row.\n- No canonical \"where is `claude`\" anyone can query.\n\nYou can install Claude Code, watch the installer say `Done`, and\nthen open a new cmd window where `claude` is \"not recognized as an\ninternal or external command\" — because the install location is\nrandom across versions, the PATH change does not propagate to\nalready-open sessions, and nothing in the OS even knows the install\nhappened. There is no built-in way to update, repair, uninstall,\nor diagnose.\n\nThat entire problem space is what this wrapper covers. On macOS,\nHomebrew handles it. On Linux, the distro package manager handles\nit. On Windows, you write a batch file.\n\nThis is that batch file.\n\n## What it does\n\n* `install`                Run the official installer and configure User PATH.\n* `update`                 Re-run the installer to fetch the latest version.\n* `uninstall`              Remove the install directory and clean User PATH.\n* `repair`                 Fix PATH for an existing install (no reinstall).\n* `repair-system`          Clean Claude leftovers under the SYSTEM profile (UAC-elevates).\n* `disable-desktop-alias`  Remove the Claude Desktop App execution alias that shadows the CLI.\n* `doctor`                 Diagnose install state, PATH, version, and conflicts.\n* `path`                   Show install directory, install kind, PATH state, and all detected install candidates.\n* `version`                Show wrapper and Claude Code versions.\n* `where`                  Show where the `claude` command resolves from.\n* `help`                   Print usage.\n\nAll write operations are idempotent. Running `install` twice does the right\nthing. Running `repair` when nothing is broken is a no-op.\n\n## Requirements\n\n* Windows 10 or 11 (cmd, PowerShell 5.1+).\n* Standard user account. Do not run as Administrator. Claude Code installs\n  per-user; running elevated tends to land it under the SYSTEM profile.\n* Network access to `https://claude.ai`.\n\n## Install\n\n1. Download `claude-code-install-manager.cmd` to a folder you can find again\n   (for example `C:\\Tools\\claude-code-install-manager\\`).\n2. Optional but convenient: add that folder to your User PATH so you can\n   run `claude-code-install-manager` from anywhere.\n3. Open a regular Command Prompt or PowerShell window.\n4. Run:\n\n       claude-code-install-manager install\n\nThe script will run the official installer, detect where `claude.exe` landed,\nadd that directory to your User PATH, broadcast the environment change so\nother applications notice, refresh PATH in the current shell, and verify the\nbinary runs.\n\n## Usage\n\n    claude-code-install-manager \u003csubcommand\u003e [flags]\n\n### Subcommands\n\n| Command                  | Purpose                                                          |\n|--------------------------|------------------------------------------------------------------|\n| `install`                | Install Claude Code (default if no subcommand given).            |\n| `update`                 | Update to the latest version. Falls back to `install` if absent. |\n| `uninstall`              | Remove the install directory and clean PATH entries.             |\n| `repair`                 | Fix PATH for an existing install without reinstalling.           |\n| `repair-system`          | Clean Claude leftovers under `C:\\Windows\\System32\\config\\systemprofile\\` from an accidental admin-elevated install. Re-launches itself elevated via UAC. |\n| `disable-desktop-alias`  | Remove `%LOCALAPPDATA%\\Microsoft\\WindowsApps\\Claude.exe` so the Claude Desktop App stops hijacking the `claude` command. Tries Remove-Item first; falls back to `takeown + icacls + del` if needed. |\n| `doctor`                 | Print a full diagnostic report.                                  |\n| `path`                   | Show install location, install kind, PATH state in User and Machine scopes, `where claude` resolution, Desktop App alias presence, and every detected install candidate. |\n| `version`                | Print wrapper version and `claude --version`.                    |\n| `where`                  | Show where `claude` resolves from.                               |\n| `help`                   | Show usage.                                                      |\n\nAliases: `upgrade` for `update`, `remove` for `uninstall`, `fix` for `repair`,\n`--repair-system-profile` for `repair-system`, `fix-alias` for\n`disable-desktop-alias`, `check` for `doctor`, `which` for `where`,\n`--help` and `-h` for `help`.\n\n### Flags\n\nFlags must appear after the subcommand.\n\n| Flag                 | Purpose                                                  |\n|----------------------|----------------------------------------------------------|\n| `--force`, `-f`      | Proceed despite warnings; reinstall if already present.  |\n| `--yes`, `-y`        | Auto-confirm prompts (admin warning, uninstall confirm). |\n| `--quiet`, `-q`      | Suppress informational output. Errors still print.       |\n| `--verbose`, `-v`    | Extra debug output.                                      |\n| `--download-only`    | Download installer to `%TEMP%`, show SHA256, do not run. |\n\n### Environment variables\n\n| Variable        | Effect                                                                  |\n|-----------------|-------------------------------------------------------------------------|\n| `CCT_NO_PAUSE`  | If set (any value), skip the \"Press any key to close\" pause on exit.   |\n| `CCT_NO_SPIN`   | If set (any value), suppress the spinner shown during long operations. |\n\n`--quiet` / `-q` also suppresses the spinner.\n\n### Progress display\n\nFor operations that take more than ~1 second and are otherwise silent\n— installer download, install-directory removal during `uninstall`,\nSYSTEM-profile cleanup during `repair-system` — the script renders a\nsingle-line spinner with the elapsed time, refreshing every 120 ms:\n\n    [|] Downloading installer from https://claude.ai/install.ps1  00:03\n\nWhen the operation finishes, the spinner line is replaced in place with\nan `OK` / `FAIL` line plus the total time:\n\n    [OK  ] Downloading installer from https://claude.ai/install.ps1  (00:07)\n\nOperations that already produce their own progress output (the upstream\nClaude Code installer's own stdout, for instance) are deliberately not\nwrapped in the spinner — that would buffer their output until the end.\nSet `CCT_NO_SPIN=1` for plain text-only output (useful in CI or in\nterminals that don't honor carriage-return-based overwrites).\n\n## Examples\n\nInstall fresh:\n\n    claude-code-install-manager install\n\nForce a clean reinstall:\n\n    claude-code-install-manager install --force\n\nUpdate to the latest version:\n\n    claude-code-install-manager update\n\nDiagnose why `claude` is not working:\n\n    claude-code-install-manager doctor\n\nFix PATH after a manual installer run that did not register correctly:\n\n    claude-code-install-manager repair\n\nUninstall without prompts:\n\n    claude-code-install-manager uninstall --yes\n\nInspect the installer script before running it:\n\n    claude-code-install-manager install --download-only\n\nThis prints the SHA256 hash and saved path. Open the `.ps1` file, review it,\nthen run it manually:\n\n    powershell -ExecutionPolicy Bypass -File \"%TEMP%\\claude-installer-XXXX.ps1\"\n\n## What the wrapper fixes\n\nThe following are real issues encountered using the bare installer:\n\n**`claude` not recognized after install.** The native installer writes to the\nUser PATH, but the current cmd or PowerShell session keeps its cached copy.\nThe wrapper refreshes PATH in the current session and broadcasts\n`WM_SETTINGCHANGE` so other listening processes (Explorer, new terminals)\npick up the change without a reboot.\n\n**Install location drift.** Four different paths can hold a working\n`claude` binary, depending on which installer ran:\n\n| Path                                                       | Source                          |\n|------------------------------------------------------------|---------------------------------|\n| `%USERPROFILE%\\.local\\bin\\claude.exe`                      | Current native installer        |\n| `%LOCALAPPDATA%\\Microsoft\\WinGet\\Links\\claude.exe`         | `winget install Anthropic.ClaudeCode` |\n| `%LOCALAPPDATA%\\Programs\\claude\\claude.exe` (and `bin\\`)   | Older native installer          |\n| `%APPDATA%\\npm\\claude.cmd`                                 | `npm install -g @anthropic-ai/claude-code` |\n\nThe wrapper checks all of them in that order and records which kind\nof install it found. There is no canonical \"where is `claude`\" you\ncan ask Windows; this list is the answer.\n\n**WinGet and native installer collide silently.** Running the\nnative installer when WinGet already installed Claude Code creates\ntwo complete copies, neither aware of the other, with PATH order\ndeciding which one `claude` runs. Upstream:\n[anthropics/claude-code#31980](https://github.com/anthropics/claude-code/issues/31980).\n`doctor` reports both, and `uninstall` refuses to delete a\nWinGet-managed copy (which would corrupt WinGet's package\ndatabase) and tells you to run `winget uninstall\nAnthropic.ClaudeCode` instead.\n\n**Claude Desktop App hijacks the `claude` command.** The desktop\napp installs a Windows App Execution Alias at\n`%LOCALAPPDATA%\\Microsoft\\WindowsApps\\Claude.exe`. WindowsApps\ntypically sits high on PATH, so `claude` from a terminal launches\nthe Electron desktop app instead of the CLI — silently, with no\nwarning. Upstream:\n[anthropics/claude-code#25075](https://github.com/anthropics/claude-code/issues/25075),\n[#24903](https://github.com/anthropics/claude-code/issues/24903).\n`doctor` reports the alias's presence; `install`, `update`, and\n`repair` warn when their verification step sees `claude` resolving\nto it. Disable in:  Settings → Apps → Advanced app settings → App\nexecution aliases.\n\n**Stale PATH entries after uninstall.** Removing the binary by hand leaves\ndead PATH entries. `uninstall` cleans them.\n\n**Lost `REG_EXPAND_SZ` on PATH.** Some tools write PATH back as `REG_SZ`,\nbreaking `%VAR%` expansion for other entries. The wrapper preserves the\noriginal registry value kind.\n\n**Silent admin-elevation footgun.** Running the installer as Administrator\nputs files under the SYSTEM profile, not yours. The wrapper warns before\nproceeding.\n\n**Console window closes before you can read it.** If you launch the\nscript by double-clicking it from Explorer, cmd opens, runs the script,\nand slams the window shut. Any error message vanishes with it. The\nwrapper detects double-click invocation (by inspecting `%cmdcmdline%`\nfor its own basename) and pauses with `Press any key to close...`\nbefore exiting. Running from an existing terminal — where output stays\non screen — does not pause, so automation is not blocked. Set\n`CCT_NO_PAUSE=1` to suppress the pause unconditionally.\n\n**No diagnostics.** When something is wrong, the bare installer offers no\nhelp. `doctor` reports:\n\n- OS, user, Windows version, PowerShell version.\n- Privilege level (admin or standard user).\n- Install location (which of the four paths, and its detected \"kind\").\n- Installed version.\n- PATH status in both User and Machine scopes.\n- Command resolution from the current session.\n- All conflicting installs (with the upstream issue reference).\n- Claude Desktop App execution-alias hijack check.\n- PowerShell execution policy across all scopes, with a flag if\n  `MachinePolicy` or `UserPolicy` is set by Group Policy (which\n  overrides `Set-ExecutionPolicy`).\n- Git Bash detection — `CLAUDE_CODE_GIT_BASH_PATH` value if set,\n  otherwise `where bash.exe`. Claude Code's Bash tool requires\n  Git Bash on Windows; the absence of either is a real failure\n  mode ([#3461](https://github.com/anthropics/claude-code/issues/3461),\n  [#25593](https://github.com/anthropics/claude-code/issues/25593)).\n- Config-directory presence.\n\n**Unhelpful error output.** Common failure paths now include a\nnext-step hint — PATH-write failures point at group policy and at\n`doctor`; a present-but-broken `claude.exe` suggests reinstall under\n`--force`; PATH-clean failures point at the manual System Properties\nfallback.\n\n## How PATH is handled\n\n### Lookup order\n\nWhen any subcommand needs to know \"where is `claude`\", the wrapper\nchecks five paths in this order and records the *kind* of install\nit found:\n\n1. `%USERPROFILE%\\.local\\bin\\claude.exe` — `native`\n2. `%LOCALAPPDATA%\\Microsoft\\WinGet\\Links\\claude.exe` — `winget`\n3. `%LOCALAPPDATA%\\Programs\\claude\\claude.exe` — `legacy-native`\n4. `%LOCALAPPDATA%\\Programs\\claude\\bin\\claude.exe` — `legacy-native`\n5. `%APPDATA%\\npm\\claude.cmd` — `npm`\n\nIf none match, the wrapper falls back to `where claude` — but with\n`%LOCALAPPDATA%\\Microsoft\\WindowsApps\\Claude.exe` explicitly\nfiltered out, since that path resolves to the Claude Desktop App's\nexecution alias, not the CLI.\n\n`claude-code-install-manager path` prints all five candidates (marking the\nactive one with `*`), the install kind, User and Machine PATH\nstate, what `where claude` currently resolves to, and a warning if\nthe Desktop App alias is present.\n\n### Adding to PATH\n\nThe wrapper writes directly to `HKCU\\Environment` via PowerShell,\npreserving the existing value kind (`REG_EXPAND_SZ` by default,\nfalling back to `REG_SZ` only if the original was `REG_SZ`). After\nthe registry write it broadcasts `WM_SETTINGCHANGE` with\n`lParam = \"Environment\"` to notify other running processes. Newly\nlaunched processes will see the change immediately; already-running\nones depend on whether they listen for the broadcast (most shells\ndo not, which is why VS Code or an existing cmd window must be\nrestarted).\n\nWhy not `setx`? `setx` truncates values at 1024 characters,\nsilently corrupting long PATHs. The wrapper avoids it for that\nreason.\n\n### Removing from PATH\n\n`uninstall` cleans these directories from the User PATH:\n\n- `%USERPROFILE%\\.local\\bin`\n- `%LOCALAPPDATA%\\Programs\\claude`\n- `%LOCALAPPDATA%\\Programs\\claude\\bin`\n\nThe WinGet `Links` directory is **not** cleaned, because it's\nshared by every WinGet-managed CLI on the system. The npm prefix\nis also not cleaned, for the same reason. If Claude Code was\ninstalled via either of those, `uninstall` refuses (for WinGet) or\nleaves the PATH entry alone (for npm) — you remove the install\nthrough its native package manager.\n\n## Privileges\n\nThis is a per-user tool. Every operation except `repair-system` (and the\nadmin-fallback path of `disable-desktop-alias`) runs as a standard user.\nThe wrapper writes only to `HKCU\\Environment`; it never touches `HKLM`,\n`C:\\Program Files`, system services, or anything outside the current\nuser's profile.\n\n`install`, `update`, `uninstall`, `repair`, `doctor`, `path`, `version`,\nand `where` actively **refuse** to run as Administrator by default\n(`:CheckAdmin` warns and aborts unless you pass `--yes` / `--force`).\nThat guard exists because running the upstream installer elevated\nlands `claude.exe` under `C:\\Windows\\System32\\config\\systemprofile\\` —\nuseless for the actual user. `repair-system` is the antidote for the\ncase where that already happened, and is the only subcommand that\nintentionally calls UAC.\n\n## Repair / cleanup subcommands\n\n### `repair-system`\n\nRemoves Claude Code files left under the SYSTEM account's profile\nafter someone ran the bare installer elevated. The wrapper:\n\n1. Detects whether the current process is elevated.\n2. If not, asks for confirmation and re-launches itself via\n   `Start-Process -Verb RunAs` (Windows shows the UAC prompt). The\n   elevated re-launch passes `--yes` so the second window does not\n   stall waiting for input.\n3. In the elevated session, walks three known paths:\n   * `%SystemRoot%\\System32\\config\\systemprofile\\.local\\bin\\claude.exe`\n   * `%SystemRoot%\\System32\\config\\systemprofile\\AppData\\Local\\Programs\\claude\\`\n   * `%SystemRoot%\\System32\\config\\systemprofile\\AppData\\Roaming\\npm\\claude.cmd`\n4. Refuses (with a hard substring check) to touch any path that does\n   not start with `%SystemRoot%\\System32\\config\\systemprofile\\`, so a\n   bug or a malicious `%SystemRoot%` override can't escape that tree.\n5. Reports cleaned / failed counts.\n\nYou can run it directly:\n\n    claude-code-install-manager repair-system --yes\n\nor with the long alias the user might guess from the flag-style name:\n\n    claude-code-install-manager --repair-system-profile\n\n### `disable-desktop-alias`\n\nRemoves the Windows App Execution Alias the Claude Desktop App\ninstalls at `%LOCALAPPDATA%\\Microsoft\\WindowsApps\\Claude.exe`. The\nalias is a reparse point owned by the AppX subsystem and refuses\nordinary delete operations, so the wrapper tries the cheap path\nfirst and escalates only when needed:\n\n1. `Remove-Item -Force` via PowerShell. Works on some Windows builds\n   for files the user owns.\n2. If that fails: re-prompts for admin (or errors out telling the\n   user how to re-run elevated), then `takeown /f` + `icacls /grant`\n   + `del /f /q`.\n3. If even step 2 fails, prints the **only sticky fix**: open\n   Settings → Apps → Advanced app settings → App execution aliases\n   and toggle Claude off. Windows regenerates the alias on the next\n   Claude Desktop App update, so the Settings toggle is the\n   permanent answer even when the delete succeeds — the wrapper\n   tells you this in both branches.\n\n    claude-code-install-manager disable-desktop-alias --yes\n\n## Security notes\n\n* The script downloads from `https://claude.ai/install.ps1`. PowerShell\n  validates TLS by default; no certificate pinning is done beyond that.\n* Use `--download-only` to inspect the installer locally before execution.\n  The SHA256 hash is printed so you can record or compare it.\n* No credentials, tokens, or telemetry are sent by this wrapper. It only\n  reads and writes your own `HKCU\\Environment`, calls the official\n  installer, and runs `claude --version` for verification.\n* The wrapper never writes to `HKLM` or system directories.\n* `uninstall` preserves `%USERPROFILE%\\.claude\\`. Configuration and\n  conversation history are kept. Delete that directory manually for a\n  full wipe.\n\n## Troubleshooting\n\n### `claude` is still not found after install\n\n1. Close every terminal window (not just the tab; the whole window).\n2. Open a new one and try again.\n3. If still failing, run `claude-code-install-manager doctor` and look at the\n   \"PATH status\" and \"Command resolution\" sections.\n\n### Installer fails behind a corporate proxy\n\n* Use `--download-only` to download via `Invoke-WebRequest`, which honors\n  `$env:HTTPS_PROXY` more reliably, then run the saved script manually.\n* If TLS inspection breaks the download, the proxy team needs to add an\n  exception for `claude.ai`.\n\n### \"PowerShell execution policy\" error\n\n`-ExecutionPolicy Bypass` is set on every internal PowerShell call, so the\nwrapper itself runs even under a restricted policy. If the installer\nsub-script still fails, run from an elevated PowerShell briefly to confirm:\n\n    Get-ExecutionPolicy -List\n\nIf `MachinePolicy` is `AllSigned` or stricter and is set by Group Policy,\nyour IT team controls this and you cannot override it from user space.\n\n### Multiple installs reported by `doctor`\n\nPick the one you want to keep. Remove the others by deleting their parent\nfolders, then run `claude-code-install-manager repair` so PATH points to the survivor.\n\n**Exception — WinGet-managed install:** don't delete it by hand.\nRun `winget uninstall Anthropic.ClaudeCode` first, then\n`claude-code-install-manager repair` (or `install` if you want the native\ninstaller's copy). `uninstall` in this wrapper refuses to touch a\nWinGet copy for this reason.\n\n### `claude` launches the desktop app instead of the CLI\n\nThe Claude Desktop App installs a Windows App Execution Alias at\n`%LOCALAPPDATA%\\Microsoft\\WindowsApps\\Claude.exe` that can sit\nhigher on PATH than the CLI. `doctor` and `install/repair`\nverification both flag this. To fix:\n\n1. Open Settings → Apps → Advanced app settings → App execution aliases.\n2. Find the Claude entry and toggle it off.\n3. Open a fresh terminal.\n4. `where claude` should now point at the CLI, not WindowsApps.\n\nYou can also remove the file directly, but Windows may regenerate\nit on the next desktop-app update; the Settings toggle is sticky.\n\n### Claude Code's Bash tool fails on Windows\n\nClaude Code's `Bash` tool relies on Git Bash on Windows; it cannot\nuse Command Prompt or PowerShell as a shell. If the tool throws\n\"No suitable shell found\" or \"Raw mode is not supported\", install\nGit for Windows and either:\n\n* Add `C:\\Program Files\\Git\\bin\\` to PATH, **or**\n* Set `CLAUDE_CODE_GIT_BASH_PATH` to the full path of `bash.exe`.\n\n`doctor` reports both states. Upstream references:\n[#3461](https://github.com/anthropics/claude-code/issues/3461),\n[#9883](https://github.com/anthropics/claude-code/issues/9883),\n[#25593](https://github.com/anthropics/claude-code/issues/25593).\n\n### Uninstall left some files behind\n\nThe most common cause is a running `claude` process holding a file open.\nClose any terminals or editors that may have started a `claude` subprocess,\nthen re-run `claude-code-install-manager uninstall`.\n\n### \"Press any key to close\" appears when I don't want it\n\nThe script pauses on exit when it thinks it was launched by\ndouble-click. The detection inspects `%cmdcmdline%`; if you wrap the\nscript in `cmd /c \"claude-code-install-manager ...\"` from another shell, the\ndetection sees the basename and triggers a pause. Set\n`CCT_NO_PAUSE=1` in the environment to disable the pause for the\nentire process tree, or pass it inline:\n\n    cmd /c \"set CCT_NO_PAUSE=1 \u0026\u0026 claude-code-install-manager install\"\n\n## Known upstream issues this wrapper works around\n\nFor convenience, here is the list of `anthropics/claude-code`\nissues that motivate specific code paths in `claude-code-install-manager.cmd`.\nAll are present in the official tracker as of May 2026.\n\n| Issue                                                                                              | Symptom                                                                          | What the wrapper does                              |\n|----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|----------------------------------------------------|\n| [#3838](https://github.com/anthropics/claude-code/issues/3838)                                     | `claude` CLI not recognized after global install (Windows)                       | `install` + automatic PATH registration            |\n| [#11358](https://github.com/anthropics/claude-code/issues/11358)                                   | Native installer doesn't add PATH                                                | `install` + `repair` write PATH directly to HKCU   |\n| [#14942](https://github.com/anthropics/claude-code/issues/14942)                                   | Installer reports success but `claude.exe` is missing                            | `install` re-runs `FindClaude` after the installer and errors clearly if nothing landed |\n| [#21365](https://github.com/anthropics/claude-code/issues/21365)                                   | Native `install.ps1` does not add installation directory to PATH                 | Same — `install` adds it itself                    |\n| [#25075](https://github.com/anthropics/claude-code/issues/25075)                                   | Claude Desktop App installer hijacks the `claude` command                        | `doctor` and `install/repair` verification flag the alias path |\n| [#24903](https://github.com/anthropics/claude-code/issues/24903)                                   | Desktop App execution alias shadows Claude Code CLI in PATH                      | Same                                              |\n| [#31980](https://github.com/anthropics/claude-code/issues/31980)                                   | Native installer and WinGet install to different locations silently              | `doctor` lists both; `uninstall` refuses to delete WinGet's copy |\n| [#27634](https://github.com/anthropics/claude-code/issues/27634)                                   | WinGet install doesn't set up the native install at `~/.local/bin`               | `install` from this wrapper uses the native installer's location |\n| [#32098](https://github.com/anthropics/claude-code/issues/32098), [#41578](https://github.com/anthropics/claude-code/issues/41578) | False \"PATH not set\" warnings from the installer reading the wrong scope         | Wrapper queries the registry directly, not the inherited process PATH |\n| [#42337](https://github.com/anthropics/claude-code/issues/42337)                                   | v2.1.89 regression: native installer succeeds but does not add `.local\\bin`      | Same — wrapper handles PATH itself                  |\n| [#3461](https://github.com/anthropics/claude-code/issues/3461), [#25593](https://github.com/anthropics/claude-code/issues/25593) | Claude Code requires Git Bash; \"No suitable shell found\" without it              | `doctor` reports `CLAUDE_CODE_GIT_BASH_PATH` and `where bash.exe` |\n| [#9883](https://github.com/anthropics/claude-code/issues/9883)                                     | Bash tool incompatible with MSYS / Git Bash (needs `cygpath`)                    | Documented; the wrapper can't fix the upstream tool but `doctor` surfaces the env |\n\nRun `claude-code-install-manager doctor` to see which of these apply to your\nmachine right now.\n\n## Releases and code signing\n\n**Setting up signing for the first time?** See\n[**docs/signing.md**](docs/signing.md) for the two supported paths\n(Azure Trusted Signing and PFX-from-a-CA), prerequisites, the exact\n`gh secret set` commands, and how to verify a signed build before\ncutting a real release.\n\n### Why a separate `.exe`\n\n**`.cmd` and `.bat` files cannot be Authenticode-signed.** Windows'\nsignature subsystem can only sign formats that carry a host-defined\nsignature block:\n\n| Format          | Signable | How signature is stored                |\n|-----------------|----------|----------------------------------------|\n| `.exe`, `.dll`  | yes      | PE certificate table                   |\n| `.ps1`, `.psm1` | yes      | trailing `# SIG # Begin signature block` lines |\n| `.msi`, `.cab`  | yes      | embedded                               |\n| `.cat`          | yes      | embedded (catalog)                     |\n| `.cmd`, `.bat`  | **no**   | no signature slot exists in the format |\n\nThere is no published technique to attach an Authenticode signature\nto a `.cmd` file. SmartScreen sees an unsigned script and a\nMark-of-the-Web alternate data stream and warns the user. The\nwork-around used by every signed shell-script-style distribution\non Windows (Chocolatey, scoop, etc.) is the same one this project\nuses: ship a tiny signed PE alongside the script.\n\n### Build \u0026 sign — `scripts/build-launcher.ps1`\n\nThe build script compiles `scripts/launcher.cs` into\n`release/dist/claude-code-install-manager.exe`, an Authenticode-signable\nlauncher that simply re-exec's `claude-code-install-manager.cmd` (from the\nsame directory) under `cmd.exe`, forwarding all arguments and\nreturning the script's exit code. Users who run the signed `.exe`\nsee the publisher name in the SmartScreen dialog instead of\n\"Unknown publisher\".\n\nThe launcher uses `csc.exe` from .NET Framework 4.x (shipped with\nevery Windows 10 / 11 install), so there is no extra SDK dependency\nto build it.\n\n**Unsigned dev build:**\n\n    .\\scripts\\build-launcher.ps1\n\n**Signed release using a PFX on disk:**\n\n    $pwd = Read-Host -AsSecureString\n    .\\scripts\\build-launcher.ps1 -CertPath C:\\certs\\codesign.pfx -CertPassword $pwd\n\n**Signed release using a thumbprint** (recommended for EV certs in\na hardware token, where the private key never touches disk):\n\n    .\\scripts\\build-launcher.ps1 -Thumbprint 1234ABCD...\n\nAfter signing, the script runs `signtool verify /pa /v` against the\noutput, writes `release/dist/SHA256SUMS` with post-sign hashes, and\ncopies `claude-code-install-manager.cmd` next to the EXE so the launcher can\nfind it.\n\n### Verify — `scripts/verify-release.ps1`\n\nShip this alongside the release. Users (or CI) can run it to\nconfirm a download:\n\n    .\\verify-release.ps1\n\nThe script:\n\n1. Reads `SHA256SUMS` and re-hashes every file it references.\n2. Runs `Get-AuthenticodeSignature` on `claude-code-install-manager.exe` and\n   prints the subject, issuer, validity dates, thumbprint, and\n   timestamp status. Warns if the signature has no RFC 3161\n   timestamp (which would make it expire with the cert).\n3. Walks the release directory looking for `Zone.Identifier`\n   alternate data streams (Mark-of-the-Web) and tells the user how\n   to unblock them.\n4. Exits non-zero on any mismatch.\n\n### Costs and gotchas\n\n* A standard code-signing cert costs roughly USD 200 / year. EV\n  certs (which build SmartScreen reputation faster) are USD 300+.\n* Without an EV cert, a fresh signed `.exe` still triggers\n  \"SmartScreen Filter prevented an unrecognized app from starting\"\n  on first launch until enough installs build reputation. Users\n  can click \"More info\" → \"Run anyway\" once; subsequent launches\n  on the same machine are silent.\n* The build script always passes `/tr` (RFC 3161 timestamp). Do\n  not remove this — without a timestamp, the signature stops\n  validating the day the cert expires, even on existing downloads.\n* Sign artifacts **before** publishing the SHA256SUMS file. The\n  build script does this in the right order.\n\n## Uninstalling the wrapper itself\n\nThe wrapper is a single file. Delete `claude-code-install-manager.cmd` and, if you\nadded its folder to PATH, remove that entry from User environment\nvariables.\n\n## License\n\nMIT — see [LICENSE](LICENSE). Copyright (c) 2026 Simtabi LLC.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Vulnerability disclosure\nlives in [SECURITY.md](SECURITY.md). Project participation is\ngoverned by the [Contributor Covenant 2.1](CODE_OF_CONDUCT.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimtabi%2Fclaude-code-install-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimtabi%2Fclaude-code-install-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimtabi%2Fclaude-code-install-manager/lists"}