@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.
- package/README.md +30 -2
- package/VERSION +1 -1
- package/dist/ccs.js +12 -0
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts +2 -2
- package/dist/cliproxy/binary-manager.js +2 -2
- package/dist/cliproxy/model-catalog.d.ts +12 -0
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +31 -11
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/model-config.d.ts.map +1 -1
- package/dist/cliproxy/model-config.js +14 -2
- package/dist/cliproxy/model-config.js.map +1 -1
- package/dist/cliproxy/platform-detector.d.ts +2 -2
- package/dist/cliproxy/platform-detector.js +1 -1
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +92 -54
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/config-command.d.ts +11 -0
- package/dist/commands/config-command.d.ts.map +1 -0
- package/dist/commands/config-command.js +111 -0
- package/dist/commands/config-command.js.map +1 -0
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +4 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/glmt/glmt-proxy.d.ts +6 -0
- package/dist/glmt/glmt-proxy.d.ts.map +1 -1
- package/dist/glmt/glmt-proxy.js +23 -2
- package/dist/glmt/glmt-proxy.js.map +1 -1
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +19 -7
- package/dist/management/doctor.js.map +1 -1
- package/dist/ui/assets/form-utils-CE1K85pW.js +20 -0
- package/dist/ui/assets/icons-DJoMkiyK.js +1 -0
- package/dist/ui/assets/index-BxRTPSHw.js +9 -0
- package/dist/ui/assets/index-ks0hk5dc.css +1 -0
- package/dist/ui/assets/radix-ui-Ba6LUgyw.js +51 -0
- package/dist/ui/assets/react-vendor-CW-MU7-e.js +3 -0
- package/dist/ui/assets/tanstack-MD0629v8.js +4 -0
- package/dist/ui/favicon.ico +0 -0
- package/dist/ui/favicons/android-chrome-192x192.png +0 -0
- package/dist/ui/favicons/android-chrome-512x512.png +0 -0
- package/dist/ui/favicons/android-chrome-512x512.webp +0 -0
- package/dist/ui/favicons/apple-touch-icon.png +0 -0
- package/dist/ui/favicons/favicon-16x16.png +0 -0
- package/dist/ui/favicons/favicon-32x32.png +0 -0
- package/dist/ui/favicons/favicon.ico +0 -0
- package/dist/ui/index.html +30 -0
- package/dist/ui/logo/ccs-logo-256.png +0 -0
- package/dist/ui/logo/ccs-logo-zoomed-web.png +0 -0
- package/dist/ui/logo/ccs-social-media.png +0 -0
- package/dist/ui/logo/ccs-social-media.webp +0 -0
- package/dist/utils/port-utils.d.ts +19 -0
- package/dist/utils/port-utils.d.ts.map +1 -0
- package/dist/utils/port-utils.js +113 -0
- package/dist/utils/port-utils.js.map +1 -0
- package/dist/web-server/file-watcher.d.ts +15 -0
- package/dist/web-server/file-watcher.d.ts.map +1 -0
- package/dist/web-server/file-watcher.js +88 -0
- package/dist/web-server/file-watcher.js.map +1 -0
- package/dist/web-server/health-service.d.ts +35 -0
- package/dist/web-server/health-service.d.ts.map +1 -0
- package/dist/web-server/health-service.js +223 -0
- package/dist/web-server/health-service.js.map +1 -0
- package/dist/web-server/index.d.ts +25 -0
- package/dist/web-server/index.d.ts.map +1 -0
- package/dist/web-server/index.js +89 -0
- package/dist/web-server/index.js.map +1 -0
- package/dist/web-server/overview-routes.d.ts +7 -0
- package/dist/web-server/overview-routes.d.ts.map +1 -0
- package/dist/web-server/overview-routes.js +80 -0
- package/dist/web-server/overview-routes.js.map +1 -0
- package/dist/web-server/routes.d.ts +7 -0
- package/dist/web-server/routes.d.ts.map +1 -0
- package/dist/web-server/routes.js +444 -0
- package/dist/web-server/routes.js.map +1 -0
- package/dist/web-server/shared-routes.d.ts +7 -0
- package/dist/web-server/shared-routes.d.ts.map +1 -0
- package/dist/web-server/shared-routes.js +167 -0
- package/dist/web-server/shared-routes.js.map +1 -0
- package/dist/web-server/shutdown.d.ts +14 -0
- package/dist/web-server/shutdown.d.ts.map +1 -0
- package/dist/web-server/shutdown.js +36 -0
- package/dist/web-server/shutdown.js.map +1 -0
- package/dist/web-server/websocket.d.ts +14 -0
- package/dist/web-server/websocket.d.ts.map +1 -0
- package/dist/web-server/websocket.js +82 -0
- package/dist/web-server/websocket.js.map +1 -0
- package/package.json +26 -6
- package/scripts/clean-dist.js +46 -0
- package/scripts/completion/ccs.bash +69 -10
- package/scripts/completion/ccs.fish +128 -47
- package/scripts/completion/ccs.ps1 +179 -14
- package/scripts/completion/ccs.zsh +107 -28
- package/scripts/pre-release.sh +39 -0
- 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
|
-
|
|
17
|
-
|
|
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
|
|
31
|
+
# Define top-level commands
|
|
34
32
|
commands=(
|
|
35
33
|
'auth:Manage multiple Claude accounts'
|
|
36
|
-
'
|
|
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
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
+
_ccs_api() {
|
|
118
151
|
local curcontext="$curcontext" state line
|
|
119
152
|
typeset -A opt_args
|
|
120
153
|
|
|
121
|
-
local -a
|
|
154
|
+
local -a api_commands settings_profiles
|
|
122
155
|
|
|
123
|
-
|
|
124
|
-
profile_commands=(
|
|
156
|
+
api_commands=(
|
|
125
157
|
'create:Create new API profile (interactive)'
|
|
126
|
-
'list:List all profiles'
|
|
127
|
-
'remove:Remove
|
|
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
|
|
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
|
|
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
|
+
}
|