- Simplify test files by removing custom TestRunner class
- Use standard Node.js assert module across all unit tests
- Update CLAUDE.md with streamlined development instructions
- Update tests/README.md with current testing approach
- Reduce boilerplate in delegation and GLMT test suites (652 lines removed)
Root cause: CLIProxyAPI saves Gemini tokens without prefix
({email}-{projectID}.json), but CCS was only looking for
gemini-* files. Added content-based detection as fallback.
Changes:
- Added PROVIDER_TYPE_VALUES map for JSON type detection
- Added isTokenFileForProvider() for content-based detection
- Updated isAuthenticated() and getAuthStatus() with dual strategy
- Fixed triggerOAuth() success messaging and error hints
- Bumped patch version (3.0.8 -> 3.0.9)
- Add profile priority order (CLIProxy → settings → account → default)
- Document CLIProxy profile with OAuth auth, port 8317, binary location
- Include model mappings for gemini, codex, agy providers
- Add cliproxy/auth/ to profile-specific data
- Link to CLIProxyAPI GitHub repo
The npm publish was failing because:
1. Bun runtime was not installed (prepublishOnly uses bun commands)
2. dist/ was not built before publish
Added:
- oven-sh/setup-bun@v2 action
- bun install step
- bun run build step
Fixes critical auth bug where checking any JSON file in the auth
directory would incorrectly mark providers as authenticated. Now
validates that token files match provider-specific prefixes (gemini-,
codex-, antigravity-) to prevent OAuth skipping across providers.
Updates help command examples to use placeholder syntax and updates
CHANGELOG to reflect Qwen -> Antigravity provider name change.
- Add getEffectiveEnvVars() to read user overrides from ~/.ccs/{provider}.settings.json
- Add ensureProviderSettings() to create settings file from defaults on first run
- Update cliproxy-executor to use effective env vars with override support
- Export new functions from index.ts
Users can now customize model mappings by editing ~/.ccs/gemini.settings.json
or ~/.ccs/codex.settings.json. This enables:
- Using gemini-3-pro-preview for all model types
- Easy migration when new models release (gemini 4, 5, etc.)
- User takes full responsibility for custom settings
Default behavior unchanged - works out of box with bundled defaults.
- Add unified CLIProxy config supporting all providers concurrently
- Move CLIProxy files to ~/.ccs/cliproxy/ subdirectory
- Use flat auth directory structure for OAuth tokens
- Add provider-specific URL routing via /api/provider/{provider}
- Add base settings templates for gemini and codex
- Fix model registration with proper auth file discovery
Enables users to run `ccs gemini` and `ccs codex` concurrently
without config conflicts.
Phase 01 of "Deprecate Native Installers" plan:
- Add deprecation notice at script start with 3s delay
- Auto-attempt npm install when npm available
- Exit successfully on npm install success
- Graceful fallback to legacy install if npm fails or unavailable
- 100% backward compatibility maintained
Scripts now display:
- Prominent deprecation warning recommending npm
- Auto-redirect to npm installation
- Fallback warning when using legacy path
ASCII-only output per CLAUDE.md standards (no emojis).
Extract handleUpdateCommand logic from ccs.ts into new
src/commands/update-command.ts module. Reduces ccs.ts from 343→92
lines in this refactoring, continuing monolithic file breakdown.
Maintains all 39 passing tests and zero critical issues.
- Remove lib/ccs and lib/ccs.ps1 version updates (now bootstraps)
- Update comments explaining v4.5.0+ architecture
- Use ASCII markers [OK]/[X]/[!] instead of emojis
- Update next steps to reflect new file list
- Migrate package manager from npm to bun
- Add ESLint configuration with TypeScript support
- Add Prettier configuration and .prettierignore
- Format all TypeScript source files
- Update CLAUDE.md with bun instructions
- Verify 39 tests passing
Problem: Test suite was directly modifying user's personal ~/.ccs/
directory, causing configuration interference during development.
Solution:
- Add test-environment.js fixture with CCS_HOME env var support
- Update postinstall.js to respect CCS_HOME for test isolation
- Update config-manager.ts with getCcsHome() helper
- Update postinstall.test.js and cli.test.js to use isolated env
- Remove auto-install of .claude/ symlinks from postinstall
(users can run "ccs sync" to opt-in)
Benefits:
- Tests run in temp directories, no user config affected
- Users control when .claude/ items are installed via "ccs sync"
- All 39 tests passing with proper isolation
Phase 05: Migrate test imports from bin/ to dist/
- Update 19 test files to import from dist/ instead of bin/
- Update CLI path in cli.test.js and special-commands.test.js
- Update cross-platform.test.js to check dist/ directory
Phase 06: Cleanup & validation
- Remove bin/ directory (32 JS files)
- Fix ClaudeSymlinkManager import in doctor.ts
- Update postinstall.js to use dist/ modules
- Regenerate package-lock.json (now points to dist/ccs.js)
All 39 tests passing. TypeScript migration complete.
- Add reasoning-enforcer.ts with 4 effort-level prompts
- Add glmt-transformer.ts (~1000 LOC) for Anthropic/OpenAI format conversion
- Add glmt-proxy.ts (~530 LOC) HTTP proxy with SSE streaming
- Extend delta-accumulator.ts with state getters/setters for streaming
- All 39 tests passing
* fix: add missing commands/ccs.md symlink during npm install
Previously, the ClaudeSymlinkManager only created symlinks for the
commands/ccs directory and skills/ccs-delegation directory, but missed
the commands/ccs.md file. This resulted in an incomplete symlink structure
where users would see the ccs folder symlinked but not the ccs.md file.
Added commands/ccs.md to the ccsItems array to ensure all CCS components
are properly symlinked during installation.
Fixes: npm install now creates complete symlink structure for all CCS items
* chore: bump version to 4.3.9
* fix(postinstall): make ora dependency optional to fix missing ~/.ccs/.claude/ directory
The root cause was that `ora` module was not available during `npm install`
when the postinstall script runs, causing both:
- .claude/ directory copy to fail (ClaudeDirInstaller)
- Symlink creation to fail (ClaudeSymlinkManager)
This resulted in the ~/.ccs/.claude/ directory not being created.
Changes:
- Made ora import optional in ClaudeDirInstaller
- Made ora import optional in ClaudeSymlinkManager
- Both classes now gracefully fallback to console.log when ora is unavailable
- Postinstall now successfully creates ~/.ccs/.claude/ and symlinks
Tested: Clean install now properly creates all directories and symlinks
* chore: bump version to 4.3.7
Version 4.3.7 - Postinstall Fix Release
Changes:
- Fixed missing ~/.ccs/.claude/ directory during npm install
- Made ora dependency optional in installer utilities
- Added CHANGELOG entry documenting the fix
Files updated:
- VERSION: 4.3.6 -> 4.3.7
- package.json: version updated
- lib/ccs: version string updated
- lib/ccs.ps1: version string updated
- installers/install.sh: version string updated
- installers/install.ps1: version string updated
- CHANGELOG.md: added 4.3.7 release notes
* fix: handle ora v9 ES module compatibility
ora v9.0.0 is now an ES module, which requires using .default when
importing with CommonJS require(). This was causing "ora is not a
function" errors in doctor.js and installer utilities.
Changes:
- Updated ora import to use oraModule.default || oraModule
- Added fallback spinner implementation for when ora is unavailable
- Ensures compatibility with both ES and CommonJS module systems
- Fixes ccs doctor command and postinstall script
Tested:
- ccs doctor now works correctly with spinners
- postinstall successfully creates ~/.ccs/.claude/ and symlinks
- Fallback console.log works when ora is unavailable
* chore: update package-lock.json
* chore: bump version to 4.3.8
Version 4.3.8 - ora v9 Compatibility Release
Changes:
- Fixed ora v9 ES module compatibility issues
- Updated CHANGELOG with 4.3.8 release notes
Files updated:
- VERSION: 4.3.7 -> 4.3.8
- package.json: version updated
- lib/ccs: version string updated
- lib/ccs.ps1: version string updated
- installers/install.sh: version string updated
- installers/install.ps1: version string updated
- CHANGELOG.md: added 4.3.8 release notes
* fix(postinstall): make ora dependency optional to fix missing ~/.ccs/.claude/ directory
The root cause was that `ora` module was not available during `npm install`
when the postinstall script runs, causing both:
- .claude/ directory copy to fail (ClaudeDirInstaller)
- Symlink creation to fail (ClaudeSymlinkManager)
This resulted in the ~/.ccs/.claude/ directory not being created.
Changes:
- Made ora import optional in ClaudeDirInstaller
- Made ora import optional in ClaudeSymlinkManager
- Both classes now gracefully fallback to console.log when ora is unavailable
- Postinstall now successfully creates ~/.ccs/.claude/ and symlinks
Tested: Clean install now properly creates all directories and symlinks
* chore: bump version to 4.3.7
Version 4.3.7 - Postinstall Fix Release
Changes:
- Fixed missing ~/.ccs/.claude/ directory during npm install
- Made ora dependency optional in installer utilities
- Added CHANGELOG entry documenting the fix
Files updated:
- VERSION: 4.3.6 -> 4.3.7
- package.json: version updated
- lib/ccs: version string updated
- lib/ccs.ps1: version string updated
- installers/install.sh: version string updated
- installers/install.ps1: version string updated
- CHANGELOG.md: added 4.3.7 release notes
* feat(shared): add plugin support to shared directories
Add Claude Code plugins to the .ccs/shared/ symlink architecture,
enabling plugin sharing across all CCS profiles (GLM, GLMT, Kimi, etc).
Changes:
- SharedManager: Add 'plugins' to sharedDirs array
- Help text: Update all three implementations (Node.js, bash, PowerShell)
- Postinstall: Create ~/.ccs/shared/plugins/ directory on install
Architecture:
~/.claude/plugins/ <- ~/.ccs/shared/plugins/ <- instance/plugins/
This follows the existing pattern for commands/skills/agents and
maintains cross-platform compatibility with Windows fallback support.
* chore: bump version to 4.3.6
* docs: update CHANGELOG for v4.3.6
This commit refactors the CCS delegation mechanism to introduce auto-activation
for eligible tasks and clarifies the delegation workflow.
Key changes include:
- Removal of the dedicated `ccs-delegator` agent, as its functionality is
now integrated and managed by the `ccs-delegation` skill.
- `allowed-tools` declarations have been removed from `ccs:glm`, `ccs:kimi`,
and their `continue` commands, streamlining tool management under the skill.
- Introduction of `CLAUDE.md.template` for `ccs-delegation` to standardize
auto-delegation configuration.
- Significant updates to the `ccs-delegation` skill (`SKILL.md`),
including:
- Auto-activation based on task patterns (e.g., "fix typos", "add tests").
- Defined user invocation patterns for explicit delegation (e.g., "use ccs glm").
- Agent response protocol for validating, enhancing, and executing delegated tasks.
- Clearer decision framework and examples for delegation eligibility.
- Deletion of `references/README.md` and `references/delegation-guidelines.md`
as their content is now integrated or no longer relevant.
- Renaming `references/headless-workflow.md` to `docs/headless-workflow.md`
to better reflect its documentation nature.
- Modification of `references/troubleshooting.md` to align with the new structure.
These changes aim to make the delegation process more autonomous, user-friendly,
and robust by centralizing control within the `ccs-delegation` skill and
improving documentation organization.
* feat(completion): improve fish shell completion with category prefixes
- Remove problematic inline set_color commands that prevented descriptions from displaying
- Add [cmd], [model], and [account] prefixes to visually group completions
- Update file header to document categorization features
This brings fish completion quality closer to zsh by making categories
clear and ensuring descriptions actually display to users.
Fixes issue where fish completions showed no descriptions.
* chore: bump version to 4.3.1
* feat: enhance UX for 'ccs sync' and 'ccs doctor' commands
- Add ora spinners for real-time progress feedback
- Add cli-table3 for structured health check summary table
- Display detailed component information in doctor report
- Show file/directory counts during sync operations
- Improve visual hierarchy and readability
- Fix Unicode checkmark violation (replaced with [OK])
Breaking changes: None
Dependencies added: ora@^5.4.1, cli-table3@^0.6.5
Version bumped to 4.3.0
* fix: match doctor summary header width to table width
* feat: improve settings validation to check API keys, not just endpoints
- Check if API keys are configured or still placeholders
- Show 'Key configured' vs 'Placeholder key (not configured)'
- Previous message 'Valid (API: api.z.ai)' was misleading
- Now users can clearly see which profiles need API key configuration
- Warnings shown for placeholder keys (yellow [!])
* feat: add category grouping and alignment to doctor checks
- Group checks into logical categories: System, Configuration, Profiles & Delegation, System Health
- Add consistent padding (26 chars) for aligned columns
- Add 2-space indent for better visual hierarchy
- Separate categories with blank lines for better readability
- Much cleaner and easier to scan than before
* fix: perfect alignment for all doctor check output
- Use .padEnd(26) consistently for all component names
- Remove extra space before status icons
- Now all status icons [OK]/[X]/[!]/[i] align perfectly
- All component names pad to exactly 26 characters
Add comprehensive update functionality with intelligent notification system.
Supports manual update checking, automatic notifications every 24h, and works
across npm and direct installations with proper error handling.
Closes#12
* feat: add -sc short flag for --shell-completion
Add -sc as a short flag alias for --shell-completion,
matching the pattern of -h for --help and -v for --version.
Changes:
- bin/ccs.js: Add -sc support in help text and flag detection
- lib/ccs: Add -sc support in help text and flag detection
- lib/ccs.ps1: Add -sc support in help text and flag detection
* chore: bump version to 4.1.4
* chore: bump version to 4.1.5
* feat: emphasize concurrent account usage in auth help text
Update all auth-related help messages to emphasize the ability
to run multiple Claude accounts concurrently.
Changes:
- bin/ccs.js: "Run multiple Claude accounts concurrently"
- bin/auth/auth-commands.js: "CCS Concurrent Account Management"
- lib/ccs: Updated both main help and auth_help function
- lib/ccs.ps1: Updated both main help and Show-AuthHelp function
* feat: implement ccs update command across all platforms
Add cross-platform ccs update command to sync delegation commands
and skills from ~/.ccs/.claude/ to ~/.claude/. Replaces vague
"CCS items" wording with specific "delegation commands and skills".
Changes:
- bin/ccs.js: Add update command handler and update help text
- bin/utils/claude-symlink-manager.js: Update user-facing messages
- lib/ccs: Implement update_run() function with symlink logic
- lib/ccs.ps1: Implement Update-Run function with Junction/SymbolicLink support
Features:
- Automatically backs up existing files before symlinking
- Skips items that are already correctly symlinked
- Reports installed vs up-to-date counts
- Handles Windows permissions gracefully (suggests Admin/Developer Mode)
Cross-platform parity: bash, PowerShell, and Node.js now all support ccs update
* refactor: rename ccs update to ccs sync for clarity
Rename the update command to sync across all platforms to avoid
confusion with updating the CCS tool itself. The sync command
clearly communicates syncing delegation features from the CCS
package to ~/.claude/.
Changes:
- bin/ccs.js: Rename handleUpdateCommand → handleSyncCommand
- bin/utils/claude-symlink-manager.js: Rename update() → sync()
- lib/ccs: Rename update_run() → sync_run()
- lib/ccs.ps1: Rename Update-Run → Sync-Run
- All: Update help text "update" → "sync"
- All: Update messages "Updating" → "Syncing"
Command usage: ccs sync or ccs --sync
* fix: update GitHub documentation links to stable permalink
Update broken #usage anchor links to stable /blob/main/README.md
permalink format. This matches the format already used in PowerShell
version and ensures links always work.
Changes:
- bin/ccs.js: Update link from #usage to /blob/main/README.md
- lib/ccs: Update link from #usage to /blob/main/README.md
- Now consistent with lib/ccs.ps1 which already used this format
Old: https://github.com/kaitranntt/ccs#usage
New: https://github.com/kaitranntt/ccs/blob/main/README.md
* feat: add sync command and -sc flag to shell completions
Update all shell completion scripts to include the newly added
sync command and -sc short flag for --shell-completion.
Changes across all completion scripts (bash, zsh, fish, PowerShell):
- Add 'sync' command to completion suggestions
- Add '-sc' as short flag for '--shell-completion'
- Update fish to handle both -sc and --shell-completion for subflags
- Update PowerShell to recognize -sc for shell completion flags
- Add sync command description: "Sync delegation commands and skills"
This ensures tab completion discovers the sync command and users
can use both -sc and --shell-completion interchangeably.
* fix: standardize help text across all implementations
Fix inconsistencies in help text that appeared after merge from main.
Ensures all three implementations (bash, PowerShell, Node.js) display
identical help messages.
Changes:
- lib/ccs: Update "Delegation (Token Optimization)" → "Delegation (inside Claude Code CLI)"
- lib/ccs: Remove redundant /ccs:create line, simplify description
- lib/ccs.ps1: Add missing Delegation section
- All: Now use consistent messaging about delegation features
This ensures users see the same information regardless of which
platform they're using (Linux/macOS bash, Windows PowerShell, or npm).
* fix: update description text to emphasize concurrent sessions
Update outdated description in lib/ccs and lib/ccs.ps1 to match
the improved wording already in bin/ccs.js. The new description
better emphasizes running concurrent Claude CLI sessions.
Changes:
- lib/ccs: Update description to emphasize "Run different Claude CLI sessions concurrently"
- lib/ccs.ps1: Update description to match bash and Node.js versions
- Remove "(work, personal, team)" examples to keep description cleaner
- Emphasize "Run different Claude CLI sessions concurrently" over vague "Concurrent sessions"
Old: "Switch between multiple Claude accounts (work, personal, team) and
alternative models (GLM, Kimi) instantly. Concurrent sessions with
auto-recovery. Zero downtime."
New: "Switch between multiple Claude accounts and alternative models
(GLM, Kimi) instantly. Run different Claude CLI sessions concurrently
with auto-recovery. Zero downtime."
All three implementations now show identical, clearer description text.
* feat(cli): enhance version display formatting and delegation status
---------