@oneciel-ai/claude-any 0.1.44 → 0.1.46

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.44`
51
+ Current version: `0.1.46`
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.46
385
+
386
+ - **Cleaner stream options**: the LLM options menu now hides `Stream word
387
+ chunking` whenever `Stream` is off, since chunking only applies to streamed
388
+ responses.
389
+
390
+ ### 0.1.45
391
+
392
+ - **Interactive npm self-update check**: npm-installed `claude-any` now checks
393
+ the npm registry before launch. If a newer version exists, it asks whether to
394
+ run `npm update -g @oneciel-ai/claude-any`, then restarts into the updated
395
+ version. Non-interactive/headless runs are not interrupted.
396
+
384
397
  ### 0.1.44
385
398
 
386
399
  - **Statusline split**: turning Rate Limit status off now hides only RPM,
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.44"
88
+ VERSION = "0.1.46"
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}
@@ -6595,12 +6595,13 @@ def llm_option_panel_rows(provider: str, pcfg: dict[str, Any], lang: str | None
6595
6595
  add("Top P", "top_p", opts.get("top_p", "default"))
6596
6596
  add("Top K", "top_k", opts.get("top_k", "default"))
6597
6597
  add("Think", "think", bool(pcfg.get("think", False)))
6598
- add("Keep alive", "keep_alive", pcfg.get("keep_alive", "default"))
6599
- add("Timeout ms", "request_timeout_ms", pcfg.get("request_timeout_ms", "default"))
6600
- add("Stream", "stream_enabled", "on" if bool(pcfg.get("stream_enabled", True)) else "off")
6601
- add("Stream word chunking", "stream_word_chunking", "on" if bool(pcfg.get("stream_word_chunking", False)) else "off")
6602
- add("Rate limit RPM", "rate_limit_rpm", pcfg.get("rate_limit_rpm", 40))
6603
- add("Rate limit status", "rate_limit_status", "on" if bool(pcfg.get("rate_limit_status", True)) else "off")
6598
+ add("Keep alive", "keep_alive", pcfg.get("keep_alive", "default"))
6599
+ add("Timeout ms", "request_timeout_ms", pcfg.get("request_timeout_ms", "default"))
6600
+ add("Stream", "stream_enabled", "on" if bool(pcfg.get("stream_enabled", True)) else "off")
6601
+ if bool(pcfg.get("stream_enabled", True)):
6602
+ add("Stream word chunking", "stream_word_chunking", "on" if bool(pcfg.get("stream_word_chunking", False)) else "off")
6603
+ add("Rate limit RPM", "rate_limit_rpm", pcfg.get("rate_limit_rpm", 40))
6604
+ add("Rate limit status", "rate_limit_status", "on" if bool(pcfg.get("rate_limit_status", True)) else "off")
6604
6605
  else:
6605
6606
  if provider in ("vllm", "nvidia-hosted", "self-hosted-nim"):
6606
6607
  add("Context window", "context_window", pcfg.get("context_window", "default"))
@@ -6613,10 +6614,11 @@ def llm_option_panel_rows(provider: str, pcfg: dict[str, Any], lang: str | None
6613
6614
  add("Temperature", "temperature", pcfg.get("temperature", "default"))
6614
6615
  add("Top P", "top_p", pcfg.get("top_p", "default"))
6615
6616
  add("Top K", "top_k", pcfg.get("top_k", "default"))
6616
- if provider in ("vllm", "self-hosted-nim"):
6617
- add("Native compatibility", "native_compat", bool(pcfg.get("native_compat", True)))
6618
- add("Stream", "stream_enabled", "on" if bool(pcfg.get("stream_enabled", True)) else "off")
6619
- add("Stream word chunking", "stream_word_chunking", "on" if bool(pcfg.get("stream_word_chunking", False)) else "off")
6617
+ if provider in ("vllm", "self-hosted-nim"):
6618
+ add("Native compatibility", "native_compat", bool(pcfg.get("native_compat", True)))
6619
+ add("Stream", "stream_enabled", "on" if bool(pcfg.get("stream_enabled", True)) else "off")
6620
+ if bool(pcfg.get("stream_enabled", True)):
6621
+ add("Stream word chunking", "stream_word_chunking", "on" if bool(pcfg.get("stream_word_chunking", False)) else "off")
6620
6622
  elif provider == "anthropic":
6621
6623
  add("Timeout ms", "request_timeout_ms", pcfg.get("request_timeout_ms", "Claude Code default"))
6622
6624
 
@@ -8727,9 +8729,9 @@ def write_duckduckgo_mcp_config(cfg: dict[str, Any]) -> Path:
8727
8729
  return path
8728
8730
 
8729
8731
 
8730
- def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8731
- if not enabled:
8732
- return
8732
+ def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8733
+ if not enabled:
8734
+ return
8733
8735
  if os.environ.get("CLAUDE_ANY_SKIP_CLAUDE_UPDATE") == "1":
8734
8736
  return
8735
8737
  print("Checking Claude Code update before launch...", flush=True)
@@ -8754,10 +8756,96 @@ def run_claude_update_check(claude: str, enabled: bool = True) -> None:
8754
8756
  out = (p.stdout or "").strip()
8755
8757
  if out:
8756
8758
  print(out, flush=True)
8757
- if p.returncode != 0:
8758
- print(f"Claude Code update check exited with {p.returncode}; continuing.", flush=True)
8759
-
8760
-
8759
+ if p.returncode != 0:
8760
+ print(f"Claude Code update check exited with {p.returncode}; continuing.", flush=True)
8761
+
8762
+
8763
+ def parse_version_tuple(value: str) -> tuple[int, ...]:
8764
+ parts: list[int] = []
8765
+ for item in re.split(r"[^0-9]+", value.strip()):
8766
+ if item:
8767
+ parts.append(int(item))
8768
+ return tuple(parts)
8769
+
8770
+
8771
+ def version_newer(latest: str, current: str) -> bool:
8772
+ left = list(parse_version_tuple(latest))
8773
+ right = list(parse_version_tuple(current))
8774
+ size = max(len(left), len(right), 1)
8775
+ left.extend([0] * (size - len(left)))
8776
+ right.extend([0] * (size - len(right)))
8777
+ return tuple(left) > tuple(right)
8778
+
8779
+
8780
+ def running_from_npm_package() -> bool:
8781
+ if os.environ.get("CLAUDE_ANY_NPM_MODE") is not None:
8782
+ return True
8783
+ path = str(Path(__file__).resolve()).replace("\\", "/")
8784
+ return "/node_modules/@oneciel-ai/claude-any/" in path
8785
+
8786
+
8787
+ def run_claude_any_update_check(enabled: bool = True) -> bool:
8788
+ if not enabled:
8789
+ return False
8790
+ if os.environ.get("CLAUDE_ANY_SKIP_SELF_UPDATE") == "1":
8791
+ return False
8792
+ if env_bool(os.environ.get("CLAUDE_ANY_SELF_UPDATE_CHECK")) is False:
8793
+ return False
8794
+ if not running_from_npm_package():
8795
+ return False
8796
+ if not (sys.stdin.isatty() and sys.stdout.isatty()):
8797
+ return False
8798
+ npm = find_executable("npm")
8799
+ if not npm:
8800
+ return False
8801
+ try:
8802
+ p = subprocess.run(
8803
+ [npm, "view", "@oneciel-ai/claude-any@latest", "version"],
8804
+ text=True,
8805
+ stdout=subprocess.PIPE,
8806
+ stderr=subprocess.DEVNULL,
8807
+ timeout=8,
8808
+ )
8809
+ except Exception:
8810
+ return False
8811
+ if p.returncode != 0:
8812
+ return False
8813
+ latest = (p.stdout or "").strip().splitlines()[-1].strip() if (p.stdout or "").strip() else ""
8814
+ if not latest or not version_newer(latest, VERSION):
8815
+ return False
8816
+ print(f"Claude Any update available: {VERSION} -> {latest}", flush=True)
8817
+ answer = input("Update now with npm? [y/N] ").strip().lower()
8818
+ if answer not in ("y", "yes"):
8819
+ return False
8820
+ try:
8821
+ update = subprocess.run(
8822
+ [npm, "update", "-g", "@oneciel-ai/claude-any"],
8823
+ text=True,
8824
+ stdout=subprocess.PIPE,
8825
+ stderr=subprocess.STDOUT,
8826
+ timeout=300,
8827
+ )
8828
+ except subprocess.TimeoutExpired:
8829
+ print("Claude Any update timed out; continuing with current version.", flush=True)
8830
+ return False
8831
+ except Exception as exc:
8832
+ print(f"Claude Any update failed ({type(exc).__name__}); continuing.", flush=True)
8833
+ return False
8834
+ out = (update.stdout or "").strip()
8835
+ if out:
8836
+ print(out, flush=True)
8837
+ if update.returncode != 0:
8838
+ print(f"Claude Any update exited with {update.returncode}; continuing with current version.", flush=True)
8839
+ return False
8840
+ print("Claude Any updated. Restarting with the new version...", flush=True)
8841
+ os.environ["CLAUDE_ANY_SKIP_SELF_UPDATE"] = "1"
8842
+ try:
8843
+ os.execv(sys.executable, [sys.executable, *sys.argv])
8844
+ except Exception as exc:
8845
+ print(f"Restart failed ({type(exc).__name__}); continuing with the current process.", flush=True)
8846
+ return True
8847
+
8848
+
8761
8849
  def launch_claude(
8762
8850
  passthrough: list[str],
8763
8851
  skip_menu: bool = False,
@@ -8765,7 +8853,9 @@ def launch_claude(
8765
8853
  web_search_override: bool | None = None,
8766
8854
  disable_skills_override: bool | None = None,
8767
8855
  update_check: bool = True,
8856
+ self_update_check: bool = True,
8768
8857
  ) -> int:
8858
+ run_claude_any_update_check(enabled=self_update_check)
8769
8859
  rc = run_prelaunch_menu(passthrough, skip_menu=skip_menu, force_menu=force_menu)
8770
8860
  if rc == 10:
8771
8861
  return 0
@@ -8895,10 +8985,12 @@ Headless setup flags, namespaced to avoid Claude CLI collisions:
8895
8985
  claude-any --ca-no-web-search Disable DuckDuckGo MCP for this launch
8896
8986
  claude-any --ca-web-fetch Enable fetch MCP
8897
8987
  claude-any --ca-no-web-fetch Disable fetch MCP
8898
- claude-any --ca-disable-skills Disable Claude Code skills for this launch
8899
- claude-any --ca-enable-skills Keep Claude Code skills enabled for this launch
8900
- claude-any --ca-no-update-check Skip Claude Code update check for this launch
8901
- claude-any --ca-stop Stop router/proxy
8988
+ claude-any --ca-disable-skills Disable Claude Code skills for this launch
8989
+ claude-any --ca-enable-skills Keep Claude Code skills enabled for this launch
8990
+ claude-any --ca-no-self-update-check
8991
+ Skip Claude Any npm self-update check
8992
+ claude-any --ca-no-update-check Skip Claude Code update check for this launch
8993
+ claude-any --ca-stop Stop router/proxy
8902
8994
  claude-any -- Pass all following args directly to Claude Code
8903
8995
 
8904
8996
  Provider names: anthropic, ollama, ollama-cloud, vllm, nvidia-hosted, self-hosted-nim
@@ -8930,12 +9022,13 @@ def pop_headless_env_file_args(argv: list[str]) -> list[str]:
8930
9022
  return cleaned
8931
9023
 
8932
9024
 
8933
- def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool | None, bool]:
9025
+ def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool | None, bool | None, bool]:
8934
9026
  skip_menu = os.environ.get("CLAUDE_ANY_SKIP_MENU") == "1"
8935
9027
  force_menu = bool(env_bool(os.environ.get("CLAUDE_ANY_FORCE_MENU"), False))
8936
9028
  web_search_override = env_bool(os.environ.get("CLAUDE_ANY_WEB_SEARCH"))
8937
9029
  disable_skills_override = env_bool(os.environ.get("CLAUDE_ANY_DISABLE_SKILLS"))
8938
9030
  update_check_override = env_bool(os.environ.get("CLAUDE_ANY_UPDATE_CHECK"))
9031
+ self_update_check_override = env_bool(os.environ.get("CLAUDE_ANY_SELF_UPDATE_CHECK"))
8939
9032
  language = os.environ.get("CLAUDE_ANY_LANGUAGE", "").strip()
8940
9033
  if language:
8941
9034
  cmd_language(argparse.Namespace(value=language))
@@ -8999,7 +9092,7 @@ def apply_headless_env_config() -> tuple[bool, bool | None, bool | None, bool |
8999
9092
  if ollama_values:
9000
9093
  cmd_ollama_options(argparse.Namespace(values=ollama_values))
9001
9094
  skip_menu = True
9002
- return skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu
9095
+ return skip_menu, web_search_override, disable_skills_override, update_check_override, self_update_check_override, force_menu
9003
9096
 
9004
9097
 
9005
9098
  def run_cli(argv: list[str]) -> int:
@@ -9093,10 +9186,13 @@ def run_cli(argv: list[str]) -> int:
9093
9186
  return 0
9094
9187
 
9095
9188
  passthrough: list[str] = []
9096
- skip_menu, web_search_override, disable_skills_override, update_check_override, force_menu = apply_headless_env_config()
9189
+ skip_menu, web_search_override, disable_skills_override, update_check_override, self_update_check_override, force_menu = apply_headless_env_config()
9097
9190
  update_check = True
9098
9191
  if update_check_override is not None:
9099
9192
  update_check = update_check_override
9193
+ self_update_check = True
9194
+ if self_update_check_override is not None:
9195
+ self_update_check = self_update_check_override
9100
9196
  i = 0
9101
9197
  while i < len(argv):
9102
9198
  arg = argv[i]
@@ -9353,10 +9449,14 @@ def run_cli(argv: list[str]) -> int:
9353
9449
  disable_skills_override = False
9354
9450
  skip_menu = True
9355
9451
  i += 1
9356
- elif arg == "--ca-no-update-check":
9357
- update_check = False
9358
- skip_menu = True
9359
- i += 1
9452
+ elif arg == "--ca-no-update-check":
9453
+ update_check = False
9454
+ skip_menu = True
9455
+ i += 1
9456
+ elif arg == "--ca-no-self-update-check":
9457
+ self_update_check = False
9458
+ skip_menu = True
9459
+ i += 1
9360
9460
  elif arg == "--ca-status":
9361
9461
  cmd_status(argparse.Namespace())
9362
9462
  return 0
@@ -9373,10 +9473,11 @@ def run_cli(argv: list[str]) -> int:
9373
9473
  passthrough,
9374
9474
  skip_menu=skip_menu,
9375
9475
  force_menu=force_menu,
9376
- web_search_override=web_search_override,
9377
- disable_skills_override=disable_skills_override,
9378
- update_check=update_check,
9379
- )
9476
+ web_search_override=web_search_override,
9477
+ disable_skills_override=disable_skills_override,
9478
+ update_check=update_check,
9479
+ self_update_check=self_update_check,
9480
+ )
9380
9481
 
9381
9482
 
9382
9483
  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.44`
