@kaitranntt/ccs 5.9.0 → 5.10.0

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.
Files changed (96) hide show
  1. package/README.md +30 -2
  2. package/VERSION +1 -1
  3. package/dist/ccs.js +12 -0
  4. package/dist/ccs.js.map +1 -1
  5. package/dist/cliproxy/binary-manager.d.ts +2 -2
  6. package/dist/cliproxy/binary-manager.js +2 -2
  7. package/dist/cliproxy/model-catalog.d.ts +12 -0
  8. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  9. package/dist/cliproxy/model-catalog.js +31 -11
  10. package/dist/cliproxy/model-catalog.js.map +1 -1
  11. package/dist/cliproxy/model-config.d.ts.map +1 -1
  12. package/dist/cliproxy/model-config.js +14 -2
  13. package/dist/cliproxy/model-config.js.map +1 -1
  14. package/dist/cliproxy/platform-detector.d.ts +2 -2
  15. package/dist/cliproxy/platform-detector.js +1 -1
  16. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  17. package/dist/commands/cliproxy-command.js +92 -54
  18. package/dist/commands/cliproxy-command.js.map +1 -1
  19. package/dist/commands/config-command.d.ts +11 -0
  20. package/dist/commands/config-command.d.ts.map +1 -0
  21. package/dist/commands/config-command.js +111 -0
  22. package/dist/commands/config-command.js.map +1 -0
  23. package/dist/commands/help-command.d.ts.map +1 -1
  24. package/dist/commands/help-command.js +4 -1
  25. package/dist/commands/help-command.js.map +1 -1
  26. package/dist/glmt/glmt-proxy.d.ts +6 -0
  27. package/dist/glmt/glmt-proxy.d.ts.map +1 -1
  28. package/dist/glmt/glmt-proxy.js +23 -2
  29. package/dist/glmt/glmt-proxy.js.map +1 -1
  30. package/dist/management/doctor.d.ts.map +1 -1
  31. package/dist/management/doctor.js +19 -7
  32. package/dist/management/doctor.js.map +1 -1
  33. package/dist/ui/assets/form-utils-CE1K85pW.js +20 -0
  34. package/dist/ui/assets/icons-DJoMkiyK.js +1 -0
  35. package/dist/ui/assets/index-BxRTPSHw.js +9 -0
  36. package/dist/ui/assets/index-ks0hk5dc.css +1 -0
  37. package/dist/ui/assets/radix-ui-Ba6LUgyw.js +51 -0
  38. package/dist/ui/assets/react-vendor-CW-MU7-e.js +3 -0
  39. package/dist/ui/assets/tanstack-MD0629v8.js +4 -0
  40. package/dist/ui/favicon.ico +0 -0
  41. package/dist/ui/favicons/android-chrome-192x192.png +0 -0
  42. package/dist/ui/favicons/android-chrome-512x512.png +0 -0
  43. package/dist/ui/favicons/android-chrome-512x512.webp +0 -0
  44. package/dist/ui/favicons/apple-touch-icon.png +0 -0
  45. package/dist/ui/favicons/favicon-16x16.png +0 -0
  46. package/dist/ui/favicons/favicon-32x32.png +0 -0
  47. package/dist/ui/favicons/favicon.ico +0 -0
  48. package/dist/ui/index.html +30 -0
  49. package/dist/ui/logo/ccs-logo-256.png +0 -0
  50. package/dist/ui/logo/ccs-logo-zoomed-web.png +0 -0
  51. package/dist/ui/logo/ccs-social-media.png +0 -0
  52. package/dist/ui/logo/ccs-social-media.webp +0 -0
  53. package/dist/utils/port-utils.d.ts +19 -0
  54. package/dist/utils/port-utils.d.ts.map +1 -0
  55. package/dist/utils/port-utils.js +113 -0
  56. package/dist/utils/port-utils.js.map +1 -0
  57. package/dist/web-server/file-watcher.d.ts +15 -0
  58. package/dist/web-server/file-watcher.d.ts.map +1 -0
  59. package/dist/web-server/file-watcher.js +88 -0
  60. package/dist/web-server/file-watcher.js.map +1 -0
  61. package/dist/web-server/health-service.d.ts +35 -0
  62. package/dist/web-server/health-service.d.ts.map +1 -0
  63. package/dist/web-server/health-service.js +223 -0
  64. package/dist/web-server/health-service.js.map +1 -0
  65. package/dist/web-server/index.d.ts +25 -0
  66. package/dist/web-server/index.d.ts.map +1 -0
  67. package/dist/web-server/index.js +89 -0
  68. package/dist/web-server/index.js.map +1 -0
  69. package/dist/web-server/overview-routes.d.ts +7 -0
  70. package/dist/web-server/overview-routes.d.ts.map +1 -0
  71. package/dist/web-server/overview-routes.js +80 -0
  72. package/dist/web-server/overview-routes.js.map +1 -0
  73. package/dist/web-server/routes.d.ts +7 -0
  74. package/dist/web-server/routes.d.ts.map +1 -0
  75. package/dist/web-server/routes.js +444 -0
  76. package/dist/web-server/routes.js.map +1 -0
  77. package/dist/web-server/shared-routes.d.ts +7 -0
  78. package/dist/web-server/shared-routes.d.ts.map +1 -0
  79. package/dist/web-server/shared-routes.js +167 -0
  80. package/dist/web-server/shared-routes.js.map +1 -0
  81. package/dist/web-server/shutdown.d.ts +14 -0
  82. package/dist/web-server/shutdown.d.ts.map +1 -0
  83. package/dist/web-server/shutdown.js +36 -0
  84. package/dist/web-server/shutdown.js.map +1 -0
  85. package/dist/web-server/websocket.d.ts +14 -0
  86. package/dist/web-server/websocket.d.ts.map +1 -0
  87. package/dist/web-server/websocket.js +82 -0
  88. package/dist/web-server/websocket.js.map +1 -0
  89. package/package.json +26 -6
  90. package/scripts/clean-dist.js +46 -0
  91. package/scripts/completion/ccs.bash +69 -10
  92. package/scripts/completion/ccs.fish +128 -47
  93. package/scripts/completion/ccs.ps1 +179 -14
  94. package/scripts/completion/ccs.zsh +107 -28
  95. package/scripts/pre-release.sh +39 -0
  96. package/scripts/verify-bundle.js +49 -0
