edgecrab-cli 0.1.0__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.
- edgecrab_cli-0.1.0/PKG-INFO +121 -0
- edgecrab_cli-0.1.0/README.md +95 -0
- edgecrab_cli-0.1.0/edgecrab_cli/__init__.py +5 -0
- edgecrab_cli-0.1.0/edgecrab_cli/_binary.py +139 -0
- edgecrab_cli-0.1.0/edgecrab_cli/_entry.py +31 -0
- edgecrab_cli-0.1.0/edgecrab_cli/_version.py +1 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/PKG-INFO +121 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/SOURCES.txt +12 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/dependency_links.txt +1 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/entry_points.txt +2 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/requires.txt +4 -0
- edgecrab_cli-0.1.0/edgecrab_cli.egg-info/top_level.txt +1 -0
- edgecrab_cli-0.1.0/pyproject.toml +48 -0
- edgecrab_cli-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: edgecrab-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: EdgeCrab CLI — Super Powerful Personal Assistant inspired by NousHermes and OpenClaw. Single static binary, blazing-fast TUI, multi-provider LLM.
|
|
5
|
+
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://www.edgecrab.com
|
|
7
|
+
Project-URL: Repository, https://github.com/raphaelmansuy/edgecrab
|
|
8
|
+
Project-URL: Documentation, https://www.edgecrab.com
|
|
9
|
+
Keywords: ai,agent,llm,edgecrab,coding-agent,personal-assistant,cli,nous-hermes,openclaw
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Classifier: Environment :: Console
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: httpx<1,>=0.27.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest<9,>=8.0; extra == "dev"
|
|
26
|
+
|
|
27
|
+
# edgecrab-cli (PyPI)
|
|
28
|
+
|
|
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.
|
|
31
|
+
|
|
32
|
+
[](https://pypi.org/project/edgecrab-cli/)
|
|
33
|
+
[](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install edgecrab-cli
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
On first run, the package automatically downloads the correct pre-built Rust binary for
|
|
44
|
+
your platform (macOS arm64/x64, Linux x64/arm64, Windows x64) from
|
|
45
|
+
[GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases).
|
|
46
|
+
|
|
47
|
+
No Rust, GCC, or build tools are required.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# First-run setup wizard — detects API keys, writes ~/.edgecrab/config.yaml
|
|
55
|
+
edgecrab setup
|
|
56
|
+
|
|
57
|
+
# Verify your environment
|
|
58
|
+
edgecrab doctor
|
|
59
|
+
|
|
60
|
+
# Start the interactive TUI
|
|
61
|
+
edgecrab
|
|
62
|
+
|
|
63
|
+
# One-shot query (pipe-friendly)
|
|
64
|
+
edgecrab "summarise the git log for today"
|
|
65
|
+
|
|
66
|
+
# Pick a specific LLM provider
|
|
67
|
+
edgecrab --model anthropic/claude-opus-4 "explain this codebase"
|
|
68
|
+
|
|
69
|
+
# Quiet / pipe mode
|
|
70
|
+
edgecrab --quiet "write a Rust hello-world"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Why EdgeCrab?
|
|
76
|
+
|
|
77
|
+
EdgeCrab is a **Rust-native** autonomous coding agent and personal assistant, inspired by
|
|
78
|
+
the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
|
|
79
|
+
|
|
80
|
+
| Feature | Detail |
|
|
81
|
+
|---------|--------|
|
|
82
|
+
| **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
|
|
83
|
+
| **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
|
|
84
|
+
| **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
|
|
85
|
+
| **ratatui TUI** | 60 fps capable terminal UI with streaming output |
|
|
86
|
+
| **ACP protocol** | Built-in JSON-RPC 2.0 stdio adapter for VS Code Copilot |
|
|
87
|
+
| **Built-in security** | Path safety, SSRF protection, command scanning, output redaction |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Supported Providers
|
|
92
|
+
|
|
93
|
+
`copilot` · `openai` · `anthropic` · `gemini` · `xai` · `deepseek` · `huggingface` · `zai` · `openrouter` · `ollama` · `lmstudio`
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Alternative Installation Methods
|
|
98
|
+
|
|
99
|
+
| Method | Command |
|
|
100
|
+
|--------|---------|
|
|
101
|
+
| **PyPI** | `pip install edgecrab-cli` |
|
|
102
|
+
| **npm** | `npm install -g edgecrab-cli` |
|
|
103
|
+
| **Cargo** | `cargo install edgecrab-cli` |
|
|
104
|
+
| **Docker** | `docker pull ghcr.io/raphaelmansuy/edgecrab:latest` |
|
|
105
|
+
| **Pre-built binary** | [GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases) |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Documentation
|
|
110
|
+
|
|
111
|
+
Full docs: **[edgecrab.com](https://www.edgecrab.com)**
|
|
112
|
+
|
|
113
|
+
- [Quick Start](https://www.edgecrab.com/getting-started/quick-start/)
|
|
114
|
+
- [Installation Guide](https://www.edgecrab.com/getting-started/installation/)
|
|
115
|
+
- [CLI Commands Reference](https://www.edgecrab.com/reference/cli-commands/)
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## License
|
|
120
|
+
|
|
121
|
+
MIT © [Raphael Mansuy](https://github.com/raphaelmansuy)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# edgecrab-cli (PyPI)
|
|
2
|
+
|
|
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.
|
|
5
|
+
|
|
6
|
+
[](https://pypi.org/project/edgecrab-cli/)
|
|
7
|
+
[](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install edgecrab-cli
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
On first run, the package automatically downloads the correct pre-built Rust binary for
|
|
18
|
+
your platform (macOS arm64/x64, Linux x64/arm64, Windows x64) from
|
|
19
|
+
[GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases).
|
|
20
|
+
|
|
21
|
+
No Rust, GCC, or build tools are required.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# First-run setup wizard — detects API keys, writes ~/.edgecrab/config.yaml
|
|
29
|
+
edgecrab setup
|
|
30
|
+
|
|
31
|
+
# Verify your environment
|
|
32
|
+
edgecrab doctor
|
|
33
|
+
|
|
34
|
+
# Start the interactive TUI
|
|
35
|
+
edgecrab
|
|
36
|
+
|
|
37
|
+
# One-shot query (pipe-friendly)
|
|
38
|
+
edgecrab "summarise the git log for today"
|
|
39
|
+
|
|
40
|
+
# Pick a specific LLM provider
|
|
41
|
+
edgecrab --model anthropic/claude-opus-4 "explain this codebase"
|
|
42
|
+
|
|
43
|
+
# Quiet / pipe mode
|
|
44
|
+
edgecrab --quiet "write a Rust hello-world"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Why EdgeCrab?
|
|
50
|
+
|
|
51
|
+
EdgeCrab is a **Rust-native** autonomous coding agent and personal assistant, inspired by
|
|
52
|
+
the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
|
|
53
|
+
|
|
54
|
+
| Feature | Detail |
|
|
55
|
+
|---------|--------|
|
|
56
|
+
| **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
|
|
57
|
+
| **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
|
|
58
|
+
| **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
|
|
59
|
+
| **ratatui TUI** | 60 fps capable terminal UI with streaming output |
|
|
60
|
+
| **ACP protocol** | Built-in JSON-RPC 2.0 stdio adapter for VS Code Copilot |
|
|
61
|
+
| **Built-in security** | Path safety, SSRF protection, command scanning, output redaction |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Supported Providers
|
|
66
|
+
|
|
67
|
+
`copilot` · `openai` · `anthropic` · `gemini` · `xai` · `deepseek` · `huggingface` · `zai` · `openrouter` · `ollama` · `lmstudio`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Alternative Installation Methods
|
|
72
|
+
|
|
73
|
+
| Method | Command |
|
|
74
|
+
|--------|---------|
|
|
75
|
+
| **PyPI** | `pip install edgecrab-cli` |
|
|
76
|
+
| **npm** | `npm install -g edgecrab-cli` |
|
|
77
|
+
| **Cargo** | `cargo install edgecrab-cli` |
|
|
78
|
+
| **Docker** | `docker pull ghcr.io/raphaelmansuy/edgecrab:latest` |
|
|
79
|
+
| **Pre-built binary** | [GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases) |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Documentation
|
|
84
|
+
|
|
85
|
+
Full docs: **[edgecrab.com](https://www.edgecrab.com)**
|
|
86
|
+
|
|
87
|
+
- [Quick Start](https://www.edgecrab.com/getting-started/quick-start/)
|
|
88
|
+
- [Installation Guide](https://www.edgecrab.com/getting-started/installation/)
|
|
89
|
+
- [CLI Commands Reference](https://www.edgecrab.com/reference/cli-commands/)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
MIT © [Raphael Mansuy](https://github.com/raphaelmansuy)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Binary downloader and resolver for edgecrab-cli.
|
|
3
|
+
|
|
4
|
+
Downloads the correct pre-built Rust binary for the current platform from
|
|
5
|
+
GitHub Releases on first use, caches it in the package directory, and
|
|
6
|
+
provides a resolve() helper to get the absolute path.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import platform
|
|
13
|
+
import shutil
|
|
14
|
+
import stat
|
|
15
|
+
import sys
|
|
16
|
+
import tarfile
|
|
17
|
+
import tempfile
|
|
18
|
+
import zipfile
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
import httpx
|
|
22
|
+
|
|
23
|
+
from edgecrab_cli._version import __version__
|
|
24
|
+
|
|
25
|
+
REPO = "raphaelmansuy/edgecrab"
|
|
26
|
+
|
|
27
|
+
# ── Platform → asset name mapping ────────────────────────────────────────────
|
|
28
|
+
_PLATFORM_MAP: dict[tuple[str, str], str] = {
|
|
29
|
+
("darwin", "arm64"): "edgecrab-aarch64-apple-darwin.tar.gz",
|
|
30
|
+
("darwin", "x86_64"): "edgecrab-x86_64-apple-darwin.tar.gz",
|
|
31
|
+
("linux", "x86_64"): "edgecrab-x86_64-unknown-linux-gnu.tar.gz",
|
|
32
|
+
("linux", "aarch64"): "edgecrab-aarch64-unknown-linux-gnu.tar.gz",
|
|
33
|
+
("linux", "arm64"): "edgecrab-aarch64-unknown-linux-gnu.tar.gz",
|
|
34
|
+
("windows", "amd64"): "edgecrab-x86_64-pc-windows-msvc.zip",
|
|
35
|
+
("windows", "x86_64"): "edgecrab-x86_64-pc-windows-msvc.zip",
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
_BIN_NAME = "edgecrab.exe" if sys.platform == "win32" else "edgecrab"
|
|
39
|
+
|
|
40
|
+
# Cache binary alongside this package
|
|
41
|
+
_CACHE_DIR = Path(__file__).parent / "_bin"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _asset_name() -> str:
|
|
45
|
+
system = sys.platform.lower()
|
|
46
|
+
machine = platform.machine().lower()
|
|
47
|
+
if system.startswith("darwin"):
|
|
48
|
+
key = ("darwin", machine)
|
|
49
|
+
elif system.startswith("linux"):
|
|
50
|
+
key = ("linux", machine)
|
|
51
|
+
elif system.startswith("win"):
|
|
52
|
+
key = ("windows", machine)
|
|
53
|
+
else:
|
|
54
|
+
key = (system, machine)
|
|
55
|
+
asset = _PLATFORM_MAP.get(key)
|
|
56
|
+
if not asset:
|
|
57
|
+
raise RuntimeError(
|
|
58
|
+
f"Unsupported platform: {system}/{machine}. "
|
|
59
|
+
f"Please install from source: cargo install edgecrab-cli"
|
|
60
|
+
)
|
|
61
|
+
return asset
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _download(url: str, dest: Path) -> None:
|
|
65
|
+
print(f"[edgecrab-cli] Downloading binary from {url} …", file=sys.stderr)
|
|
66
|
+
with httpx.stream("GET", url, follow_redirects=True) as resp:
|
|
67
|
+
resp.raise_for_status()
|
|
68
|
+
with open(dest, "wb") as fh:
|
|
69
|
+
for chunk in resp.iter_bytes(chunk_size=65536):
|
|
70
|
+
fh.write(chunk)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _extract(archive: Path, target_dir: Path) -> None:
|
|
74
|
+
name = archive.name
|
|
75
|
+
if name.endswith(".tar.gz") or name.endswith(".tgz"):
|
|
76
|
+
with tarfile.open(archive, "r:gz") as tf:
|
|
77
|
+
# Extract only the binary (may be at root or in a subdirectory)
|
|
78
|
+
for member in tf.getmembers():
|
|
79
|
+
if Path(member.name).name == _BIN_NAME:
|
|
80
|
+
member.name = _BIN_NAME # flatten
|
|
81
|
+
tf.extract(member, path=target_dir)
|
|
82
|
+
return
|
|
83
|
+
# Fallback: extract everything
|
|
84
|
+
tf.extractall(path=target_dir)
|
|
85
|
+
elif name.endswith(".zip"):
|
|
86
|
+
with zipfile.ZipFile(archive) as zf:
|
|
87
|
+
for info in zf.infolist():
|
|
88
|
+
if Path(info.filename).name == _BIN_NAME:
|
|
89
|
+
info.filename = _BIN_NAME # flatten
|
|
90
|
+
zf.extract(info, path=target_dir)
|
|
91
|
+
return
|
|
92
|
+
zf.extractall(path=target_dir)
|
|
93
|
+
else:
|
|
94
|
+
raise RuntimeError(f"Unknown archive format: {name}")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def ensure_binary() -> Path:
|
|
98
|
+
"""Return the path to the edgecrab binary, downloading it if necessary."""
|
|
99
|
+
_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|
100
|
+
dest = _CACHE_DIR / _BIN_NAME
|
|
101
|
+
|
|
102
|
+
if dest.exists():
|
|
103
|
+
return dest
|
|
104
|
+
|
|
105
|
+
asset = _asset_name()
|
|
106
|
+
url = f"https://github.com/{REPO}/releases/download/v{__version__}/{asset}"
|
|
107
|
+
|
|
108
|
+
with tempfile.NamedTemporaryFile(suffix=Path(asset).suffix + (".gz" if ".tar." in asset else ""), delete=False) as tmp:
|
|
109
|
+
tmp_path = Path(tmp.name)
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
_download(url, tmp_path)
|
|
113
|
+
_extract(tmp_path, _CACHE_DIR)
|
|
114
|
+
finally:
|
|
115
|
+
tmp_path.unlink(missing_ok=True)
|
|
116
|
+
|
|
117
|
+
if not dest.exists():
|
|
118
|
+
raise RuntimeError(
|
|
119
|
+
f"Binary {_BIN_NAME} not found in extracted archive. "
|
|
120
|
+
f"Please report this at https://github.com/{REPO}/issues"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Ensure executable
|
|
124
|
+
dest.chmod(dest.stat().st_mode | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
|
|
125
|
+
print(f"[edgecrab-cli] Installed to: {dest}", file=sys.stderr)
|
|
126
|
+
return dest
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def resolve() -> Path:
|
|
130
|
+
"""
|
|
131
|
+
Return the path to the edgecrab binary.
|
|
132
|
+
|
|
133
|
+
First checks for a system-wide `edgecrab` on PATH (e.g. installed via cargo),
|
|
134
|
+
then falls back to the cached downloaded binary.
|
|
135
|
+
"""
|
|
136
|
+
system_binary = shutil.which("edgecrab")
|
|
137
|
+
if system_binary:
|
|
138
|
+
return Path(system_binary)
|
|
139
|
+
return ensure_binary()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Entry point for `edgecrab` console script installed by edgecrab-cli on PyPI."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def main() -> None:
|
|
10
|
+
"""Resolve the native binary and exec it with all CLI arguments."""
|
|
11
|
+
from edgecrab_cli._binary import resolve
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
binary = resolve()
|
|
15
|
+
except RuntimeError as exc:
|
|
16
|
+
print(f"[edgecrab-cli] {exc}", file=sys.stderr)
|
|
17
|
+
sys.exit(1)
|
|
18
|
+
|
|
19
|
+
# Replace the current process with the native binary (Unix) or spawn it (Windows).
|
|
20
|
+
args = [str(binary)] + sys.argv[1:]
|
|
21
|
+
|
|
22
|
+
if os.name == "nt":
|
|
23
|
+
import subprocess
|
|
24
|
+
result = subprocess.run(args, env=os.environ)
|
|
25
|
+
sys.exit(result.returncode)
|
|
26
|
+
else:
|
|
27
|
+
os.execv(str(binary), args)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.0"
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: edgecrab-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: EdgeCrab CLI — Super Powerful Personal Assistant inspired by NousHermes and OpenClaw. Single static binary, blazing-fast TUI, multi-provider LLM.
|
|
5
|
+
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://www.edgecrab.com
|
|
7
|
+
Project-URL: Repository, https://github.com/raphaelmansuy/edgecrab
|
|
8
|
+
Project-URL: Documentation, https://www.edgecrab.com
|
|
9
|
+
Keywords: ai,agent,llm,edgecrab,coding-agent,personal-assistant,cli,nous-hermes,openclaw
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Classifier: Environment :: Console
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: httpx<1,>=0.27.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest<9,>=8.0; extra == "dev"
|
|
26
|
+
|
|
27
|
+
# edgecrab-cli (PyPI)
|
|
28
|
+
|
|
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.
|
|
31
|
+
|
|
32
|
+
[](https://pypi.org/project/edgecrab-cli/)
|
|
33
|
+
[](https://github.com/raphaelmansuy/edgecrab/blob/main/LICENSE)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install edgecrab-cli
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
On first run, the package automatically downloads the correct pre-built Rust binary for
|
|
44
|
+
your platform (macOS arm64/x64, Linux x64/arm64, Windows x64) from
|
|
45
|
+
[GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases).
|
|
46
|
+
|
|
47
|
+
No Rust, GCC, or build tools are required.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# First-run setup wizard — detects API keys, writes ~/.edgecrab/config.yaml
|
|
55
|
+
edgecrab setup
|
|
56
|
+
|
|
57
|
+
# Verify your environment
|
|
58
|
+
edgecrab doctor
|
|
59
|
+
|
|
60
|
+
# Start the interactive TUI
|
|
61
|
+
edgecrab
|
|
62
|
+
|
|
63
|
+
# One-shot query (pipe-friendly)
|
|
64
|
+
edgecrab "summarise the git log for today"
|
|
65
|
+
|
|
66
|
+
# Pick a specific LLM provider
|
|
67
|
+
edgecrab --model anthropic/claude-opus-4 "explain this codebase"
|
|
68
|
+
|
|
69
|
+
# Quiet / pipe mode
|
|
70
|
+
edgecrab --quiet "write a Rust hello-world"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Why EdgeCrab?
|
|
76
|
+
|
|
77
|
+
EdgeCrab is a **Rust-native** autonomous coding agent and personal assistant, inspired by
|
|
78
|
+
the reasoning depth of **NousHermes** and the tool-use power of **OpenClaw**.
|
|
79
|
+
|
|
80
|
+
| Feature | Detail |
|
|
81
|
+
|---------|--------|
|
|
82
|
+
| **Single binary** | 15 MB static binary, < 50 ms startup, ~15 MB resident memory |
|
|
83
|
+
| **Multi-provider LLM** | Copilot · OpenAI · Anthropic · Gemini · xAI · DeepSeek · Ollama |
|
|
84
|
+
| **ReAct tool loop** | File, terminal, web search, memory, process, skill tools |
|
|
85
|
+
| **ratatui TUI** | 60 fps capable terminal UI with streaming output |
|
|
86
|
+
| **ACP protocol** | Built-in JSON-RPC 2.0 stdio adapter for VS Code Copilot |
|
|
87
|
+
| **Built-in security** | Path safety, SSRF protection, command scanning, output redaction |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Supported Providers
|
|
92
|
+
|
|
93
|
+
`copilot` · `openai` · `anthropic` · `gemini` · `xai` · `deepseek` · `huggingface` · `zai` · `openrouter` · `ollama` · `lmstudio`
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Alternative Installation Methods
|
|
98
|
+
|
|
99
|
+
| Method | Command |
|
|
100
|
+
|--------|---------|
|
|
101
|
+
| **PyPI** | `pip install edgecrab-cli` |
|
|
102
|
+
| **npm** | `npm install -g edgecrab-cli` |
|
|
103
|
+
| **Cargo** | `cargo install edgecrab-cli` |
|
|
104
|
+
| **Docker** | `docker pull ghcr.io/raphaelmansuy/edgecrab:latest` |
|
|
105
|
+
| **Pre-built binary** | [GitHub Releases](https://github.com/raphaelmansuy/edgecrab/releases) |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Documentation
|
|
110
|
+
|
|
111
|
+
Full docs: **[edgecrab.com](https://www.edgecrab.com)**
|
|
112
|
+
|
|
113
|
+
- [Quick Start](https://www.edgecrab.com/getting-started/quick-start/)
|
|
114
|
+
- [Installation Guide](https://www.edgecrab.com/getting-started/installation/)
|
|
115
|
+
- [CLI Commands Reference](https://www.edgecrab.com/reference/cli-commands/)
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## License
|
|
120
|
+
|
|
121
|
+
MIT © [Raphael Mansuy](https://github.com/raphaelmansuy)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
edgecrab_cli/__init__.py
|
|
4
|
+
edgecrab_cli/_binary.py
|
|
5
|
+
edgecrab_cli/_entry.py
|
|
6
|
+
edgecrab_cli/_version.py
|
|
7
|
+
edgecrab_cli.egg-info/PKG-INFO
|
|
8
|
+
edgecrab_cli.egg-info/SOURCES.txt
|
|
9
|
+
edgecrab_cli.egg-info/dependency_links.txt
|
|
10
|
+
edgecrab_cli.egg-info/entry_points.txt
|
|
11
|
+
edgecrab_cli.egg-info/requires.txt
|
|
12
|
+
edgecrab_cli.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
edgecrab_cli
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "edgecrab-cli"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
requires-python = ">=3.10"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 4 - Beta",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.10",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Topic :: Software Development :: Libraries",
|
|
21
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
22
|
+
"Environment :: Console",
|
|
23
|
+
]
|
|
24
|
+
keywords = ["ai", "agent", "llm", "edgecrab", "coding-agent", "personal-assistant", "cli", "nous-hermes", "openclaw"]
|
|
25
|
+
description = "EdgeCrab CLI — Super Powerful Personal Assistant inspired by NousHermes and OpenClaw. Single static binary, blazing-fast TUI, multi-provider LLM."
|
|
26
|
+
dependencies = [
|
|
27
|
+
"httpx>=0.27.0,<1",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.optional-dependencies]
|
|
31
|
+
dev = [
|
|
32
|
+
"pytest>=8.0,<9",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
[project.urls]
|
|
36
|
+
Homepage = "https://www.edgecrab.com"
|
|
37
|
+
Repository = "https://github.com/raphaelmansuy/edgecrab"
|
|
38
|
+
Documentation = "https://www.edgecrab.com"
|
|
39
|
+
|
|
40
|
+
[project.scripts]
|
|
41
|
+
edgecrab = "edgecrab_cli._entry:main"
|
|
42
|
+
|
|
43
|
+
[tool.setuptools.packages.find]
|
|
44
|
+
where = ["."]
|
|
45
|
+
include = ["edgecrab_cli*"]
|
|
46
|
+
|
|
47
|
+
[tool.pytest.ini_options]
|
|
48
|
+
testpaths = ["tests"]
|