@kaitranntt/ccs 5.3.0-beta.1 → 5.3.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,7 +94,7 @@ class ShellCompletionInstaller {
94
94
  /**
95
95
  * Install bash completion
96
96
  */
97
- installBash() {
97
+ installBash(force = false) {
98
98
  const rcFile = path.join(this.homeDir, '.bashrc');
99
99
  const completionPath = path.join(this.completionDir, 'ccs.bash');
100
100
  if (!fs.existsSync(completionPath)) {
@@ -107,7 +107,15 @@ class ShellCompletionInstaller {
107
107
  if (fs.existsSync(rcFile)) {
108
108
  const content = fs.readFileSync(rcFile, 'utf8');
109
109
  if (content.includes(marker)) {
110
- return { success: true, alreadyInstalled: true };
110
+ if (!force) {
111
+ return { success: true, alreadyInstalled: true };
112
+ }
113
+ // Force: completion files already updated by ensureCompletionFiles()
114
+ return {
115
+ success: true,
116
+ message: `Updated completion files in ${this.completionDir}`,
117
+ reload: 'source ~/.bashrc',
118
+ };
111
119
  }
112
120
  }
113
121
  // Append to .bashrc
@@ -121,7 +129,7 @@ class ShellCompletionInstaller {
121
129
  /**
122
130
  * Install zsh completion
123
131
  */
124
- installZsh() {
132
+ installZsh(force = false) {
125
133
  const rcFile = path.join(this.homeDir, '.zshrc');
126
134
  const completionPath = path.join(this.completionDir, 'ccs.zsh');
127
135
  const zshCompDir = path.join(this.homeDir, '.zsh', 'completion');
@@ -130,7 +138,7 @@ class ShellCompletionInstaller {
130
138
  }
131
139
  // Create zsh completion directory (with file conflict checking)
132
140
  this.ensureDirectory(zshCompDir);
133
- // Copy to zsh completion directory
141
+ // Copy to zsh completion directory (always update for force)
134
142
  const destFile = path.join(zshCompDir, '_ccs');
135
143
  fs.copyFileSync(completionPath, destFile);
136
144
  const marker = '# CCS shell completion';
@@ -140,7 +148,15 @@ class ShellCompletionInstaller {
140
148
  if (fs.existsSync(rcFile)) {
141
149
  const content = fs.readFileSync(rcFile, 'utf8');
142
150
  if (content.includes(marker)) {
143
- return { success: true, alreadyInstalled: true };
151
+ if (!force) {
152
+ return { success: true, alreadyInstalled: true };
153
+ }
154
+ // Force: files already updated above
155
+ return {
156
+ success: true,
157
+ message: `Updated ${destFile}`,
158
+ reload: 'source ~/.zshrc',
159
+ };
144
160
  }
145
161
  }
146
162
  // Append to .zshrc
@@ -154,7 +170,7 @@ class ShellCompletionInstaller {
154
170
  /**
155
171
  * Install fish completion
156
172
  */
157
- installFish() {
173
+ installFish(force = false) {
158
174
  const completionPath = path.join(this.completionDir, 'ccs.fish');
159
175
  const fishCompDir = path.join(this.homeDir, '.config', 'fish', 'completions');
160
176
  if (!fs.existsSync(completionPath)) {
@@ -164,6 +180,10 @@ class ShellCompletionInstaller {
164
180
  this.ensureDirectory(fishCompDir);
165
181
  // Copy to fish completion directory (fish auto-loads from here)
166
182
  const destFile = path.join(fishCompDir, 'ccs.fish');
183
+ // Check if already installed
184
+ if (fs.existsSync(destFile) && !force) {
185
+ return { success: true, alreadyInstalled: true };
186
+ }
167
187
  fs.copyFileSync(completionPath, destFile);
168
188
  return {
169
189
  success: true,
@@ -174,7 +194,7 @@ class ShellCompletionInstaller {
174
194
  /**
175
195
  * Install PowerShell completion
176
196
  */
177
- installPowerShell() {
197
+ installPowerShell(force = false) {
178
198
  const profilePath = process.env.PROFILE ||
179
199
  path.join(this.homeDir, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');
180
200
  const completionPath = path.join(this.completionDir, 'ccs.ps1');
@@ -191,7 +211,15 @@ class ShellCompletionInstaller {
191
211
  if (fs.existsSync(profilePath)) {
192
212
  const content = fs.readFileSync(profilePath, 'utf8');
193
213
  if (content.includes(marker)) {
194
- return { success: true, alreadyInstalled: true };
214
+ if (!force) {
215
+ return { success: true, alreadyInstalled: true };
216
+ }
217
+ // Force: completion files already updated by ensureCompletionFiles()
218
+ return {
219
+ success: true,
220
+ message: `Updated completion files in ${this.completionDir}`,
221
+ reload: '. $PROFILE',
222
+ };
195
223
  }
196
224
  }
197
225
  // Append to PowerShell profile
@@ -205,23 +233,24 @@ class ShellCompletionInstaller {
205
233
  /**
206
234
  * Install for detected or specified shell
207
235
  */
208
- install(shell = null) {
236
+ install(shell = null, options = {}) {
209
237
  const targetShell = shell || this.detectShell();
238
+ const { force = false } = options;
210
239
  if (!targetShell) {
211
240
  throw new Error('Could not detect shell. Please specify: --bash, --zsh, --fish, or --powershell');
212
241
  }
213
- // Ensure completion files exist
242
+ // Ensure completion files exist (always copy latest)
214
243
  this.ensureCompletionFiles();
215
244
  // Install for target shell
216
245
  switch (targetShell) {
217
246
  case 'bash':
218
- return this.installBash();
247
+ return this.installBash(force);
219
248
  case 'zsh':
220
- return this.installZsh();
249
+ return this.installZsh(force);
221
250
  case 'fish':
222
- return this.installFish();
251
+ return this.installFish(force);
223
252
  case 'powershell':
224
- return this.installPowerShell();
253
+ return this.installPowerShell(force);
225
254
  default:
226
255
  throw new Error(`Unsupported shell: ${targetShell}`);
227
256
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shell-completion.js","sourceRoot":"","sources":["../../src/utils/shell-completion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell-completion.js","sourceRoot":"","sources":["../../src/utils/shell-completion.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaitranntt/ccs",
3
- "version": "5.3.0-beta.1",
3
+ "version": "5.3.0-beta.3",
4
4
  "description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6",
5
5
  "keywords": [
6
6
  "cli",
@@ -18,7 +18,7 @@ _ccs_completion() {
18
18
 
19
19
  # Top-level completion (first argument)
20
20
  if [[ ${COMP_CWORD} -eq 1 ]]; then
21
- local commands="auth doctor sync update"
21
+ local commands="auth profile doctor sync update"
22
22
  local flags="--help --version --shell-completion -h -v -sc"
23
23
  local profiles=""
24
24
 
@@ -45,6 +45,36 @@ _ccs_completion() {
45
45
  return 0
46
46
  fi
47
47
 
48
+ # profile subcommands
49
+ if [[ ${prev} == "profile" ]]; then
50
+ local profile_commands="create list remove --help -h"
51
+ COMPREPLY=( $(compgen -W "${profile_commands}" -- ${cur}) )
52
+ return 0
53
+ fi
54
+
55
+ # Completion for profile subcommands
56
+ if [[ ${COMP_WORDS[1]} == "profile" ]]; then
57
+ case "${prev}" in
58
+ remove|delete|rm)
59
+ # Complete with settings profile names
60
+ if [[ -f ~/.ccs/config.json ]]; then
61
+ local profiles=$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null || true)
62
+ COMPREPLY=( $(compgen -W "${profiles}" -- ${cur}) )
63
+ fi
64
+ return 0
65
+ ;;
66
+ create)
67
+ # Complete with create flags
68
+ COMPREPLY=( $(compgen -W "--base-url --api-key --model --force --yes -y" -- ${cur}) )
69
+ return 0
70
+ ;;
71
+ list)
72
+ # No flags for list
73
+ return 0
74
+ ;;
75
+ esac
76
+ fi
77
+
48
78
  # Completion for auth subcommands that need profile names
49
79
  if [[ ${COMP_WORDS[1]} == "auth" ]]; then
50
80
  case "${prev}" in
@@ -78,22 +78,23 @@ complete -c ccs -s v -l version -d 'Show version information'
78
78
  complete -c ccs -s sc -l shell-completion -d 'Install shell completion'
79
79
 
80
80
  # Commands - grouped with [cmd] prefix for visual distinction
81
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'auth' -d '[cmd] Manage multiple Claude accounts'
82
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'doctor' -d '[cmd] Run health check and diagnostics'
83
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'sync' -d '[cmd] Sync delegation commands and skills'
84
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'update' -d '[cmd] Update CCS to latest version'
81
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'auth' -d '[cmd] Manage multiple Claude accounts'
82
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'profile' -d '[cmd] Manage API profiles (create/remove)'
83
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'doctor' -d '[cmd] Run health check and diagnostics'
84
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'sync' -d '[cmd] Sync delegation commands and skills'
85
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'update' -d '[cmd] Update CCS to latest version'
85
86
 
86
87
  # Model profiles - grouped with [model] prefix for visual distinction
87
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'default' -d '[model] Default Claude Sonnet 4.5'
88
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'glm' -d '[model] GLM-4.6 (cost-optimized)'
89
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'glmt' -d '[model] GLM-4.6 with thinking mode'
90
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a 'kimi' -d '[model] Kimi for Coding (long-context)'
88
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'default' -d '[model] Default Claude Sonnet 4.5'
89
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'glm' -d '[model] GLM-4.6 (cost-optimized)'
90
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'glmt' -d '[model] GLM-4.6 with thinking mode'
91
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a 'kimi' -d '[model] Kimi for Coding (long-context)'
91
92
 
92
93
  # Custom model profiles - dynamic with [model] prefix
93
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a '(__fish_ccs_get_custom_settings_profiles)' -d '[model] Settings-based profile'
94
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a '(__fish_ccs_get_custom_settings_profiles)' -d '[model] Settings-based profile'
94
95
 
95
96
  # Account profiles - dynamic with [account] prefix
96
- complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor sync update' -a '(__fish_ccs_get_account_profiles)' -d '[account] Account-based profile'
97
+ complete -c ccs -n 'not __fish_seen_subcommand_from auth profile doctor sync update' -a '(__fish_ccs_get_account_profiles)' -d '[account] Account-based profile'
97
98
 
98
99
  # shell-completion subflags
99
100
  complete -c ccs -n '__fish_seen_argument -l shell-completion; or __fish_seen_argument -s sc' -l bash -d 'Install for bash'
@@ -132,3 +133,35 @@ complete -c ccs -n '__fish_ccs_using_auth_subcommand default' -a '(__fish_ccs_ge
132
133
 
133
134
  # doctor command flags
134
135
  complete -c ccs -n '__fish_seen_subcommand_from doctor' -s h -l help -d 'Show help for doctor command'
136
+
137
+ # Helper function to check if we're in profile context
138
+ function __fish_ccs_using_profile
139
+ __fish_seen_subcommand_from profile
140
+ end
141
+
142
+ # Helper function to check specific profile subcommand
143
+ function __fish_ccs_using_profile_subcommand
144
+ set -l subcommand $argv[1]
145
+ __fish_ccs_using_profile; and __fish_seen_subcommand_from $subcommand
146
+ end
147
+
148
+ # profile subcommands
149
+ complete -c ccs -n '__fish_ccs_using_profile; and not __fish_seen_subcommand_from create list remove' -a 'create' -d 'Create new API profile'
150
+ complete -c ccs -n '__fish_ccs_using_profile; and not __fish_seen_subcommand_from create list remove' -a 'list' -d 'List all profiles'
151
+ complete -c ccs -n '__fish_ccs_using_profile; and not __fish_seen_subcommand_from create list remove' -a 'remove' -d 'Remove a profile'
152
+
153
+ # profile command flags
154
+ complete -c ccs -n '__fish_ccs_using_profile' -s h -l help -d 'Show help for profile commands'
155
+
156
+ # profile create flags
157
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -l base-url -d 'API base URL'
158
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -l api-key -d 'API key'
159
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -l model -d 'Default model'
160
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -l force -d 'Overwrite existing profile'
161
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -l yes -d 'Skip prompts'
162
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand create' -s y -d 'Skip prompts'
163
+
164
+ # profile remove - profile names and flags
165
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand remove' -a '(__fish_ccs_get_settings_profiles)' -d 'Settings profile'
166
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand remove' -l yes -d 'Skip confirmation'
167
+ complete -c ccs -n '__fish_ccs_using_profile_subcommand remove' -s y -d 'Skip confirmation'
@@ -12,8 +12,10 @@
12
12
  Register-ArgumentCompleter -CommandName ccs -ScriptBlock {
13
13
  param($commandName, $wordToComplete, $commandAst, $fakeBoundParameters)
14
14
 
15
- $commands = @('auth', 'doctor', 'sync', 'update', '--help', '--version', '--shell-completion', '-h', '-v', '-sc')
15
+ $commands = @('auth', 'profile', 'doctor', 'sync', 'update', '--help', '--version', '--shell-completion', '-h', '-v', '-sc')
16
16
  $authCommands = @('create', 'list', 'show', 'remove', 'default', '--help', '-h')
17
+ $profileCommands = @('create', 'list', 'remove', '--help', '-h')
18
+ $profileCreateFlags = @('--base-url', '--api-key', '--model', '--force', '--yes', '-y')
17
19
  $shellCompletionFlags = @('--bash', '--zsh', '--fish', '--powershell')
18
20
  $listFlags = @('--verbose', '--json')
19
21
  $removeFlags = @('--yes', '-y')
@@ -170,4 +172,58 @@ Register-ArgumentCompleter -CommandName ccs -ScriptBlock {
170
172
  }
171
173
  }
172
174
  }
175
+
176
+ # profile subcommand completion
177
+ if ($words[1] -eq 'profile') {
178
+ if ($position -eq 3) {
179
+ # profile subcommands
180
+ $profileCommands | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
181
+ [System.Management.Automation.CompletionResult]::new(
182
+ $_,
183
+ $_,
184
+ 'ParameterValue',
185
+ $_
186
+ )
187
+ }
188
+ } elseif ($position -eq 4) {
189
+ # Profile names or flags for profile subcommands
190
+ switch ($words[2]) {
191
+ 'remove' {
192
+ $options = (Get-CcsProfiles -Type settings) + $removeFlags
193
+ $options | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
194
+ [System.Management.Automation.CompletionResult]::new(
195
+ $_,
196
+ $_,
197
+ 'ParameterValue',
198
+ $_
199
+ )
200
+ }
201
+ }
202
+ 'create' {
203
+ $profileCreateFlags | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
204
+ [System.Management.Automation.CompletionResult]::new(
205
+ $_,
206
+ $_,
207
+ 'ParameterValue',
208
+ $_
209
+ )
210
+ }
211
+ }
212
+ }
213
+ } elseif ($position -eq 5) {
214
+ # Flags after profile name
215
+ switch ($words[2]) {
216
+ 'remove' {
217
+ $removeFlags | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
218
+ [System.Management.Automation.CompletionResult]::new(
219
+ $_,
220
+ $_,
221
+ 'ParameterValue',
222
+ $_
223
+ )
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
173
229
  }
@@ -16,7 +16,7 @@
16
16
  # Color codes: 0;34=blue, 0;32=green, 0;33=yellow, 2;37=dim white
17
17
  # Pattern format: =(#b)(group1)(group2)==color_for_group1=color_for_group2
18
18
  # The leading '=' means no color for whole match, then each '=' assigns to each group
19
- zstyle ':completion:*:*:ccs:*:commands' list-colors '=(#b)(auth|doctor|sync|update)([[:space:]]#--[[:space:]]#*)==0\;34=2\;37'
19
+ zstyle ':completion:*:*:ccs:*:commands' list-colors '=(#b)(auth|profile|doctor|sync|update)([[:space:]]#--[[:space:]]#*)==0\;34=2\;37'
20
20
  zstyle ':completion:*:*:ccs:*:model-profiles' list-colors '=(#b)(default|glm|glmt|kimi|[^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;32=2\;37'
21
21
  zstyle ':completion:*:*:ccs:*:account-profiles' list-colors '=(#b)([^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;33=2\;37'
22
22
  zstyle ':completion:*:*:ccs:*' group-name ''
@@ -33,6 +33,7 @@ _ccs() {
33
33
  # Define top-level commands (padded for alignment)
34
34
  commands=(
35
35
  'auth:Manage multiple Claude accounts'
36
+ 'profile:Manage API profiles (create/remove)'
36
37
  'doctor:Run health check and diagnostics'
37
38
  'sync:Sync delegation commands and skills'
38
39
  'update:Update CCS to latest version'
@@ -90,6 +91,9 @@ _ccs() {
90
91
  auth)
91
92
  _ccs_auth
92
93
  ;;
94
+ profile)
95
+ _ccs_profile
96
+ ;;
93
97
  doctor)
94
98
  _arguments \
95
99
  '(- *)'{-h,--help}'[Show help for doctor command]'
@@ -110,6 +114,58 @@ _ccs() {
110
114
  esac
111
115
  }
112
116
 
117
+ _ccs_profile() {
118
+ local curcontext="$curcontext" state line
119
+ typeset -A opt_args
120
+
121
+ local -a profile_commands settings_profiles
122
+
123
+ # Define profile subcommands
124
+ profile_commands=(
125
+ 'create:Create new API profile (interactive)'
126
+ 'list:List all profiles'
127
+ 'remove:Remove a profile'
128
+ )
129
+
130
+ # Load settings profiles for remove command
131
+ if [[ -f ~/.ccs/config.json ]]; then
132
+ settings_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null)"})
133
+ fi
134
+
135
+ _arguments -C \
136
+ '(- *)'{-h,--help}'[Show help for profile commands]' \
137
+ '1: :->subcommand' \
138
+ '*:: :->subargs'
139
+
140
+ case $state in
141
+ subcommand)
142
+ _describe -t profile-commands 'profile commands' profile_commands
143
+ ;;
144
+
145
+ subargs)
146
+ case $words[1] in
147
+ create)
148
+ _arguments \
149
+ '1:profile name:' \
150
+ '--base-url[API base URL]:url:' \
151
+ '--api-key[API key]:key:' \
152
+ '--model[Default model]:model:' \
153
+ '--force[Overwrite existing profile]' \
154
+ {--yes,-y}'[Skip prompts]'
155
+ ;;
156
+ list)
157
+ # No arguments
158
+ ;;
159
+ remove|delete|rm)
160
+ _arguments \
161
+ '1:profile:($settings_profiles)' \
162
+ {--yes,-y}'[Skip confirmation]'
163
+ ;;
164
+ esac
165
+ ;;
166
+ esac
167
+ }
168
+
113
169
  _ccs_auth() {
114
170
  local curcontext="$curcontext" state line
115
171
  typeset -A opt_args