@@ -13,10 +13,8 @@
13
13
  # sudo cp scripts/completion/ccs.zsh /usr/local/share/zsh/site-functions/_ccs
14
14
 
15
15
  # Set up completion styles for better formatting and colors
16
- # Color codes: 0;34=blue, 0;32=green, 0;33=yellow, 2;37=dim white
17
- # Pattern format: =(#b)(group1)(group2)==color_for_group1=color_for_group2
18
- # The leading '=' means no color for whole match, then each '=' assigns to each group
19
- zstyle ':completion:*:*:ccs:*:commands' list-colors '=(#b)(auth|profile|doctor|sync|update)([[:space:]]#--[[:space:]]#*)==0\;34=2\;37'
16
+ zstyle ':completion:*:*:ccs:*:commands' list-colors '=(#b)(auth|api|cliproxy|doctor|sync|update)([[:space:]]#--[[:space:]]#*)==0\;34=2\;37'
17
+ zstyle ':completion:*:*:ccs:*:proxy-profiles' list-colors '=(#b)(gemini|codex|agy|qwen)([[:space:]]#--[[:space:]]#*)==0\;35=2\;37'
20
18
  zstyle ':completion:*:*:ccs:*:model-profiles' list-colors '=(#b)(default|glm|glmt|kimi|[^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;32=2\;37'
21
19
  zstyle ':completion:*:*:ccs:*:account-profiles' list-colors '=(#b)([^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;33=2\;37'
22
20
  zstyle ':completion:*:*:ccs:*' group-name ''
@@ -26,20 +24,29 @@ zstyle ':completion:*:*:ccs:*' list-rows-first true
26
24
  zstyle ':completion:*:*:ccs:*' menu select
27
25
 
