edgecrab-cli 0.2.4__tar.gz → 0.3.1__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edgecrab-cli
3
- Version: 0.2.4
3
+ Version: 0.3.1
4
4
  Summary: EdgeCrab CLI — Super Powerful Personal Assistant inspired by NousHermes and OpenClaw. Single static binary, blazing-fast TUI, multi-provider LLM.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://www.edgecrab.com
@@ -27,7 +27,7 @@ Requires-Dist: pytest<9,>=8.0; extra == "dev"
27
27
  # edgecrab-cli (PyPI)
28
28
 
29
29
  > **EdgeCrab** — Super Powerful Personal Assistant inspired by **NousHermes** and **OpenClaw**.
30
- > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Single 15 MB static binary.
30
+ > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Rust-native prebuilt binary.
31
31
 
32
32
  [![PyPI](https://img.shields.io/pypi/v/edgecrab-cli.svg)](https://pypi.org/project/edgecrab-cli/)
33
33
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
@@ -79,7 +79,7 @@ the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
79
79
 
80
80
  | Feature | Detail |
81
81
  |---------|--------|
82
- | **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
82
+ | **Single binary** | Self-contained prebuilt binary, < 50 ms startup, measured macOS release artifact is about 49 MB |
83
83
  | **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
84
84
  | **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
85
85
  | **ratatui TUI** | 60 fps capable terminal UI with streaming output |
@@ -1,7 +1,7 @@
1
1
  # edgecrab-cli (PyPI)
2
2
 
3
3
  > **EdgeCrab** — Super Powerful Personal Assistant inspired by **NousHermes** and **OpenClaw**.
4
- > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Single 15 MB static binary.
4
+ > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Rust-native prebuilt binary.
5
5
 
6
6
  [![PyPI](https://img.shields.io/pypi/v/edgecrab-cli.svg)](https://pypi.org/project/edgecrab-cli/)
7
7
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
@@ -53,7 +53,7 @@ the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
53
53
 
54
54
  | Feature | Detail |
55
55
  |---------|--------|
56
- | **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
56
+ | **Single binary** | Self-contained prebuilt binary, < 50 ms startup, measured macOS release artifact is about 49 MB |
57
57
  | **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
58
58
  | **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
59
59
  | **ratatui TUI** | 60 fps capable terminal UI with streaming output |
@@ -8,9 +8,12 @@ provides a resolve() helper to get the absolute path.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import os
11
12
  import platform
13
+ import re
12
14
  import shutil
13
15
  import stat
16
+ import subprocess
14
17
  import sys
15
18
  import tarfile
16
19
  import tempfile
@@ -41,6 +44,7 @@ _BIN_NAME = "edgecrab.exe" if sys.platform == "win32" else "edgecrab"
41
44
 
42
45
  # Cache binary alongside this package
43
46
  _CACHE_DIR = Path(__file__).parent / "_bin"
47
+ _VERSION_RE = re.compile(r"\bedgecrab\s+([0-9]+\.[0-9]+\.[0-9]+)\b", re.IGNORECASE)
44
48
 
45
49
 
46
50
  def _asset_name() -> str:
@@ -101,8 +105,14 @@ def ensure_binary() -> Path:
101
105
  _CACHE_DIR.mkdir(parents=True, exist_ok=True)
102
106
  dest = _CACHE_DIR / _BIN_NAME
103
107
 
104
- if dest.exists():
108
+ if dest.exists() and _binary_version(dest) == BINARY_VERSION:
105
109
  return dest
110
+ if dest.exists():
111
+ print(
112
+ f"[edgecrab-cli] Replacing cached binary {dest} with version {BINARY_VERSION}",
113
+ file=sys.stderr,
114
+ )
115
+ dest.unlink(missing_ok=True)
106
116
 
107
117
  asset = _asset_name()
108
118
  url = f"https://github.com/{REPO}/releases/download/v{BINARY_VERSION}/{asset}"
@@ -129,6 +139,29 @@ def ensure_binary() -> Path:
129
139
  return dest
130
140
 
131
141
 
142
+ def _binary_version(path: Path) -> str | None:
143
+ """Return the native binary's semantic version, or None if unreadable."""
144
+ try:
145
+ env = os.environ.copy()
146
+ env.setdefault("EDGECRAB_INSTALL_METHOD", "pypi")
147
+ env.setdefault("EDGECRAB_WRAPPER_VERSION", BINARY_VERSION)
148
+ env.setdefault("EDGECRAB_BINARY_VERSION", BINARY_VERSION)
149
+ result = subprocess.run(
150
+ [str(path), "--version"],
151
+ capture_output=True,
152
+ check=False,
153
+ env=env,
154
+ text=True,
155
+ timeout=5,
156
+ )
157
+ except (OSError, subprocess.SubprocessError):
158
+ return None
159
+
160
+ output = f"{result.stdout}\n{result.stderr}"
161
+ match = _VERSION_RE.search(output)
162
+ return match.group(1) if match else None
163
+
164
+
132
165
  def _is_native_binary(path: str) -> bool:
133
166
  """Return True only if *path* is a native executable, not a script wrapper."""
134
167
  try:
@@ -150,11 +183,16 @@ def resolve() -> Path:
150
183
  """
151
184
  Return the path to the edgecrab binary.
152
185
 
153
- First checks for a system-wide native `edgecrab` on PATH (e.g. installed
154
- via cargo or brew). Skips any Python wrapper scripts (like the one
155
- installed by this very package) to avoid infinite-exec loops.
186
+ By default, the package-managed binary is authoritative so upgrades cannot
187
+ be shadowed by an older system install lingering on PATH.
188
+
189
+ Set `EDGECRAB_USE_SYSTEM_BINARY=1` to opt into a system-wide native
190
+ `edgecrab`, but only when its version matches the wrapper package version.
156
191
  """
157
- system_binary = shutil.which("edgecrab")
158
- if system_binary and _is_native_binary(system_binary):
159
- return Path(system_binary)
192
+ if os.environ.get("EDGECRAB_USE_SYSTEM_BINARY") in {"1", "true", "TRUE", "yes", "YES"}:
193
+ system_binary = shutil.which("edgecrab")
194
+ if system_binary and _is_native_binary(system_binary):
195
+ system_path = Path(system_binary)
196
+ if _binary_version(system_path) == BINARY_VERSION:
197
+ return system_path
160
198
  return ensure_binary()
@@ -0,0 +1 @@
1
+ __version__ = "0.3.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edgecrab-cli
3
- Version: 0.2.4
3
+ Version: 0.3.1
4
4
  Summary: EdgeCrab CLI — Super Powerful Personal Assistant inspired by NousHermes and OpenClaw. Single static binary, blazing-fast TUI, multi-provider LLM.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://www.edgecrab.com
@@ -27,7 +27,7 @@ Requires-Dist: pytest<9,>=8.0; extra == "dev"
27
27
  # edgecrab-cli (PyPI)
28
28
 
29
29
  > **EdgeCrab** — Super Powerful Personal Assistant inspired by **NousHermes** and **OpenClaw**.
30
- > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Single 15 MB static binary.
30
+ > Blazing-fast TUI · ReAct tool loop · Multi-provider LLM · ACP protocol · Rust-native prebuilt binary.
31
31
 
32
32
  [![PyPI](https://img.shields.io/pypi/v/edgecrab-cli.svg)](https://pypi.org/project/edgecrab-cli/)
33
33
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
@@ -79,7 +79,7 @@ the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
79
79
 
80
80
  | Feature | Detail |
81
81
  |---------|--------|
82
- | **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
82
+ | **Single binary** | Self-contained prebuilt binary, < 50 ms startup, measured macOS release artifact is about 49 MB |
83
83
  | **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
84
84
  | **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
85
85
  | **ratatui TUI** | 60 fps capable terminal UI with streaming output |
@@ -1 +0,0 @@
1
- __version__ = "0.2.4"
File without changes