@oneciel-ai/claude-any 0.1.43 → 0.1.45

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 CHANGED
@@ -48,7 +48,7 @@ arguments through unchanged.
48
48
 
49
49
  Credits: One Ciel LLC
50
50
 
51
- Current version: `0.1.43`
51
+ Current version: `0.1.45`
52
52
 
53
53
  ## Why This Exists
54
54
 
@@ -381,6 +381,19 @@ steps under that larger model's supervision.
381
381
 
382
382
  ## Changelog
383
383
 
384
+ ### 0.1.45
385
+
386
+ - **Interactive npm self-update check**: npm-installed `claude-any` now checks
387
+ the npm registry before launch. If a newer version exists, it asks whether to
388
+ run `npm update -g @oneciel-ai/claude-any`, then restarts into the updated
389
+ version. Non-interactive/headless runs are not interrupted.
390
+
391
+ ### 0.1.44
392
+
393
+ - **Statusline split**: turning Rate Limit status off now hides only RPM,
394
+ server-limit, and wait counters. Upstream progress, retry, error, and token
395
+ diagnostics remain visible.
396
+
384
397
  ### 0.1.43
385
398
 
386
399
  - **429 backoff retry**: upstream `429 Too Many Requests` responses are now
package/claude_any.py CHANGED
@@ -85,7 +85,7 @@ PROVIDER_LABELS = {
85
85
  "self-hosted-nim": "Self Hosted NIM",
86
86
  }
87
87
  APP_NAME = "Claude Any"
88
- VERSION = "0.1.43"
88
+ VERSION = "0.1.45"
89
89
  CREDITS = "Credits: One Ciel LLC"
90
90
 
91
91
  LOG_LEVELS = {"SILENT": 0, "ERROR": 1, "WARN": 2, "INFO": 3, "DEBUG": 4, "TRACE": 5}
@@ -1249,10 +1249,11 @@ def main():
1249
1249
  except Exception:
1250
1250
  session = {}
1251
1251
  cfg = load_json(CONFIG_PATH, {})
1252
- providers = cfg.get("providers") if isinstance(cfg.get("providers"), dict) else {}
1253
- provider = str(cfg.get("current_provider") or "")
1254
- pcfg = providers.get(provider) if isinstance(providers.get(provider), dict) else {}
1255
- model = str(pcfg.get("current_model") or "")
1252
+ providers = cfg.get("providers") if isinstance(cfg.get("providers"), dict) else {}
1253
+ provider = str(cfg.get("current_provider") or "")
1254
+ pcfg = providers.get(provider) if isinstance(providers.get(provider), dict) else {}
1255
+ rpm_status = bool(pcfg.get("rate_limit_status", True))
1256
+ model = str(pcfg.get("current_model") or "")
1256
1257
  raw_rpm = pcfg.get("rate_limit_rpm")
1257
1258
  if raw_rpm is None and provider in ("nvidia-hosted", "self-hosted-nim", "ollama", "ollama-cloud"):
1258
1259
  raw_rpm = 40
@@ -1303,29 +1304,33 @@ def main():
1303
1304
  left = f"[{model_name}]"
1304
1305
  if dir_name:
1305
1306
  left += f" {dir_name}"