28
26
  _ccs() {
29
- local -a commands settings_profiles_described account_profiles_described
27
+ local -a commands proxy_profiles settings_profiles_described account_profiles_described cliproxy_variants_described
30
28
  local curcontext="$curcontext" state line
31
29
  typeset -A opt_args
32
30
 
33
- # Define top-level commands (padded for alignment)
31
+ # Define top-level commands
34
32
  commands=(
35
33
  'auth:Manage multiple Claude accounts'
36
- 'profile:Manage API profiles (create/remove)'
34
+ 'api:Manage API profiles (create/remove)'
35
+ 'cliproxy:Manage CLIProxy variants and binary'
37
36
  'doctor:Run health check and diagnostics'
38
37
  'sync:Sync delegation commands and skills'
39
38
  'update:Update CCS to latest version'
40
39
  )
41
40
 
42
- # Define known settings profiles with descriptions (consistent padding)
41
+ # Define CLIProxy hardcoded profiles (OAuth providers)
42
+ proxy_profiles=(
43
+ 'gemini:Google Gemini (OAuth)'
44
+ 'codex:OpenAI Codex (OAuth)'
45
+ 'agy:Antigravity (OAuth)'
46
+ 'qwen:Qwen Code (OAuth)'
47
+ )
48
+
49
+ # Define known settings profiles with descriptions
43
50
  local -A profile_descriptions
44
51
  profile_descriptions=(
45
52
  'default' 'Default Claude Sonnet 4.5'
@@ -53,7 +60,6 @@ _ccs() {
53
60
  local -a raw_settings_profiles
54
61
  raw_settings_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null)"})
55
62
 
56
- # Add descriptions to settings profiles
57
63
  for profile in $raw_settings_profiles; do
58
64
  local desc="${profile_descriptions[$profile]:-Settings-based profile}"
59
65
  settings_profiles_described+=("${profile}:${desc}")
@@ -65,12 +71,21 @@ _ccs() {
65
71
  local -a raw_account_profiles
66
72
  raw_account_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/profiles.json 2>/dev/null)"})
67
73
 
68
- # Add descriptions to account profiles
69
74
  for profile in $raw_account_profiles; do
70
75
  account_profiles_described+=("${profile}:Account-based profile")
71
76
  done
72
77
  fi
73
78
 
79
+ # Load cliproxy variants from config.json
80
+ if [[ -f ~/.ccs/config.json ]]; then
81
+ local -a raw_cliproxy_variants
82
+ raw_cliproxy_variants=(${(f)"$(jq -r '.cliproxy | keys[]' ~/.ccs/config.json 2>/dev/null)"})
83
+
84
+ for variant in $raw_cliproxy_variants; do
85
+ cliproxy_variants_described+=("${variant}:CLIProxy variant")
86
+ done
87
+ fi
88
+
74
89
  _arguments -C \
75
90
  '(- *)'{-h,--help}'[Show help message]' \
76
91
  '(- *)'{-v,--version}'[Show version information]' \
@@ -80,10 +95,11 @@ _ccs() {
80
95
 
81
96
  case $state in
82
97
  command)
83
- # Describe commands and profiles with proper tagging for colors
84
98
  _describe -t commands 'commands' commands
99
+ _describe -t proxy-profiles 'CLIProxy profiles' proxy_profiles
85
100
  _describe -t model-profiles 'model profiles' settings_profiles_described
86
101
  _describe -t account-profiles 'account profiles' account_profiles_described
102
+ _describe -t cliproxy-variants 'CLIProxy variants' cliproxy_variants_described
87
103
  ;;
88
104
 
89
105
  args)
@@ -91,14 +107,32 @@ _ccs() {
91
107
  auth)
92
108
  _ccs_auth
93
109
  ;;
94
- profile)
95
- _ccs_profile
110
+ api)
111
+ _ccs_api
112
+ ;;
113
+ cliproxy)
114
+ _ccs_cliproxy
115
+ ;;
116
+ update)
117
+ _arguments \
118
+ '--force[Force reinstall current version]' \
119
+ '--beta[Install from dev channel]' \
120
+ '--dev[Install from dev channel]' \
121
+ '(- *)'{-h,--help}'[Show help]'
96
122
  ;;
97
123
  doctor)
98
124
  _arguments \
99
125
  '(- *)'{-h,--help}'[Show help for doctor command]'
100
126
  ;;
