@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 +14 -1
- package/claude_any.py +182 -60
- package/docs/README.ja.md +14 -1
- package/docs/README.ko.md +14 -1
- package/docs/README.zh.md +13 -1
- package/docs/manual.md +11 -3
- package/package.json +1 -1
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
if server_remaining is not None:
|
|
1315
|
-
parts
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1357
|
+
activity_text = f"upstream {age:.0f}s"
|
|
1341
1358
|
if tokens:
|
|
1342
1359
|
try:
|
|
1343
|
-
|
|
1360
|
+
activity_text += f" {int(tokens):,} tok"
|
|
1344
1361
|
except Exception:
|
|
1345
|
-
|
|
1362
|
+
activity_text += f" {tokens} tok"
|
|
1346
1363
|
output_tokens = activity.get("output_tokens")
|
|
1347
1364
|
if output_tokens:
|
|
1348
1365
|
try:
|
|
1349
|
-
|
|
1366
|
+
activity_text += f" -> {int(output_tokens):,} tok"
|
|
1350
1367
|
except Exception:
|
|
1351
|
-
|
|
1368
|
+
activity_text += f" -> {output_tokens} tok"
|
|
1352
1369
|
chunks = activity.get("chunks")
|
|
1353
1370
|
if chunks:
|
|
1354
1371
|
try:
|
|
1355
|
-
|
|
1372
|
+
activity_text += f" ({int(chunks):,} chunks)"
|
|
1356
1373
|
except Exception:
|
|
1357
|
-
|
|
1374
|
+
activity_text += f" ({chunks} chunks)"
|
|
1358
1375
|
elif event in ("success", "error"):
|
|
1359
|
-
|
|
1360
|
-
|
|
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
|
|
8878
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
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