{"id":37229301,"url":"https://github.com/jellydn/ai-cli-switcher","last_synced_at":"2026-01-31T06:05:11.971Z","repository":{"id":332009797,"uuid":"1132450349","full_name":"jellydn/ai-cli-switcher","owner":"jellydn","description":"A fast, secure launcher CLI tool that lets you switch between different AI coding assistants using fuzzy search.","archived":false,"fork":false,"pushed_at":"2026-01-20T14:56:07.000Z","size":89,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-20T23:16:02.769Z","etag":null,"topics":["amp","ccs","claude-code","cli","fuzzy-search","open-code","open-source"],"latest_commit_sha":null,"homepage":"https://jellydn.github.io/ai-cli-switcher/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jellydn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["jellydn"],"ko_fi":"dunghd","buy_me_a_coffee":"dunghd","polar":"jellydn"}},"created_at":"2026-01-12T01:07:19.000Z","updated_at":"2026-01-20T14:55:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jellydn/ai-cli-switcher","commit_stats":null,"previous_names":["jellydn/ai-cli-switcher"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/jellydn/ai-cli-switcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jellydn%2Fai-cli-switcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jellydn%2Fai-cli-switcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jellydn%2Fai-cli-switcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jellydn%2Fai-cli-switcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jellydn","download_url":"https://codeload.github.com/jellydn/ai-cli-switcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jellydn%2Fai-cli-switcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28931094,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["amp","ccs","claude-code","cli","fuzzy-search","open-code","open-source"],"created_at":"2026-01-15T03:32:05.909Z","updated_at":"2026-01-31T06:05:11.958Z","avatar_url":"https://github.com/jellydn.png","language":"TypeScript","funding_links":["https://github.com/sponsors/jellydn","https://ko-fi.com/dunghd","https://buymeacoffee.com/dunghd","https://polar.sh/jellydn"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/logo.svg\" alt=\"AI CLI Switcher Logo\" width=\"400\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eAI CLI Switcher\u003c/h1\u003e\n \n\u003cp align=\"center\"\u003e\n  A fast, secure launcher CLI tool that lets you switch between different AI coding assistants using fuzzy search. Built with TypeScript and Bun for optimal performance.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#installation\"\u003e\u003cstrong\u003eInstallation\u003c/strong\u003e\u003c/a\u003e •\n  \u003ca href=\"#usage\"\u003e\u003cstrong\u003eUsage\u003c/strong\u003e\u003c/a\u003e •\n  \u003ca href=\"#configuration\"\u003e\u003cstrong\u003eConfiguration\u003c/strong\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## ✨ Features\n\n- **🔍 Fuzzy Search**: Interactive terminal UI with real-time filtering and keyboard navigation\n- **🔧 Auto-Detection**: Automatically finds installed AI CLIs (claude, opencode, amp, ccs)\n- **⚡ Direct Invocation**: Skip the menu with `ai \u003ctoolname\u003e` or fuzzy matching\n- **🏷️ Aliases**: Define short aliases for frequently used tools (e.g., `ai c` for claude)\n- **📋 Templates**: Create command shortcuts with `$@` argument/stdin placeholders\n- **👤 CCS Profiles**: Automatically detects CCS profiles via `ccs api list`\n- **🔒 Security**: Built-in command validation and injection prevention\n- **🌍 Cross-Platform**: Works on macOS, Linux, and Windows\n- **⚙️ Configuration**: User-defined tools override auto-detection\n\n## Installation\n\n### One-line Install (macOS/Linux)\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/jellydn/ai-cli-switcher/main/install.sh | sh\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eSafer alternative (inspect before running)\u003c/summary\u003e\n\n```sh\ncurl -fsSL -o install.sh https://raw.githubusercontent.com/jellydn/ai-cli-switcher/main/install.sh\nless install.sh  # inspect the script\nsh install.sh\n```\n\n\u003c/details\u003e\n\n### Homebrew (macOS/Linux)\n\n```sh\nbrew install jellydn/tap/ai\n```\n\n### Windows\n\nDownload the latest `ai-windows-x64.exe` from [Releases](https://github.com/jellydn/ai-cli-switcher/releases) and add to your PATH.\n\n### Build from Source\n\nRequires [Bun](https://bun.sh):\n\n```bash\ngit clone https://github.com/jellydn/ai-cli-switcher\ncd ai-cli-switcher\nbun install\nbun run build\n```\n\nThis produces a standalone executable at `dist/ai`.\n\n### Manual Install\n\n```bash\n# Option 1: Symlink to /usr/local/bin (requires sudo)\nsudo ln -sf \"$(pwd)/dist/ai\" /usr/local/bin/ai\n\n# Option 2: Symlink to ~/.local/bin (no sudo required)\nmkdir -p ~/.local/bin\nln -sf \"$(pwd)/dist/ai\" ~/.local/bin/ai\n# Ensure ~/.local/bin is in your PATH\n```\n\nVerify installation:\n\n```bash\nai --help\n```\n\n[![ai --help](https://i.gyazo.com/271b43515723f8f95a492882fb5cf4c4.png)](https://gyazo.com/271b43515723f8f95a492882fb5cf4c4)\n\n## Usage\n\n### 🎯 Interactive Mode\n\nRun without arguments to open fuzzy search:\n\n```bash\nai\n```\n\n**Controls:**\n\n| Key | Action |\n|-----|--------|\n| Type | Filter tools and templates |\n| `↑` / `Ctrl+P` / `Shift+Tab` | Move up |\n| `↓` / `Ctrl+N` / `Tab` | Move down |\n| `Enter` | Select and launch |\n| `Esc` / `Ctrl+C` | Cancel |\n\n\u003e **Note:** Tab/Shift+Tab navigate the list (not shell completion) since the UI runs in raw mode.\n\n- Templates show `[T]` indicator\n- Compact mode for narrow terminals (\u003c 60 chars)\n- Real-time fuzzy matching on names, descriptions, and aliases\n\n### ⚡ Direct Invocation\n\nLaunch a tool directly by name or alias:\n\n```bash\nai claude        # Launch Claude\nai amp           # Launch Amp\nai ccs:glm       # Launch CCS with glm profile\nai c             # Uses alias for claude (if configured)\n```\n\n**Fuzzy matching** works when no exact match is found:\n\n```bash\nai cl            # Matches \"claude\"\nai op            # Matches \"opencode\"\nai cc            # Matches \"ccs\" or \"claude\" (will ask if ambiguous)\n```\n\n**CCS Profile Detection**: Automatically detects CCS profiles and creates tools like:\n\n- `ccs:glm` - GPT model profile\n- `ccs:kimi` - Kimi model profile\n- `ccs:custom` - Custom profile name\n\n### Passing Arguments\n\nPass arguments to the selected tool:\n\n```bash\nai claude --help              # Direct: passes --help to claude\nai -- --help                  # Fuzzy: select tool, then pass --help\nai claude -- --version        # Explicit separator\n```\n\n### Templates with Arguments \u0026 Stdin\n\nTemplates can use `$@` as a placeholder for arguments or piped stdin:\n\n```bash\n# Pass arguments directly\nai summarize main.ts          # Expands template with arguments\n\n# Pipe content via stdin\ncat main.ts | ai summarize    # Pipe file content to template\ngit diff | ai review          # Pipe git diff for code review\necho \"Hello world\" | ai summarize\n```\n\nBoth methods substitute content into the `$@` placeholder. If no input is provided for a template requiring `$@`, an error is shown.\n\n### Templates Without Arguments\n\nTemplates without `$@` run immediately when selected - perfect for common commands with embedded prompts:\n\n```bash\n# In config.json - no prompt needed, runs directly\nai gemini-arch                # Runs immediately: ccs gemini 'Explain...'\nai                           # Or select from interactive menu\n```\n\nThese templates have fixed commands and execute instantly on selection.\n\n## Configuration\n\nConfig file location: `~/.config/ai-switcher/config.json`\n\nA default config is created on first run. Example:\n\n```json\n{\n  \"tools\": [\n    {\n      \"name\": \"claude\",\n      \"command\": \"claude\",\n      \"description\": \"Anthropic Claude CLI\",\n      \"aliases\": [\"c\"]\n    },\n    {\n      \"name\": \"opencode\",\n      \"command\": \"opencode\",\n      \"description\": \"OpenCode AI assistant\",\n      \"aliases\": [\"o\", \"oc\"]\n    }\n  ],\n  \"templates\": [\n    {\n      \"name\": \"summarize\",\n      \"command\": \"claude -p 'Summarize this file: $@'\",\n      \"description\": \"Summarize a file with Claude\"\n    },\n    {\n      \"name\": \"review\",\n      \"command\": \"amp -p 'Review this code: $@'\",\n      \"description\": \"Code review with Amp\"\n    },\n    {\n      \"name\": \"commit-zen\",\n      \"command\": \"opencode run 'Generate commit message: $@'\",\n      \"description\": \"Generate commit message with OpenCode\"\n    },\n    {\n      \"name\": \"gemini-arch\",\n      \"command\": \"ccs gemini 'Explain this codebase architecture'\",\n      \"description\": \"Explain architecture with Gemini\",\n      \"aliases\": [\"arch\"]\n    }\n  ]\n}\n```\n\n### Config Options\n\n**tools**: Array of AI tools\n\n- `name`: Display name and primary lookup key\n- `command`: The CLI command to execute\n- `description`: Shown in fuzzy search list\n- `aliases`: Optional array of short aliases\n\n**templates**: Array of command templates\n\n- `name`: Template name (shown with [T] indicator)\n- `command`: Command string, use `$@` for argument substitution\n- `description`: Template description\n\n### 🔍 Auto-Detection\n\nThe following CLIs are auto-detected if installed and available in PATH:\n\n- `claude` - Anthropic Claude CLI\n- `opencode` - OpenCode AI assistant\n- `amp` - Sourcegraph Amp CLI\n- `ccs` - **Claude Code Switch** (with profile detection via `ccs api list`)\n\n**Precedence Rules:**\n\n1. User-defined tools in config.json (highest priority)\n2. Auto-detected tools (fallback)\n3. Tools with same name or command are de-duplicated\n\n**CCS Profile Auto-Detection:**\nRuns `ccs api list` to detect active profiles. Each profile with `[OK]` status becomes available as `ccs:\u003cprofile-name\u003e`.\n\n## 💡 Template Examples \u0026 Tips\n\n\u003e Based on a real-world config using **claude**, **opencode**, **amp**, and **CCS** profiles.\n\n### Your Current Templates\n\nThese are the templates from your active config:\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"review\",\n      \"command\": \"opencode run --model opencode/big-pickle --agent plan 'Review the following changes and provide feedback: $@'\",\n      \"description\": \"Code review with OpenCode\",\n      \"aliases\": [\"rev\", \"code-review\"]\n    },\n    {\n      \"name\": \"commit-zen\",\n      \"command\": \"opencode run --model opencode/big-pickle --agent plan 'Review the following changes and generate a concise git commit message: $@'\",\n      \"description\": \"Generate commit message with OpenCode\",\n      \"aliases\": [\"commit\", \"commit-message\"]\n    },\n    {\n      \"name\": \"commit-atomic\",\n      \"command\": \"opencode run --model opencode/big-pickle --agent build 'Run git diff --staged then do atomic commit message for the change with commitizen convention. Write clear, informative commit messages that explain the what and why behind changes, not just the how.'\",\n      \"description\": \"Atomic commit message with OpenCode\",\n      \"aliases\": [\"ac\", \"auto-commit\"]\n    },\n    {\n      \"name\": \"architecture-explanation\",\n      \"command\": \"ccs gemini 'Explain this codebase architecture'\",\n      \"description\": \"Explain architecture with Gemini\",\n      \"aliases\": [\"arch\", \"arch-explanation\"]\n    },\n    {\n      \"name\": \"draft-pull-request\",\n      \"command\": \"ccs glm 'Create draft pr with what why how by gh cli'\",\n      \"description\": \"Create draft pull request with GLM\",\n      \"aliases\": [\"pr\", \"draft-pr\"]\n    }\n  ]\n}\n```\n\n### Complementary Templates to Add\n\nExpand your toolkit with these templates that work with your existing tools:\n\n#### Code Quality \u0026 TypeScript\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"types\",\n      \"command\": \"claude -p 'Improve TypeScript types: Remove any, add proper type guards, ensure strict mode compliance for: $@'\",\n      \"description\": \"Enhance type safety\",\n      \"aliases\": [\"typescript\"]\n    },\n    {\n      \"name\": \"test\",\n      \"command\": \"claude -p 'Write Bun tests using Arrange-Act-Assert pattern. Focus on behavior, not implementation details for: $@'\",\n      \"description\": \"Generate tests\",\n      \"aliases\": [\"spec\", \"tests\"]\n    },\n    {\n      \"name\": \"docs\",\n      \"command\": \"claude -p 'Add JSDoc comments with @param and @returns. Include usage examples for: $@'\",\n      \"description\": \"Add documentation\",\n      \"aliases\": [\"document\"]\n    },\n    {\n      \"name\": \"explain\",\n      \"command\": \"claude -p 'Explain this code in detail: 1) What it does 2) How it works 3) Design decisions: $@'\",\n      \"description\": \"Code explanation\",\n      \"aliases\": [\"wtf\", \"explain-code\"]\n    }\n  ]\n}\n```\n\n#### Specialized Reviews\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"review-security\",\n      \"command\": \"claude -p 'Security review: Check for injection vulnerabilities, input validation, auth issues, and sensitive data handling in: $@'\",\n      \"description\": \"Security-focused review\",\n      \"aliases\": [\"sec\", \"security\"]\n    },\n    {\n      \"name\": \"review-refactor\",\n      \"command\": \"claude -p 'Refactor suggestion: Improve readability, eliminate complexity, and apply clean code principles to: $@'\",\n      \"description\": \"Refactoring recommendations\",\n      \"aliases\": [\"refactor\"]\n    },\n    {\n      \"name\": \"review-performance\",\n      \"command\": \"claude -p 'Analyze performance: Identify bottlenecks, suggest optimizations with measurable impact for: $@'\",\n      \"description\": \"Performance review\",\n      \"aliases\": [\"perf\", \"optimize\"]\n    }\n  ]\n}\n```\n\n#### Git Workflow Enhancements\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"pr-title\",\n      \"command\": \"claude -p 'Write a clear PR title (max 72 chars) using Conventional Commits: Type(scope): description'\",\n      \"description\": \"Generate PR title only\"\n    },\n    {\n      \"name\": \"release-notes\",\n      \"command\": \"git diff HEAD~1 | opencode run --model opencode/big-pickle --agent plan 'Generate user-friendly release notes from this diff, focusing on user-facing changes'\",\n      \"description\": \"Generate release notes from last commit\"\n    }\n  ]\n}\n```\n\n#### Design \u0026 Architecture\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"design-review\",\n      \"command\": \"claude -p 'Review this design for: maintainability, extensibility, and separation of concerns: $@'\",\n      \"description\": \"Design pattern review\",\n      \"aliases\": [\"design\"]\n    },\n    {\n      \"name\": \"api-design\",\n      \"command\": \"claude -p 'Review this API design for: REST principles, error handling, versioning, and documentation: $@'\",\n      \"description\": \"API design review\"\n    },\n    {\n      \"name\": \"profiler-guidance\",\n      \"command\": \"claude -p 'Suggest profiling strategy: What to measure, tools to use, and how to interpret results for: $@'\",\n      \"description\": \"Profiling guidance\"\n    }\n  ]\n}\n```\n\n#### Quick-Fix Templates (No Arguments)\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"fix-lint\",\n      \"command\": \"opencode run 'Fix all linting errors in current file'\",\n      \"description\": \"Auto-fix lint issues\"\n    },\n    {\n      \"name\": \"format-imports\",\n      \"command\": \"claude -p 'Organize and sort imports, remove unused imports, add type imports where needed'\",\n      \"description\": \"Clean up imports\",\n      \"aliases\": [\"imports\"]\n    },\n    {\n      \"name\": \"add-error-handling\",\n      \"command\": \"claude -p 'Add proper error handling with try-catch and meaningful error messages'\",\n      \"description\": \"Add error handling\"\n    }\n  ]\n}\n```\n\n#### Code Cleanup \u0026 Refactoring\n\n```json\n{\n  \"templates\": [\n    {\n      \"name\": \"remove-ai-slop\",\n      \"command\": \"claude -p \\\"You're reviewing code cleanup. Remove: 1) Excessive comments that break existing documentation style 2) Defensive checks that don't match the codebase's trust model 3) Type escape hatches (any casts, assertions) 4) Generic patterns that feel imported rather than native. Match the file's existing voice and conventions. Report what you removed in 1-3 sentences: $@\\\"\",\n      \"description\": \"Remove AI-generated code patterns\",\n      \"aliases\": [\"slop\", \"clean-ai\"]\n    },\n    {\n      \"name\": \"tidy-first\",\n      \"command\": \"claude -p 'Apply Tidy First principles: 1) Use guard clauses 2) Extract helper variables for complex expressions 3) Remove dead code 4) Normalize symmetries. Focus on making the code easier to understand: $@'\",\n      \"description\": \"Tidy code before making changes\",\n      \"aliases\": [\"tidy\"]\n    },\n    {\n      \"name\": \"simplify\",\n      \"command\": \"claude -p \\\"Simplify this code: Remove unnecessary complexity, eliminate over-engineering, reduce coupling. Keep solutions simple and focused on what's actually needed: $@\\\"\",\n      \"description\": \"Simplify over-engineered code\",\n      \"aliases\": [\"simple\"]\n    }\n  ]\n}\n```\n\n### Usage Examples\n\n```bash\n# Your current templates\ngit diff | ai review                    # Review with OpenCode big-pickle\ngit diff --staged | ai commit-zen       # Generate commit message\nai ac                                  # Atomic commit (runs git diff internally)\nai arch                                # Explain architecture with Gemini\nai pr                                  # Create draft PR with GLM\n\n# Additional templates to add\ncat src/lookup.ts | ai explain         # Explain a file\nai test src/config.test.ts             # Generate tests\nai types src/lookup.ts                 # Improve types\ngit diff HEAD~1 | ai release-notes     # Generate release notes\n\n# Security \u0026 performance reviews\ngit diff | ai review-security          # Security-focused review\ncat main.ts | ai review-performance    # Performance analysis\n\n# Quick fixes (no arguments needed)\nai format-imports                      # Clean up imports immediately\nai fix-lint                            # Auto-fix linting errors\n\n# Code cleanup \u0026 refactoring\ncat src/file.ts | ai remove-ai-slop    # Clean up AI-generated patterns\ngit diff | ai tidy-first               # Apply Tidy First principles\ncat src/complex.ts | ai simplify       # Simplify over-engineered code\n```\n\n### Pro Tips\n\n1. **Your current aliases**: Use short aliases you've configured\n   - `ai rev` → `review` (OpenCode code review)\n   - `ai ac` → `commit-atomic` (atomic commits)\n   - `ai arch` → `architecture-explanation` (Gemini architecture)\n\n2. **Model selection**: Choose the right AI for the task\n   - **OpenCode big-pickle**: Great for code review and commits (your current choice)\n   - **Claude**: Best for TypeScript, testing, and explanations\n   - **CCS Gemini**: Excellent for architecture explanations\n   - **CCS GLM**: Good for PR creation and structured outputs\n   - **Amp**: Lightweight alternative for quick tasks\n\n3. **Chain operations**: Use shell pipes to create workflows\n   ```bash\n   git diff | ai review                  # Review staged changes\n   cat file.ts | ai test \u003e file.test.ts  # Generate test file\n   git diff main..feature | ai pr        # Create draft PR from branch diff\n   ```\n\n4. **Fuzzy match power**: Type minimal characters to find templates\n   - `ai com` → matches `commit-zen` or `commit-atomic` (will ask)\n   - `ai arc` → matches `architecture-explanation`\n   - `ai rev-se` → matches `review-security` (if added)\n\n5. **CCS profiles**: Extend with more models as needed\n   ```json\n   {\n     \"name\": \"review-gpt4\",\n     \"command\": \"ccs:gpt4 'Review this code: $@'\",\n     \"description\": \"Review with GPT-4 via CCS\"\n   }\n   ```\n\n6. **Template naming**: Use descriptive prefixes for organization\n   - `commit-*` for Git commits\n   - `review-*` for different review types\n   - `pr-*` for pull request workflows\n   - Quick aliases for frequent tasks: `ai slop` for cleanup, `ai tidy` for tidying\n\n## 🛠️ Development\n\n```bash\n# Install dependencies\nbun install\n\n# Run in development mode\nbun run dev\n\n# Type checking (no compilation errors ✅)\nbun run typecheck\n\n# Build standalone executable\nbun run build\n\n# Test with specific tools\nbun run src/index.ts claude --version\n```\n\n## 🏗️ Architecture\n\n- **Modular Design**: Clean separation of concerns (config, detection, UI, lookup)\n- **Type Safety**: Full TypeScript coverage with strict mode\n- **Security**: Command validation and injection prevention\n- **Performance**: Bun runtime for fast startup and minimal dependencies\n- **Extensibility**: Plugin-ready architecture for custom tool detectors\n\n## 🔒 Security Features\n\n- **Input Validation**: All commands and arguments validated before execution\n- **Command Injection Prevention**: Regex-based sanitization of unsafe characters\n- **Template Safety**: Validated placeholder substitution (`$@` syntax only)\n- **Path Protection**: Commands validated against allowlist patterns\n\n## 🧪 Testing\n\n```bash\n# Run unit tests\nbun test\n\n# Test auto-detection\nbun run src/index.ts\n\n# Test direct invocation\nbun run src/index.ts claude --version\nbun run src/index.ts opencode --help\n\n# Test error handling\nbun run src/index.ts nonexistent-tool\n\n# Test alias support (if configured)\nbun run src/index.ts c  # Should match claude alias\n\n# Test template with arguments\nbun run src/index.ts summarize file.txt\n\n# Test template with stdin\ncat file.txt | bun run src/index.ts summarize\ngit diff | bun run src/index.ts review\n```\n\n## 🌍 Platform Compatibility\n\n### ✅ Tested Platforms\n\n- **macOS**: Full functionality including interactive fuzzy search\n- **Linux**: Full functionality including interactive fuzzy search\n- **Windows**: Basic functionality, interactive mode may have limitations\n\n### 📋 Platform-Specific Notes\n\n#### macOS \u0026 Linux\n\n- Full ANSI color support\n- Interactive terminal UI works in most terminals\n- Recommended: iTerm2, Terminal.app, VS Code integrated terminal\n\n#### Windows\n\n- Works best in Windows Terminal\n- Command Prompt may have limited ANSI support\n- PowerShell recommended over cmd.exe\n- Some interactive features may be limited\n\n#### Terminal Requirements\n\n- TTY support for interactive mode\n- ANSI color support (optional, enhances experience)\n- UTF-8 encoding recommended\n\n## 🤝 Contributing\n\n1. Fork and clone\n2. Create feature branch\n3. Run `bun run typecheck` (no errors allowed)\n4. Test on your platform\n5. Submit PR with description\n\n## 📄 License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjellydn%2Fai-cli-switcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjellydn%2Fai-cli-switcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjellydn%2Fai-cli-switcher/lists"}