101
- --shell-completion)
127
+ gemini|codex|agy|qwen)
128
+ _arguments \
129
+ '--auth[Authenticate only]' \
130
+ '--config[Change model configuration]' \
131
+ '--logout[Clear authentication]' \
132
+ '--headless[Headless auth (for SSH)]' \
133
+ '(- *)'{-h,--help}'[Show help]'
134
+ ;;
135
+ --shell-completion|-sc)
102
136
  _arguments \
103
137
  '--bash[Install for bash]' \
104
138
  '--zsh[Install for zsh]' \
@@ -106,7 +140,6 @@ _ccs() {
106
140
  '--powershell[Install for PowerShell]'
107
141
  ;;
108
142
  *)
109
- # For profile names, complete with Claude CLI arguments
110
143
  _message 'Claude CLI arguments'
111
144
  ;;
112
145
  esac
@@ -114,32 +147,30 @@ _ccs() {
114
147
  esac
115
148
  }
116
149
 
117
- _ccs_profile() {
150
+ _ccs_api() {
118
151
  local curcontext="$curcontext" state line
119
152
  typeset -A opt_args
120
153
 
121
- local -a profile_commands settings_profiles
154
+ local -a api_commands settings_profiles
122
155
 
123
- # Define profile subcommands
124
- profile_commands=(
156
+ api_commands=(
125
157
  'create:Create new API profile (interactive)'
126
- 'list:List all profiles'
127
- 'remove:Remove a profile'
158
+ 'list:List all API profiles'
159
+ 'remove:Remove an API profile'
128
160
  )
129
161
 
130
- # Load settings profiles for remove command
131
162
  if [[ -f ~/.ccs/config.json ]]; then
132
163
  settings_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null)"})
133
164
  fi
134
165
 
135
166
  _arguments -C \
136
- '(- *)'{-h,--help}'[Show help for profile commands]' \
167
+ '(- *)'{-h,--help}'[Show help for api commands]' \
137
168
  '1: :->subcommand' \
138
169
  '*:: :->subargs'
139
170
 
140
171
  case $state in
141
172
  subcommand)
142
- _describe -t profile-commands 'profile commands' profile_commands
173
+ _describe -t api-commands 'api commands' api_commands
143
174
  ;;
144
175
 
145
176
  subargs)
@@ -154,7 +185,6 @@ _ccs_profile() {
154
185
  {--yes,-y}'[Skip prompts]'
155
186
  ;;
156
187
  list)
157
- # No arguments
158
188
  ;;
159
189
  remove|delete|rm)
160
190
  _arguments \
@@ -166,13 +196,64 @@ _ccs_profile() {
166
196
  esac
167
197
  }
168
198
 