1306
- if rpm > 0:
1307
- shown_limit = display_capacity(rpm)
1308
- shown_used = min(used, shown_limit)
1309
- rpm_text = f"RPM used: {shown_used}/{shown_limit}"
1310
- else:
1311
- rpm_text = f"RPM used: {used}/min (unlimited)"
1312
- if server_rpm or server_remaining is not None or server_reset_seconds is not None:
1313
- parts = []
1314
- if server_remaining is not None:
1315
- parts.append(f"remaining {server_remaining}")
1316
- if server_rpm:
1317
- parts.append(f"limit {server_rpm}")
1318
- try:
1319
- if server_reset_seconds is not None and float(server_reset_seconds) > 0:
1320
- parts.append(f"reset {float(server_reset_seconds):.0f}s")
1321
- except Exception:
1322
- pass
1323
- if parts:
1324
- rpm_text += " | server " + ", ".join(parts)
1325
- if penalty_until > now:
1326
- rpm_text += f" | wait {max(0.0, penalty_until - now):.0f}s"
1327
- elif last_wait >= 0.5 and 0.0 <= now - updated_at < 60.0:
1328
- rpm_text += f" | wait {last_wait:.1f}s"
1307
+ status_parts = []
1308
+ if rpm_status:
1309
+ if rpm > 0:
1310
+ shown_limit = display_capacity(rpm)
1311
+ shown_used = min(used, shown_limit)
1312
+ rpm_text = f"RPM used: {shown_used}/{shown_limit}"
1313
+ else:
1314
+ rpm_text = f"RPM used: {used}/min (unlimited)"
1315
+ if server_rpm or server_remaining is not None or server_reset_seconds is not None:
1316
+ parts = []
1317
+ if server_remaining is not None:
1318
+ parts.append(f"remaining {server_remaining}")
1319
+ if server_rpm:
1320
+ parts.append(f"limit {server_rpm}")
1321
+ try:
1322
+ if server_reset_seconds is not None and float(server_reset_seconds) > 0:
1323
+ parts.append(f"reset {float(server_reset_seconds):.0f}s")
1324
+ except Exception:
1325
+ pass
1326
+ if parts:
1327
+ rpm_text += " | server " + ", ".join(parts)
1328
+ if penalty_until > now:
1329
+ rpm_text += f" | wait {max(0.0, penalty_until - now):.0f}s"
1330
+ elif last_wait >= 0.5 and 0.0 <= now - updated_at < 60.0:
1331
+ rpm_text += f" | wait {last_wait:.1f}s"
1332
+ status_parts.append(rpm_text)
1333
+ activity_text = ""
1329
1334
  if isinstance(activity, dict):
1330
1335
  try:
1331
1336
  age = now - float(activity.get("updated_at") or 0)
@@ -1334,30 +1339,48 @@ def main():
1334
1339
  if 0 <= age < 180:
1335
1340
  event = str(activity.get("event") or "")
1336
1341
  if event == "retry":
1337
- rpm_text += f" | retry {activity.get('attempt')}/{activity.get('total')}"
1342
+ activity_text = f"retry {activity.get('attempt')}/{activity.get('total')}"
1343
+ wait = activity.get("wait")
1344
+ try:
1345
+ if wait is not None and float(wait) > 0:
1346
+ activity_text += f" wait {float(wait):.0f}s"
1347
+ except Exception:
1348
+ pass
1349
+ tokens = activity.get("tokens")
1350
+ if tokens:
1351
+ try:
1352
+ activity_text += f" last input {int(tokens):,} tok"
1353
+ except Exception:
1354
+ activity_text += f" last input {tokens} tok"
1338
1355
  elif event == "request":
1339
1356
  tokens = activity.get("tokens")
1340
- rpm_text += f" | upstream {age:.0f}s"
1357
+ activity_text = f"upstream {age:.0f}s"
1341
1358
  if tokens:
1342
1359
  try:
1343
- rpm_text += f" {int(tokens):,} tok"
1360
+ activity_text += f" {int(tokens):,} tok"
1344
1361
  except Exception:
1345
- rpm_text += f" {tokens} tok"
1362
+ activity_text += f" {tokens} tok"
1346
1363
  output_tokens = activity.get("output_tokens")
1347
1364
  if output_tokens:
1348
1365
  try:
1349
- rpm_text += f" -> {int(output_tokens):,} tok"
1366
+ activity_text += f" -> {int(output_tokens):,} tok"
1350
1367
  except Exception:
1351
- rpm_text += f" -> {output_tokens} tok"
1368
+ activity_text += f" -> {output_tokens} tok"
1352
1369
  chunks = activity.get("chunks")