50
+ 現在のバージョン: `0.1.46`
51
51
 
52
52
  ## 作られた理由
53
53
 
@@ -351,6 +351,18 @@ Windows/Linux 管理、クリーンアップスクリプト、定期的なセキ
351
351
 
352
352
  ## 変更履歴
353
353
 
354
+ ### 0.1.46
355
+
356
+ - **Stream options の整理**: `Stream` が off の場合、`Stream word chunking` を
357
+ LLM options menu から非表示にします。chunking は stream 応答にだけ意味があります。
358
+
359
+ ### 0.1.45
360
+
361
+ - **対話型 npm self-update check**: npm でインストールされた `claude-any` は起動前に
362
+ npm registry の最新バージョンを確認します。新しいバージョンがあれば
363
+ `npm update -g @oneciel-ai/claude-any` を実行するか確認し、更新後に新しい
364
+ バージョンで再起動します。non-interactive/headless 実行は止めません。
365
+
354
366
  ### 0.1.44
355
367
 
356
368
  - **Statusline split**: Rate Limit status を off にした場合、RPM、server-limit、
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.44`
50
+ 현재 버전: `0.1.46`
51
51
 
52
52
  ## 왜 만들었나
53
53
 
@@ -351,6 +351,18 @@ Windows 이벤트 로그 리뷰, 바이러스/랜섬웨어 침입 시도 정리,
351
351
 
352
352
  ## 변경 이력
353
353
 
354
+ ### 0.1.46
355
+
356
+ - **Stream 옵션 정리**: `Stream`이 off일 때는 `Stream word chunking` 항목을
357
+ LLM 옵션 메뉴에서 숨깁니다. chunking은 스트리밍 응답에만 의미가 있습니다.
358
+
359
+ ### 0.1.45
360
+
361
+ - **대화형 npm self-update check**: npm으로 설치된 `claude-any`는 실행 전 npm
362
+ registry의 최신 버전을 확인합니다. 새 버전이 있으면 `npm update -g
363
+ @oneciel-ai/claude-any` 실행 여부를 묻고, 업데이트 후 새 버전으로 재시작합니다.
364
+ non-interactive/headless 실행은 중단하지 않습니다.
365
+
354
366
  ### 0.1.44
355
367
 
356
368
  - **Statusline 분리**: Rate Limit status를 off로 바꾸면 RPM, server-limit,
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.44`
50
+ 当前版本: `0.1.46`
51
51
 
52
52
  ## 为什么存在
53
53
 
@@ -337,6 +337,18 @@ Hermes 格式模型或部分较旧的 Qwen tool template。
337
337
 
338
338
  ## 更新日志
339
339
 
340
+ ### 0.1.46
341
+
342
+ - **Stream options 更清晰**:当 `Stream` 关闭时,LLM options menu 会隐藏
343
+ `Stream word chunking`。chunking 只对流式响应有意义。
344
+
345
+ ### 0.1.45
346
+
347
+ - **交互式 npm self-update check**:通过 npm 安装的 `claude-any` 会在启动前检查
348
+ npm registry 的最新版本。如果有新版本,会询问是否运行 `npm update -g
349
+ @oneciel-ai/claude-any`,更新后重新启动到新版本。non-interactive/headless
350
+ 运行不会被打断。
351
+
340
352
  ### 0.1.44
341
353
 
342
354
  - **Statusline split**:关闭 Rate Limit status 后只隐藏 RPM、server-limit 和
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.44`
13
+ Current version: `0.1.46`
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.44",
3
+ "version": "0.1.46",
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",