@halilertekin/claude-code-router-config 2.0.7 → 2.0.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.9
4
+ - GLM print mode disables attachments to avoid EMFILE (too many open files) watcher errors.
5
+
6
+ ## 2.0.8
7
+ - GLM setup now installs direct z.ai `glm` wrapper by default and keeps `glm-ccr` for router usage.
8
+ - Safer `.env` loading in `ccc` (ignores comments/invalid lines) and updated setup docs.
9
+
3
10
  ## 2.0.7
4
11
  - Security: qs arrayLimit bypass fix (force qs 6.14.1).
5
12
 
package/NPM_README.md CHANGED
@@ -26,13 +26,17 @@ CCR_CONFIG_OVERWRITE=1 ccr-setup
26
26
  ccr-setup --overwrite
27
27
  ```
28
28
 
29
- ### One-shot GLM setup (Claude login + GLM API)
29
+ ### One-shot GLM setup (z.ai GLM API)
30
30
 
31
31
  ```bash
32
32
  npx -y -p @halilertekin/claude-code-router-config ccr-glm-setup --key "YOUR_GLM_API_KEY"
33
33
  source ~/.zshrc
34
34
  glm
35
35
  ```
36
+ Direct z.ai is the default. If you want the router version:
37
+ ```bash
38
+ glm-ccr
39
+ ```
36
40
 
37
41
  ## Features
38
42
 
@@ -82,8 +86,10 @@ After installation:
82
86
 
83
87
  2. **Add to shell** (`~/.zshrc` or `~/.bashrc`):
84
88
  ```bash
85
- # Load .env variables
86
- export $(cat ~/.env | xargs)
89
+ # Load .env variables (safe with comments)
90
+ set -a
91
+ source ~/.env
92
+ set +a
87
93
 
88
94
  # Router connection
89
95
  export ANTHROPIC_BASE_URL="http://127.0.0.1:3456"
package/README.md CHANGED
@@ -1,15 +1,18 @@
1
1
  # Claude Code Router Config - Advanced Multi-Provider Setup
2
2
 
3
- 🚀 **v2.0.7** - Unified router + config package with z.ai (GLM 4.7) support, advanced CLI tools, analytics, smart routing, and configuration templates!
3
+ 🚀 **v2.0.9** - Unified router + config package with z.ai (GLM 4.7) support, advanced CLI tools, analytics, smart routing, and configuration templates!
4
4
 
5
5
  Use Claude Code as a single interface to access multiple AI providers with intelligent routing for optimal performance, cost, and quality.
6
6
 
7
- ## ✨ New in v2.0.7
7
+ ## ✨ New in v2.0.9
8
+ - `glm`/`glm-ccr` print mode disables attachments to avoid EMFILE (too many open files) watcher errors.
9
+
10
+ Includes all v2.0.8 improvements:
8
11
  - UI üzerinden `.env` anahtarları ekleme/güncelleme (TR/NL).
9
12
  - `~/.env` otomatik yükleme ile API anahtarlarının bulunması (CLI + health monitor).
10
13
  - **z.ai Support**: Native integration for GLM-4.7 via z.ai (PPInfra).
11
14
  - **Lightweight Mode**: New `ccc` function for zero-dependency routing.
12
- - **Direct GLM Alias**: Type `glm` to launch Claude Code with GLM-4.7 immediately.
15
+ - **Direct GLM Alias**: `glm` now launches GLM-4.7 directly via z.ai; `glm-ccr` keeps router mode.
13
16
  - **Non-interactive install**: CI-friendly installer flags and env controls.
14
17
  - **Unified router**: Built-in router service, no external dependency required.
15
18
  - **UI refresh**: Daha sade ve responsive tasarım, TR/NL dil desteği.
@@ -40,7 +43,8 @@ If you just want to use the `ccc` command (Claude Code Commander) and `glm` alia
40
43
  4. **Reload & Run:**
41
44
  ```bash
42
45
  source ~/.zshrc
43
- glm # Launches GLM-4.7 via z.ai
46
+ glm # Launches GLM-4.7 via z.ai (direct)
47
+ glm-ccr # Launches GLM-4.7 via local router
44
48
  ccc ds # Launches DeepSeek
45
49
  ccc claude # Launches Official Claude (Pro)
46
50
  ```