1353
1370
  if chunks:
1354
1371
  try:
1355
- rpm_text += f" ({int(chunks):,} chunks)"
1372
+ activity_text += f" ({int(chunks):,} chunks)"
1356
1373
  except Exception:
1357
- rpm_text += f" ({chunks} chunks)"
1374
+ activity_text += f" ({chunks} chunks)"
1358
1375
  elif event in ("success", "error"):
1359
- rpm_text += f" | {event} {age:.0f}s"
1360
- print(f"{left} | {color(rpm_text)}")
1376
+ activity_text = f"{event} {age:.0f}s"
1377
+ if activity_text:
1378
+ status_parts.append(activity_text)
1379
+ status_text = " | ".join(status_parts)
1380
+ if status_text:
1381
+ print(f"{left} | {color(status_text)}")
1382
+ else:
1383
+ print(left)
1361
1384
 
1362
1385
 
1363
1386
  if __name__ == "__main__":
@@ -8704,9 +8727,9 @@ def write_duckduckgo_mcp_config(cfg: dict[str, Any]) -> Path:
8704
8727
  return path
8705
8728
 
8706
8729
 
8707
- def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8708
- if not enabled:
8709
- return
8730
+ def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8731
+ if not enabled:
8732
+ return
8710
8733
  if os.environ.get("CLAUDE_ANY_SKIP_CLAUDE_UPDATE") == "1":
8711
8734
  return
8712
8735
  print("Checking Claude Code update before launch...", flush=True)
@@ -8731,10 +8754,96 @@ def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8731
8754
  out = (p.stdout or "").strip()
8732
8755
  if out:
8733
8756
  print(out, flush=True)