199
+ _ccs_cliproxy() {
200
+ local curcontext="$curcontext" state line
201
+ typeset -A opt_args
202
+
203
+ local -a cliproxy_commands cliproxy_variants providers
204
+
205
+ cliproxy_commands=(
206
+ 'create:Create new CLIProxy variant profile'
207
+ 'list:List all CLIProxy variant profiles'
208
+ 'remove:Remove a CLIProxy variant profile'
209
+ )
210
+
211
+ providers=(gemini codex agy qwen)
212
+
213
+ if [[ -f ~/.ccs/config.json ]]; then
214
+ cliproxy_variants=(${(f)"$(jq -r '.cliproxy | keys[]' ~/.ccs/config.json 2>/dev/null)"})
215
+ fi
216
+
217
+ _arguments -C \
218
+ '(- *)'{-h,--help}'[Show help for cliproxy commands]' \
219
+ '--install[Install specific version]:version:' \
220
+ '--latest[Install latest version]' \
221
+ '1: :->subcommand' \
222
+ '*:: :->subargs'
223
+
224
+ case $state in
225
+ subcommand)
226
+ _describe -t cliproxy-commands 'cliproxy commands' cliproxy_commands
227
+ ;;
228
+
229
+ subargs)
230
+ case $words[1] in
231
+ create)
232
+ _arguments \
233
+ '1:variant name:' \
234
+ '--provider[Provider name]:provider:($providers)' \
235
+ '--model[Model name]:model:' \
236
+ '--force[Overwrite existing variant]' \
237
+ {--yes,-y}'[Skip prompts]'
238
+ ;;
239
+ list|ls)
240
+ ;;
241
+ remove|delete|rm)
242
+ _arguments \
243
+ '1:variant:($cliproxy_variants)' \
244
+ {--yes,-y}'[Skip confirmation]'
245
+ ;;
246
+ esac
247
+ ;;
248
+ esac
249
+ }
250
+
169
251
  _ccs_auth() {
170
252
  local curcontext="$curcontext" state line
171
253
  typeset -A opt_args
172
254
 
173
255
  local -a auth_commands account_profiles
174
256
 
175
- # Define auth subcommands
176
257
  auth_commands=(
177
258
  'create:Create new profile and login'
178
259
  'list:List all saved profiles'
@@ -181,7 +262,6 @@ _ccs_auth() {
181
262
  'default:Set default profile'
182
263
  )
183
264
 
184
- # Load account profiles
185
265
  if [[ -f ~/.ccs/profiles.json ]]; then
186
266
  account_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/profiles.json 2>/dev/null)"})
187
267
  fi
@@ -225,5 +305,4 @@ _ccs_auth() {
225
305
  esac
226
306
  }
227
307
 
228
- # Register the completion function
229
308
  _ccs "$@"
@@ -0,0 +1,39 @@
1
+ #!/bin/bash
2
+ # Pre-Release Checklist for CCS
3
+ set -euo pipefail
4
+
5
+ echo "=== Pre-Release Checklist ==="
6
+ echo ""
7
+
8
+ # 1. Version check
9
+ echo "[i] Current version: $(node -p "require('./package.json').version")"
10
+
11
+ # 2. Clean build
12
+ echo "[i] Clean build..."
13
+ rm -rf dist
14
+ bun run build:all
15
+
16
+ # 3. Bundle size
17
+ echo "[i] Bundle size check..."
18
+ node scripts/verify-bundle.js
19
+
20
+ # 4. Lint & typecheck
21
+ echo "[i] Lint & typecheck..."
22
+ bun run validate
23
+
24
+ # 5. Tests
25
+ echo "[i] Running tests..."
26
+ bun test
27
+
28
+ # 6. Help consistency check
29
+ echo "[i] Checking help text includes config command..."
30
+ if ! grep -q "ccs config" src/commands/help-command.ts; then
31
+ echo "[!] Missing config in help-command.ts"
32
+ fi
33
+
34
+ # 7. Package contents
35
+ echo "[i] Package contents..."
36
+ npm pack --dry-run 2>&1 | head -20
37
+
38
+ echo ""
39
+ echo "=== Ready for release ==="
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verify UI bundle size is under 1MB gzipped
5
+ * React + shadcn/ui dashboard typically ranges 600-900KB
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const zlib = require('zlib');
11
+
12
+ const UI_DIR = path.join(__dirname, '../dist/ui');
13
+ const MAX_SIZE = 1024 * 1024; // 1MB
14
+
15
+ function getGzipSize(filePath) {
16
+ const content = fs.readFileSync(filePath);
17
+ return zlib.gzipSync(content).length;
18
+ }
19
+
20
+ function walkDir(dir) {
21
+ let totalSize = 0;
22
+ const files = fs.readdirSync(dir, { withFileTypes: true });
23
+
24
+ for (const file of files) {
25
+ const filePath = path.join(dir, file.name);
26
+ if (file.isDirectory()) {
27
+ totalSize += walkDir(filePath);
28
+ } else {
29
+ totalSize += getGzipSize(filePath);
30
+ }
31
+ }
32
+
33
+ return totalSize;
34
+ }
35
+
36
+ if (!fs.existsSync(UI_DIR)) {
37
+ console.log('[!] dist/ui not found. Run bun run ui:build first.');
38
+ process.exit(1);
39
+ }
40
+
41
+ const totalSize = walkDir(UI_DIR);
42
+ const sizeKB = (totalSize / 1024).toFixed(1);
43
+
44
+ if (totalSize > MAX_SIZE) {
45
+ console.log(`[X] Bundle too large: ${sizeKB}KB gzipped (max: 1024KB)`);
46
+ process.exit(1);
47
+ } else {
48
+ console.log(`[OK] Bundle size: ${sizeKB}KB gzipped`);
49
+ }