package/cli/ccc.zsh CHANGED
@@ -8,9 +8,41 @@ ccc() {
8
8
  shift 1 2>/dev/null
9
9
  local extra_args=("$@")
10
10
 
11
- # Load keys from multiple sources for redundancy
12
- [[ -f ~/.ccm_config ]] && source ~/.ccm_config 2>/dev/null
13
- [[ -f ~/.env ]] && source ~/.env 2>/dev/null
11
+ load_env_file() {
12
+ local env_file="$1"
13
+ [[ -f "$env_file" ]] || return 0
14
+ local line key val
15
+ while IFS= read -r line || [[ -n "$line" ]]; do
16
+ line="${line%$'\r'}"
17
+ line="${line%%#*}"
18
+ line="${line#"${line%%[![:space:]]*}"}"
19
+ line="${line%"${line##*[![:space:]]}"}"
20
+ [[ -z "$line" ]] && continue
21
+ line="${line#export }"
22
+ [[ "$line" == *"="* ]] || continue
23
+ key="${line%%=*}"
24
+ val="${line#*=}"
25
+ key="${key#"${key%%[![:space:]]*}"}"
26
+ key="${key%"${key##*[![:space:]]}"}"
27
+ val="${val#"${val%%[![:space:]]*}"}"
28
+ val="${val%"${val##*[![:space:]]}"}"
29
+ if [[ ${#val} -ge 2 ]]; then
30
+ if [[ "$val" == \"*\" && "$val" == *\" ]]; then
31
+ val="${val:1:-1}"
32
+ elif [[ "$val" == \'*\' && "$val" == *\' ]]; then
33
+ val="${val:1:-1}"
34
+ fi
35
+ fi
36
+ if [[ "$key" == [A-Za-z_][A-Za-z0-9_]* ]]; then
37
+ export "$key=$val"
38
+ fi
39
+ done < "$env_file"
40
+ }
41
+
42
+ # Load keys from multiple sources for redundancy (safe parser)
43
+ load_env_file "$HOME/.ccm_config"
44
+ load_env_file "$HOME/.env"
45
+ load_env_file "$HOME/.claude-code-router/keys.env"
14
46
 
15
47
  # 1. CLEANUP: Remove all env vars that might interfere with Claude Pro
16
48
  unset ANTHROPIC_BASE_URL ANTHROPIC_API_KEY ANTHROPIC_MODEL ANTHROPIC_AUTH_TOKEN API_TIMEOUT_MS
@@ -31,6 +63,13 @@ ccc() {
31
63
  export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-4.7"
32
64
  export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-4.7"
33
65
  export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-4.5-air"
66
+ export ANTHROPIC_SMALL_FAST_MODEL="glm-4.5-air"
67
+ export CLAUDE_CODE_SUBAGENT_MODEL="glm-4.7"
68
+
69
+ if [[ -z "$ANTHROPIC_API_KEY" ]]; then
70
+ echo "GLM_API_KEY not set. Add it to ~/.env or ~/.claude-code-router/keys.env" >&2
71
+ return 1
72
+ fi
34
73
 
35
74
  echo "🔄 Provider: z.ai (GLM 4.7)"
36
75
  ;;
@@ -57,8 +57,10 @@ The installer automatically creates configuration files and an `.env.example` fi
57
57
 
58
58
  3. **Add to shell configuration:**
59
59
  ```bash
60
- # Add to ~/.zshrc or ~/.bashrc
61
- export $(cat ~/.env | xargs)
60
+ # Add to ~/.zshrc or ~/.bashrc (safe .env load)
61
+ set -a
62
+ source ~/.env
63
+ set +a
62
64
  export ANTHROPIC_BASE_URL="http://127.0.0.1:3456"
63
65
  export NO_PROXY="127.0.0.1"
64
66
  ```
@@ -139,7 +141,9 @@ The router automatically routes requests to the most appropriate provider based
139
141
  ls -la ~/.env
140
142
 
141
143
  # Manually source environment
142
- export $(cat ~/.env | xargs)
144
+ set -a
145
+ source ~/.env
146
+ set +a
143
147
  ```
144
148
 
145
149
  4. **Router Fails to Start**
package/docs/README_EN.md CHANGED
@@ -35,6 +35,11 @@ chmod +x install.sh
35
35
  ```bash
36
36
  ./setup-glm.sh --key "YOUR_GLM_API_KEY"
37
37
  ```
38
+ Then run:
39
+ ```bash
40
+ glm # direct z.ai
41
+ glm-ccr # via local router
42
+ ```
38
43
 
39
44
  ## Manual Setup
40
45
 
package/install.js CHANGED
@@ -113,8 +113,10 @@ async function showNextSteps() {
113
113
 
114
114
  console.log('\n2. Add environment variables to your shell (~/.zshrc or ~/.bashrc):');
115
115
  console.log(chalk.cyan(`
116
- # Claude Code Router
117
- export $(cat ~/.env | xargs)
116
+ # Claude Code Router (safe .env load)
117
+ set -a
118
+ source ~/.env
119
+ set +a
118
120
  export ANTHROPIC_BASE_URL="http://127.0.0.1:3456"
119
121
  export NO_PROXY="127.0.0.1"
120
122
  `));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@halilertekin/claude-code-router-config",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "Multi-provider configuration for Claude Code Router with intent-based routing, advanced CLI tools, analytics, and smart routing. Setup OpenAI, Anthropic, Gemini, Qwen, GLM, OpenRouter, and GitHub Copilot with intelligent routing.",
5
5
  "main": "install.js",
6
6
  "bin": {
package/setup-glm.sh CHANGED
@@ -20,8 +20,8 @@ usage() {
20
20
  Usage: ./setup-glm.sh [--key <GLM_API_KEY>] [--skip-install] [--non-interactive]
21
21
 
22
22
  Installs/updates CCR (if missing), writes GLM-only config,
23
- creates ~/.claude-code-router/keys.env, and installs a single
24
- command: glm (plus aliases ccc and claude-glm).
23
+ creates ~/.claude-code-router/keys.env, and installs commands:
24
+ glm (direct z.ai) + glm-ccr (router) + aliases ccc and claude-glm.
25
25
 
26
26
  Options:
27
27
  --key <GLM_API_KEY> Provide GLM key non-interactively
@@ -210,6 +210,81 @@ export ANTHROPIC_DEFAULT_HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-glm,glm-4
210
210
  export ANTHROPIC_SMALL_FAST_MODEL="${ANTHROPIC_SMALL_FAST_MODEL:-glm,glm-4.5-air}"
211
211
  export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-glm,glm-4.7}"
212
212
 
213
+ # Avoid file watcher exhaustion in non-interactive mode.
214
+ if [[ " $* " == *" -p "* || " $* " == *" --print "* ]]; then
215
+ export CLAUDE_CODE_DISABLE_ATTACHMENTS=1
216
+ fi
217
+
218
+ CLAUDE_BIN="$HOME/.claude/local/claude"
219
+ if [[ ! -x "$CLAUDE_BIN" ]]; then
220
+ CLAUDE_BIN="$(command -v claude || true)"
221
+ fi
222
+ if [[ -z "${CLAUDE_BIN:-}" ]]; then
223
+ echo "claude binary not found. Install Claude Code first." >&2
224
+ exit 1
225
+ fi
226
+
227
+ "$CLAUDE_BIN" "$@"
228
+ EOS
229
+ cat > "$BIN_DIR/glm-zai" <<'EOS'
230
+ #!/usr/bin/env bash
231
+ set -euo pipefail
232
+
233
+ ROUTER_DIR="$HOME/.claude-code-router"
234
+ KEYS_FILE="$ROUTER_DIR/keys.env"
235
+
236
+ load_keys() {
237
+ if [[ -f "$KEYS_FILE" ]]; then
238
+ while IFS= read -r line || [[ -n "$line" ]]; do
239
+ line="${line%$'\r'}"
240
+ line="${line%%#*}"
241
+ line="$(echo "$line" | sed -E 's/^[[:space:]]*//; s/[[:space:]]*$//')"
242
+ [[ -z "$line" ]] && continue
243
+ if [[ "$line" =~ ^(export[[:space:]]+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
244
+ key="${BASH_REMATCH[2]}"
245
+ val="${BASH_REMATCH[3]}"
246
+ val="$(echo "$val" | sed -E 's/^[[:space:]]*//; s/[[:space:]]*$//')"
247
+ if [[ ${#val} -ge 2 ]]; then
248
+ if [[ "${val:0:1}" == "\"" && "${val: -1}" == "\"" ]]; then
249
+ val="${val:1:-1}"
250
+ elif [[ "${val:0:1}" == "'" && "${val: -1}" == "'" ]]; then
251
+ val="${val:1:-1}"
252
+ fi
253
+ fi
254
+ val="${val%$'\r'}"
255
+ if [[ -n "$val" ]]; then
256
+ export "$key=$val"
257
+ fi
258
+ fi
259
+ done < "$KEYS_FILE"
260
+ fi
261
+ }
262
+
263
+ load_keys
264
+
265
+ if [[ -z "${GLM_API_KEY:-}" ]]; then
266
+ echo "GLM_API_KEY not set. Add it to ~/.claude-code-router/keys.env" >&2
267
+ exit 1
268
+ fi
269
+
270
+ # Direct z.ai (Anthropic-compatible) - no router required.
271
+ export ANTHROPIC_AUTH_TOKEN="${GLM_API_KEY}"
272
+ export ANTHROPIC_API_KEY="${GLM_API_KEY}"
273
+ export ANTHROPIC_BASE_URL="https://api.z.ai/api/anthropic"
274
+ export API_TIMEOUT_MS="${API_TIMEOUT_MS:-3000000}"
275
+
276
+ export ANTHROPIC_MODEL="${ANTHROPIC_MODEL:-glm-4.7}"
277
+ export ANTHROPIC_DEFAULT_OPUS_MODEL="${ANTHROPIC_DEFAULT_OPUS_MODEL:-glm-4.7}"
278
+ export ANTHROPIC_DEFAULT_SONNET_MODEL="${ANTHROPIC_DEFAULT_SONNET_MODEL:-glm-4.7}"
279
+ export ANTHROPIC_DEFAULT_HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-glm-4.5-air}"
280
+ export ANTHROPIC_SMALL_FAST_MODEL="${ANTHROPIC_SMALL_FAST_MODEL:-glm-4.5-air}"
281
+ export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-glm-4.7}"
282
+
283
+ # Avoid file watcher exhaustion in non-interactive mode.
284
+ if [[ " $* " == *" -p "* || " $* " == *" --print "* ]]; then
285
+ export CLAUDE_CODE_DISABLE_ATTACHMENTS=1
286
+ fi
287
+
213
288
  CLAUDE_BIN="$HOME/.claude/local/claude"
214
289
  if [[ ! -x "$CLAUDE_BIN" ]]; then
215
290
  CLAUDE_BIN="$(command -v claude || true)"
@@ -221,10 +296,11 @@ fi
221
296
 
222
297
  "$CLAUDE_BIN" "$@"
223
298
  EOS
224
- chmod +x "$BIN_DIR/ccr-glm"
225
- ln -sf "$BIN_DIR/ccr-glm" "$BIN_DIR/glm"
226
- ln -sf "$BIN_DIR/ccr-glm" "$BIN_DIR/ccc"
227
- ln -sf "$BIN_DIR/ccr-glm" "$BIN_DIR/claude-glm"
299
+ chmod +x "$BIN_DIR/ccr-glm" "$BIN_DIR/glm-zai"
300
+ ln -sf "$BIN_DIR/glm-zai" "$BIN_DIR/glm"
301
+ ln -sf "$BIN_DIR/glm-zai" "$BIN_DIR/ccc"
302
+ ln -sf "$BIN_DIR/glm-zai" "$BIN_DIR/claude-glm"
303
+ ln -sf "$BIN_DIR/ccr-glm" "$BIN_DIR/glm-ccr"
228
304
  }
229
305
 
230
306
  ensure_path() {
@@ -266,4 +342,5 @@ ensure_path
266
342
  echo ""
267
343
  echo "GLM setup complete."
268
344
  echo "Run: source ~/.zshrc"
269
- echo "Then: glm"
345
+ echo "Then: glm # direct z.ai (recommended)"
346
+ echo "Or: glm-ccr # via local router"