8734
- if p.returncode != 0:
8735
- print(f"Claude Code update check exited with {p.returncode}; continuing.", flush=True)
8736
-
8737
-
8757
+ if p.returncode != 0:
8758
+ print(f"Claude Code update check exited with {p.returncode}; continuing.", flush=True)
8759
+
8760
+
8761
+ def parse_version_tuple(value: str) -> tuple[int, ...]:
8762
+ parts: list[int] = []
8763
+ for item in re.split(r"[^0-9]+", value.strip()):
8764
+ if item:
8765
+ parts.append(int(item))
8766
+ return tuple(parts)
8767
+
8768
+
8769
+ def version_newer(latest: str, current: str) -> bool:
8770
+ left = list(parse_version_tuple(latest))
8771
+ right = list(parse_version_tuple(current))
8772
+ size = max(len(left), len(right), 1)
8773
+ left.extend([0] * (size - len(left)))
8774
+ right.extend([0] * (size - len(right)))
8775
+ return tuple(left) > tuple(right)
8776
+
8777
+
8778
+ def running_from_npm_package() -> bool:
8779
+ if os.environ.get("CLAUDE_ANY_NPM_MODE") is not None:
8780
+ return True
8781
+ path = str(Path(__file__).resolve()).replace("\\", "/")
8782
+ return "/node_modules/@oneciel-ai/claude-any/" in path
8783
+
8784
+
8785
+ def run_claude_any_update_check(enabled: bool = True) -> bool:
8786
+ if not enabled:
8787
+ return False
8788
+ if os.environ.get("CLAUDE_ANY_SKIP_SELF_UPDATE") == "1":
8789
+ return False
8790
+ if env_bool(os.environ.get("CLAUDE_ANY_SELF_UPDATE_CHECK")) is False:
8791
+ return False
8792
+ if not running_from_npm_package():
8793
+ return False
8794
+ if not (sys.stdin.isatty() and sys.stdout.isatty()):
8795
+ return False
8796
+ npm = find_executable("npm")
8797
+ if not npm:
8798
+ return False
8799
+ try:
8800
+ p = subprocess.run(
8801
+ [npm, "view", "@oneciel-ai/claude-any@latest", "version"],
8802
+ text=True,
8803
+ stdout=subprocess.PIPE,
8804
+ stderr=subprocess.DEVNULL,
8805
+ timeout=8,
8806
+ )
8807
+ except Exception:
8808
+ return False
8809
+ if p.returncode != 0:
8810
+ return False
8811
+ latest = (p.stdout or "").strip().splitlines()[-1].strip() if (p.stdout or "").strip() else ""
8812
+ if not latest or not version_newer(latest, VERSION):
8813
+ return False
8814
+ print(f"Claude Any update available: {VERSION} -> {latest}", flush=True)
8815
+ answer = input("Update now with npm? [y/N] ").strip().lower()
8816
+ if answer not in ("y", "yes"):
8817
+ return False
8818
+ try:
8819
+ update = subprocess.run(
8820
+ [npm, "update", "-g", "@oneciel-ai/claude-any"],
8821
+ text=True,
8822
+ stdout=subprocess.PIPE,
8823
+ stderr=subprocess.STDOUT,
8824
+ timeout=300,
8825
+ )
8826
+ except subprocess.TimeoutExpired:
8827
+ print("Claude Any update timed out; continuing with current version.", flush=True)
8828
+ return False
8829
+ except Exception as exc:
8830
+ print(f"Claude Any update failed ({type(exc).__name__}); continuing.", flush=True)
8831
+ return False
8832
+ out = (update.stdout or "").strip()
8833
+ if out:
8834
+ print(out, flush=True)
8835
+ if update.returncode != 0:
8836
+ print(f"Claude Any update exited with {update.returncode}; continuing with current version.", flush=True)
8837
+ return False
8838
+ print("Claude Any updated. Restarting with the new version...", flush=True)
8839
+ os.environ["CLAUDE_ANY_SKIP_SELF_UPDATE"] = "1"
8840
+ try:
8841
+ os.execv(sys.executable, [sys.executable, *sys.argv])
8842
+ except Exception as exc:
8843
+ print(f"Restart failed ({type(exc).__name__}); continuing with the current process.", flush=True)
8844
+ return True
8845
+
8846
+
8738
8847
  def launch_claude(
8739
8848
  passthrough: list[str],
8740
8849
  skip_menu: bool = False,
@@ -8742,7 +8851,9 @@ def launch_claude(
8742
8851
  web_search_override: bool | None = None,
8743
8852
  disable_skills_override: bool | None = None,
8744
8853
  update_check: bool = True,
8854
+ self_update_check: bool = True,
8745
8855
  ) -> int:
8856
+ run_claude_any_update_check(enabled=self_update_check)
8746
8857
  rc = run_prelaunch_menu(passthrough, skip_menu=skip_menu, force_menu=force_menu)
8747
8858
  if rc == 10:
8748
8859
  return 0
@@ -8872,10 +8983,12 @@ Headless setup flags, namespaced to avoid Claude CLI collisions:
8872
8983
  claude-any --ca-no-web-search Disable DuckDuckGo MCP for this launch
8873
8984
  claude-any --ca-web-fetch Enable fetch MCP
8874
8985
  claude-any --ca-no-web-fetch Disable fetch MCP
8875
- claude-any --ca-disable-skills Disable Claude Code skills for this launch
8876
- claude-any --ca-enable-skills Keep Claude Code skills enabled for this launch
8877
- claude-any --ca-no-update-check Skip Claude Code update check for this launch
8878
- claude-any --ca-stop Stop router/proxy
8986
+ claude-any --ca-disable-skills Disable Claude Code skills for this launch
8987
+ claude-any --ca-enable-skills Keep Claude Code skills enabled for this launch
8988
+ claude-any --ca-no-self-update-check
8989
+ Skip Claude Any npm self-update check
8990
+ claude-any --ca-no-update-check Skip Claude Code update check for this launch
8991
+ claude-any --ca-stop Stop router/proxy
8879
8992
  claude-any -- Pass all following args directly to Claude Code
8880
8993
 
8881
8994
  Provider names: anthropic, ollama, ollama-cloud, vllm, nvidia-hosted, self-hosted-nim
@@ -8907,12 +9020,13 @@ def pop_headless_env_file_args(argv: list[str]) -> list[str]:
8907
9020
  return cleaned
8908
9021
 
8909
9022
 
8910
- def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool | None, bool]:
9023
+ def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool | None, bool | None, bool]:
8911
9024
  skip_menu = os.environ.get("CLAUDE_ANY_SKIP_MENU") == "1"
