- Implement account-manager.ts for managing multiple OAuth accounts per provider
- Add account selector in UI dialog with dropdown for authenticated accounts
- Extend auth-handler.ts to support account registration and multi-account authentication
- Update web-server routes with account management endpoints (GET/POST/DELETE)
- Add account badges and management UI in cliproxy page
- Support account field in CLIProxy variant configuration
- Add Badge component from shadcn/ui for UI styling
- Enable default account selection and account removal functionality
The spawn() call was missing the env option, so ANTHROPIC_AUTH_TOKEN
and ANTHROPIC_BASE_URL were not being passed to the proxy subprocess.
This caused 401 Unauthorized errors.
OpenAI-compatible endpoints like /chat/completions require Authorization header
with 'Bearer ' prefix. Previously the token was sent without prefix, causing
401 Unauthorized errors.
Auto-detects endpoint type based on URL path and formats header accordingly.
Fixes#61
- Add auth status endpoint to show built-in profiles authentication state
- Display auth status in UI with visual indicators for authenticated state
- Show last authentication date and token file count
- Update CLI command to better differentiate between built-in profiles and custom variants
- Improve UI layout to separate built-in profiles from custom variants
- Settings editor with API key masking and conflict detection
- Health dashboard with status cards and one-click fixes
- Home dashboard with stats and quick actions
- Shared data viewer for commands/skills/agents
- Build scripts for UI + server bundle
- Bundle size verification (<500KB gzipped)
- Pre-release checklist script
- Add port-utils.ts module to detect which process occupies CLIProxy port
- Enhance doctor command to show specific process (PID/name) using port
- Distinguish between CLIProxy process vs other conflicting processes
- Support cross-platform detection (Windows netstat, Unix lsof)
- Provide actionable guidance when port conflict detected
This helps users identify if CLIProxy is already running or if another
application needs to be terminated to free up the port.
Deprecated 2 Claude thinking models:
- gemini-claude-opus-4-5-thinking
- gemini-claude-sonnet-4-5-thinking
These models have compatibility issues with Antigravity.
A new deprecation system was added with badges and warnings in the UI.
- Styled cliproxy help output with UI primitives and added status hint
- Added cliproxy --help reference to main help command
- Updated bash, zsh, fish, and PowerShell completions with:
- Missing commands (api, cliproxy)
- CLIProxy OAuth profiles (gemini, codex, agy, qwen)
- Provider flags and update command flags
- Add `ccs cliproxy create/list/remove` commands for variant management
- Interactive wizard with provider/model selection from catalog
- Settings file auto-generated with all 6 ANTHROPIC_* env fields
- Fix `ccs api create` to include all 4 model fields (was missing 3)
- Fix `--config` flag to save to correct variant settings file
- Remove paid tier badge from AGY models (all free via Antigravity)
- Add settings file format example to README for CLIProxy variants
- Add 22 unit tests for cliproxy command validation and config handling
- Removed broken: true and issueUrl from Claude thinking models
- Added MAX_THINKING_TOKENS=8191 for Antigravity-proxied Claude models
- Removed alwaysThinkingEnabled:false requirement
- Updated info message explaining thinking token limit
Claude models now work with extended thinking when using Antigravity
proxy (MAX_THINKING_TOKENS < 8192 is required).
Model configuration now uses selective merge instead of full replacement:
- Preserves all user customizations (includeCoAuthoredBy, MAX_TOKENS, etc.)
- Only updates CCS-controlled fields (model selection, base URL, auth token)
- Still enforces alwaysThinkingEnabled: false for Claude models
Claude models routed through Google's Antigravity protocol don't support
the thinking toggle due to protocol conversion limitations.
Changes:
- Add alwaysThinkingEnabled: false when selecting Claude models
- Show warning about thinking toggle limitation after model selection
- Reference GitHub issue #415 for technical details
Add iFlow as a new OAuth-based provider for CLIProxy.
Changes:
- Add config/base-iflow.settings.json with iFlow provider configuration
- Add iFlow to CLIProxyProvider type
- Add iFlow OAuth config (authUrl, scopes, authFlag)
- Add iFlow to provider display names, auth prefixes, and type values
- Update config-generator to support iFlow provider
- Update base-qwen.settings.json models (qwen3-coder-plus)
Co-authored-by: kaitranntt <kaitran.ntt@gmail.com>
claude cli's atomic writes (toggle thinking, etc.) replace symlinks with
regular files, breaking the settings sync chain. this adds:
- `ccs doctor --fix` to detect and repair broken shared symlinks
- `ccs sync` now also repairs shared symlinks automatically
fixes#57
- add broken flag to model catalog for models with known issues
- display [BROKEN] badge in model selection and config display
- show warning message when starting with a broken model
- link to tracking issue: CLIProxyAPI#415
Claude proxy models (gemini-claude-*) currently fail with tool calls
due to upstream CLIProxyAPI bug. Warning helps users know to switch
to gemini-3-pro-preview until fixed.
- Fix --config showing wrong default star position by using current
user model instead of catalog default when reconfiguring
- Update CLIPROXY_FALLBACK_VERSION from 6.5.31 to 6.5.40
Replace misleading "[Paid API]" and "API key" references with "[Paid Tier]"
and clarify that paid tier refers to a paid Google account (not free tier),
not an API key purchase. Updates model descriptions in both catalog and
configuration to accurately reflect the tier requirement.
Replace custom formatting with ui.ts imports (color, bold, dim, ok, info,
header, initUI) to maintain consistent styling with ccs doctor. Add model
descriptions to catalog and clarify [Paid API] tier labeling. Update
showCurrentConfig to async for UI initialization. Improves code reuse and
visual consistency across CLI commands.
Terminals using bracketed paste mode wrap pasted content with ESC[200~
(start) and ESC[201~ (end) sequences. These were incorrectly passed
through to API keys, causing "[200~API_KEY[201~" instead of "API_KEY".
Now buffers ESC sequences and discards recognized paste markers.
Introduces new model-catalog and model-config modules to manage LLM
provider configurations and aliases. Enables dynamic model selection
with validated configuration per provider.
- Replace before()/after() with beforeAll()/afterAll()
- Remove this.timeout() calls (unsupported by bun)
- Update package.json scripts to use bun test
- Fix error message regex for cross-runtime compatibility
- Skip integration tests requiring network/child process mocking
- Format source files with prettier
When symlink creation fails on Windows (due to Developer Mode being
disabled or insufficient permissions), fall back to copying files
and directories instead.
Changes:
- Add copyFallback() method for Windows symlink failures
- Add copyDirRecursive() helper for directory copying
- Update checkHealth() to recognize copied files as valid on Windows
- Add isCopiedItem() helper to validate copied content
- Update uninstall() to handle both symlinks and copied files
Fixes#45
Windows .cmd/.bat wrapper scripts require shell: true in spawn options.
Uses same pattern as other files (ccs.ts, cliproxy-executor.ts, shell-executor.ts):
- getClaudeCliInfo() returns needsShell flag
- Concatenate command string when shell needed to avoid DEP0190 warning
Closes#41
- skip TTY check on Windows (process.stdin.isTTY returns undefined)
- Windows desktop environments always have browser capability
- also fix help-command version to read from package.json
Closes#42
Fixes#36
Windows paths with backslashes caused YAML parsing failures because
backslashes are escape characters in double-quoted strings. Forward
slashes work correctly on all platforms and avoid escape sequence issues.
Changes:
- src/cliproxy/config-generator.ts: Add .replace(/\\/g, '/') to authDir
- tests/unit/cliproxy/config-generator.test.js: Add 12 unit tests
Tests: 169/169 unit tests passing
Issue #37: When running `ccs` (default profile), users were unknowingly
using GLM API instead of their Claude subscription because:
1. config.json had `default: '~/.claude/settings.json'` entry
2. ProfileDetector treated this as settings-based profile
3. CCS passed `--settings ~/.claude/settings.json` flag to Claude
4. Any stale ANTHROPIC_* env vars in that file got applied
Fix (3-pronged approach):
- Remove `default` entry from new config.json template
- Add migration to remove existing `default: ~/.claude/settings.json`
- Add ProfileDetector safety net: if default points to ~/.claude/settings.json,
treat as pass-through to Claude's native auth (no --settings flag)
Now `ccs` (no profile) correctly uses Claude's native OAuth authentication
without loading potentially polluted env vars from previous sessions.
Closes#37
- Add sectionHeader() with gradient + bold styling
- Rename profile-command.ts to api-command.ts
- Update help command layout
- Change command color from italic to bold
- Use table formatting for auth list with status column
- Add relative time display for last used (verbose mode)
- Use styled headers, subheaders, and examples in help
- Add info box display for profile creation success
- Maintain JSON output mode unchanged for scripting
- Redesign help command with hero box and styled sections
- Add table formatting for profile list with status indicators
- Use semantic colors consistently (command, path, success, warning)
- Profile create shows info box on success
- Maintain NO_COLOR compliance for all output