8912
9025
  force_menu = bool(env_bool(os.environ.get("CLAUDE_ANY_FORCE_MENU"), False))
8913
9026
  web_search_override = env_bool(os.environ.get("CLAUDE_ANY_WEB_SEARCH"))
8914
9027
  disable_skills_override = env_bool(os.environ.get("CLAUDE_ANY_DISABLE_SKILLS"))
8915
9028
  update_check_override = env_bool(os.environ.get("CLAUDE_ANY_UPDATE_CHECK"))
9029
+ self_update_check_override = env_bool(os.environ.get("CLAUDE_ANY_SELF_UPDATE_CHECK"))
8916
9030
  language = os.environ.get("CLAUDE_ANY_LANGUAGE", "").strip()
8917
9031
  if language:
8918
9032
  cmd_language(argparse.Namespace(value=language))
@@ -8976,7 +9090,7 @@ def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool |
8976
9090
  if ollama_values:
8977
9091
  cmd_ollama_options(argparse.Namespace(values=ollama_values))
8978
9092
  skip_menu = True
8979
- return skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu
9093
+ return skip_menu, web_search_override, disable_skills_override, update_check_override, self_update_check_override, force_menu
8980
9094
 
8981
9095
 
8982
9096
  def run_cli(argv: list[str]) -> int:
@@ -9070,10 +9184,13 @@ def run_cli(argv: list[str]) -> int:
9070
9184
  return 0
9071
9185
 
9072
9186
  passthrough: list[str] = []
9073
- skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu = apply_headless_env_config()
9187
+ skip_menu, web_search_override, disable_skills_override, update_check_override, self_update_check_override, force_menu = apply_headless_env_config()
9074
9188
  update_check = True
9075
9189
  if update_check_override is not None:
9076
9190
  update_check = update_check_override
9191
+ self_update_check = True
9192
+ if self_update_check_override is not None:
9193
+ self_update_check = self_update_check_override
9077
9194
  i = 0
9078
9195
  while i < len(argv):
9079
9196
  arg = argv[i]
@@ -9330,10 +9447,14 @@ def run_cli(argv: list[str]) -> int:
9330
9447
  disable_skills_override = False
9331
9448
  skip_menu = True
9332
9449
  i += 1
9333
- elif arg == "--ca-no-update-check":
9334
- update_check = False
9335
- skip_menu = True
9336
- i += 1
9450
+ elif arg == "--ca-no-update-check":
9451
+ update_check = False
9452
+ skip_menu = True
9453
+ i += 1
9454
+ elif arg == "--ca-no-self-update-check":
9455
+ self_update_check = False
9456
+ skip_menu = True
9457
+ i += 1
9337
9458
  elif arg == "--ca-status":
9338
9459
  cmd_status(argparse.Namespace())
9339
9460
  return 0
@@ -9350,10 +9471,11 @@ def run_cli(argv: list[str]) -> int:
9350
9471
  passthrough,
9351
9472
  skip_menu=skip_menu,
9352
9473
  force_menu=force_menu,
9353
- web_search_override=web_search_override,
9354
- disable_skills_override=disable_skills_override,
9355
- update_check=update_check,
9356
- )
9474
+ web_search_override=web_search_override,
9475
+ disable_skills_override=disable_skills_override,
9476
+ update_check=update_check,
9477
+ self_update_check=self_update_check,
9478
+ )
9357
9479
 
9358
9480
 
9359
9481
  def cmd_cli(args: argparse.Namespace) -> None:
package/docs/README.ja.md CHANGED
@@ -47,7 +47,7 @@ vLLM、NVIDIA hosted、self-hosted NIM を選択し、通常の Claude Code 引
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 現在のバージョン: `0.1.43`
50
+ 現在のバージョン: `0.1.45`
51
51
 
52
52
  ## 作られた理由
53
53
 
@@ -351,6 +351,19 @@ Windows/Linux 管理、クリーンアップスクリプト、定期的なセキ
351
351
 
352
352
  ## 変更履歴
353
353
 
354
+ ### 0.1.45
355
+
356
+ - **対話型 npm self-update check**: npm でインストールされた `claude-any` は起動前に
357
+ npm registry の最新バージョンを確認します。新しいバージョンがあれば
358
+ `npm update -g @oneciel-ai/claude-any` を実行するか確認し、更新後に新しい
359
+ バージョンで再起動します。non-interactive/headless 実行は止めません。
360
+
361
+ ### 0.1.44
362
+
363
+ - **Statusline split**: Rate Limit status を off にした場合、RPM、server-limit、
364
+ wait counter だけを非表示にします。Upstream 進捗、retry、error、token 診断は
365
+ 引き続き表示されます。
366
+
354
367
  ### 0.1.43
355
368
 
356
369
  - **429 backoff retry**: upstream `429 Too Many Requests` 応答を初回 backoff 後に
package/docs/README.ko.md CHANGED
@@ -47,7 +47,7 @@ NVIDIA hosted, self-hosted NIM을 선택하고, Claude Code의 일반 인자는
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 현재 버전: `0.1.43`
50
+ 현재 버전: `0.1.45`
51
51
 
52
52
  ## 왜 만들었나
53
53
 
@@ -351,6 +351,19 @@ Windows 이벤트 로그 리뷰, 바이러스/랜섬웨어 침입 시도 정리,
351
351
 
352
352
  ## 변경 이력
353
353
 
354
+ ### 0.1.45
355
+
356
+ - **대화형 npm self-update check**: npm으로 설치된 `claude-any`는 실행 전 npm
357
+ registry의 최신 버전을 확인합니다. 새 버전이 있으면 `npm update -g
358
+ @oneciel-ai/claude-any` 실행 여부를 묻고, 업데이트 후 새 버전으로 재시작합니다.
359
+ non-interactive/headless 실행은 중단하지 않습니다.
360
+
361
+ ### 0.1.44
362
+
363
+ - **Statusline 분리**: Rate Limit status를 off로 바꾸면 RPM, server-limit,
364
+ wait 카운터만 숨깁니다. Upstream 진행, retry, error, token 진단은 계속
365
+ 표시됩니다.
366
+
354
367
  ### 0.1.43
355
368
 
356
369
  - **429 backoff retry**: upstream `429 Too Many Requests` 응답을 첫 backoff 이후
package/docs/README.zh.md CHANGED
@@ -47,7 +47,7 @@ NIM,并把普通 Claude Code 参数原样传递。
47
47
 
48
48
  Credits: One Ciel LLC
49
49
 
50
- 当前版本: `0.1.43`
50
+ 当前版本: `0.1.45`
51
51
 
52
52
  ## 为什么存在
53
53
 
@@ -337,6 +337,18 @@ Hermes 格式模型或部分较旧的 Qwen tool template。
337
337
 
338
338
  ## 更新日志
339
339
 
340
+ ### 0.1.45
341
+
342
+ - **交互式 npm self-update check**:通过 npm 安装的 `claude-any` 会在启动前检查
343
+ npm registry 的最新版本。如果有新版本,会询问是否运行 `npm update -g
344
+ @oneciel-ai/claude-any`,更新后重新启动到新版本。non-interactive/headless
345
+ 运行不会被打断。
346
+
347
+ ### 0.1.44
348
+
349
+ - **Statusline split**:关闭 Rate Limit status 后只隐藏 RPM、server-limit 和
350
+ wait 计数。Upstream 进度、retry、error 和 token 诊断仍会显示。
351
+
340
352
  ### 0.1.43
341
353
 
342
354
  - **429 backoff retry**:upstream `429 Too Many Requests` 响应现在会在所有 retry
package/docs/manual.md CHANGED
@@ -10,7 +10,7 @@ Code starts, while passing normal Claude Code arguments through unchanged.
10
10
 
11
11
  Credits: One Ciel LLC
12
12
 
13
- Current version: `0.1.43`
13
+ Current version: `0.1.45`
14
14
 
15
15
  ## Install
16
16
 
@@ -376,6 +376,7 @@ export CLAUDE_ANY_STREAM_WORD_CHUNKING=off
376
376
  export CLAUDE_ANY_WEB_SEARCH=on
377
377
  export CLAUDE_ANY_WEB_FETCH=on
378
378
  export CLAUDE_ANY_DISABLE_SKILLS=off
379
+ export CLAUDE_ANY_SELF_UPDATE_CHECK=off
379
380
  export CLAUDE_ANY_UPDATE_CHECK=off
380
381
  claude-any -p "Reply with OK only." --output-format text
381
382
  ```
@@ -400,6 +401,7 @@ CLAUDE_ANY_STREAM_WORD_CHUNKING=off
400
401
  CLAUDE_ANY_WEB_SEARCH=on
401
402
  CLAUDE_ANY_WEB_FETCH=on
402
403
  CLAUDE_ANY_DISABLE_SKILLS=off
404
+ CLAUDE_ANY_SELF_UPDATE_CHECK=off
403
405
  CLAUDE_ANY_UPDATE_CHECK=off
404
406
  ```
405
407
 
@@ -472,6 +474,7 @@ Common Claude Any setup flags:
472
474
  | `--ca-web-search` / `--ca-no-web-search` | Force-enable or disable web-search MCP for this launch. |
473
475
  | `--ca-web-fetch` / `--ca-no-web-fetch` | Enable or disable fetch MCP for web page content. |
474
476
  | `--ca-disable-skills` / `--ca-enable-skills` | Control Claude Code skills for this launch. |
477
+ | `--ca-no-self-update-check` | Skip the Claude Any npm self-update check. |
475
478
  | `--ca-no-update-check` | Skip the Claude Code update check. |
476
479
  | `--ca-status` | Print status and exit. |
477
480
  | `--ca-stop` | Stop managed router services and exit. |
@@ -482,8 +485,13 @@ Notes for automation:
482
485
  - `--ca-api-key` and `--ca-set-api-key` are available for direct key passing,
483
486
  but prefer the environment-variable forms in shared scripts and terminals.
484
487
  - `claude-any stop` is safe to run before scripted tests to remove stale
485
- router/proxy processes.
486
- - Use `claude-any test 60 auto` for a quick readiness check and reserve
488
+ router/proxy processes.
489
+ - npm-installed interactive launches check the npm registry for a newer
490
+ Claude Any version and ask before running `npm update -g
491
+ @oneciel-ai/claude-any`. Headless/non-TTY launches are not interrupted; set
492
+ `CLAUDE_ANY_SELF_UPDATE_CHECK=off` or pass `--ca-no-self-update-check` to
493
+ disable it explicitly.
494
+ - Use `claude-any test 60 auto` for a quick readiness check and reserve
487
495
  `claude-any test 180 full` for deeper provider validation.
488
496
  - Headless flags persist in `~/.config/claude-any/config.json`, so the next
489
497
  interactive launch starts from the same provider/model settings.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneciel-ai/claude-any",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "Claude Code provider selector for Anthropic, Ollama, Ollama Cloud, vLLM, NVIDIA hosted, and self-hosted NIM.",
5
5
  "license": "MIT",
6
6
  "author": "One Ciel LLC",