evo-cli 0.10.0__tar.gz → 0.10.2__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.
- {evo_cli-0.10.0 → evo_cli-0.10.2}/PKG-INFO +1 -1
- evo_cli-0.10.2/evo_cli/VERSION +1 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/opencode.py +20 -4
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/console.py +30 -4
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/PKG-INFO +1 -1
- evo_cli-0.10.0/evo_cli/VERSION +0 -1
- {evo_cli-0.10.0 → evo_cli-0.10.2}/Containerfile +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/HISTORY.md +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/LICENSE +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/MANIFEST.in +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/README.md +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/__init__.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/__main__.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/base.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/cli.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/__init__.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/cloudflare.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/fix_claude.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/gdrive.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/localproxy.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/mcp.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/miniconda.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/netcheck.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/plantuml.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/site2s.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/ssh.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/sysmon.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/commands/wifi.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli/mcp_registry.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/SOURCES.txt +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/dependency_links.txt +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/entry_points.txt +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/requires.txt +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/evo_cli.egg-info/top_level.txt +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/pyproject.toml +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/setup.cfg +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/__init__.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_cli.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_console.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_fix_claude.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_mcp.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_opencode.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_plantuml.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_sysmon.py +0 -0
- {evo_cli-0.10.0 → evo_cli-0.10.2}/tests/test_wifi.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.10.2
|
|
@@ -10,7 +10,7 @@ import rich_click as click
|
|
|
10
10
|
from rich.panel import Panel
|
|
11
11
|
from rich.text import Text
|
|
12
12
|
|
|
13
|
-
from evo_cli.console import console, error, info, run_command, step, success, warning
|
|
13
|
+
from evo_cli.console import console, error, info, resolve_executable, run_command, step, success, warning
|
|
14
14
|
from evo_cli.mcp_registry import opencode_servers
|
|
15
15
|
|
|
16
16
|
EPILOG = Text.from_markup(
|
|
@@ -52,7 +52,14 @@ def ensure_node_installed():
|
|
|
52
52
|
npx_cmd = shutil.which("npx")
|
|
53
53
|
|
|
54
54
|
if node_cmd and npm_cmd and npx_cmd:
|
|
55
|
-
result = subprocess.run(
|
|
55
|
+
result = subprocess.run(
|
|
56
|
+
resolve_executable(["node", "--version"]),
|
|
57
|
+
capture_output=True,
|
|
58
|
+
text=True,
|
|
59
|
+
encoding="utf-8",
|
|
60
|
+
errors="replace",
|
|
61
|
+
check=True,
|
|
62
|
+
)
|
|
56
63
|
info(f"Node.js found: {result.stdout.strip()}")
|
|
57
64
|
return node_cmd, npm_cmd, npx_cmd
|
|
58
65
|
|
|
@@ -152,7 +159,14 @@ def opencode_version():
|
|
|
152
159
|
if not shutil.which("opencode"):
|
|
153
160
|
return None
|
|
154
161
|
try:
|
|
155
|
-
result = subprocess.run(
|
|
162
|
+
result = subprocess.run(
|
|
163
|
+
resolve_executable(["opencode", "--version"]),
|
|
164
|
+
capture_output=True,
|
|
165
|
+
text=True,
|
|
166
|
+
encoding="utf-8",
|
|
167
|
+
errors="replace",
|
|
168
|
+
timeout=30,
|
|
169
|
+
)
|
|
156
170
|
return result.stdout.strip() or "unknown"
|
|
157
171
|
except Exception:
|
|
158
172
|
return "unknown"
|
|
@@ -293,10 +307,12 @@ def verify_mcp_servers():
|
|
|
293
307
|
for name, cmd in _local_mcp_commands():
|
|
294
308
|
try:
|
|
295
309
|
result = subprocess.run(
|
|
296
|
-
cmd,
|
|
310
|
+
resolve_executable(cmd),
|
|
297
311
|
input=init_message,
|
|
298
312
|
capture_output=True,
|
|
299
313
|
text=True,
|
|
314
|
+
encoding="utf-8",
|
|
315
|
+
errors="replace",
|
|
300
316
|
timeout=30,
|
|
301
317
|
)
|
|
302
318
|
if result.returncode == 0 and '"jsonrpc":"2.0"' in result.stdout:
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import shutil
|
|
1
2
|
import subprocess
|
|
3
|
+
import sys
|
|
2
4
|
import urllib.request
|
|
3
5
|
|
|
4
6
|
from rich.console import Console
|
|
@@ -12,6 +14,14 @@ from rich.progress import (
|
|
|
12
14
|
)
|
|
13
15
|
from rich.theme import Theme
|
|
14
16
|
|
|
17
|
+
for _stream in (sys.stdout, sys.stderr):
|
|
18
|
+
_reconfigure = getattr(_stream, "reconfigure", None)
|
|
19
|
+
if _reconfigure is not None:
|
|
20
|
+
try:
|
|
21
|
+
_reconfigure(encoding="utf-8", errors="replace")
|
|
22
|
+
except (ValueError, OSError):
|
|
23
|
+
pass
|
|
24
|
+
|
|
15
25
|
EVO_THEME = Theme(
|
|
16
26
|
{
|
|
17
27
|
"info": "cyan",
|
|
@@ -52,11 +62,27 @@ def step(title):
|
|
|
52
62
|
console.rule(f"[step]{title}[/step]", style="step", align="left")
|
|
53
63
|
|
|
54
64
|
|
|
65
|
+
def resolve_executable(cmd):
|
|
66
|
+
cmd = [str(part) for part in cmd]
|
|
67
|
+
if cmd:
|
|
68
|
+
resolved = shutil.which(cmd[0])
|
|
69
|
+
if resolved:
|
|
70
|
+
cmd[0] = resolved
|
|
71
|
+
return cmd
|
|
72
|
+
|
|
73
|
+
|
|
55
74
|
def run_command(cmd, capture=False, check=True, input_text=None, status=None, timeout=None, stdin=None):
|
|
56
75
|
cmd = [str(part) for part in cmd]
|
|
57
76
|
console.print(f"[cmd]$ {' '.join(cmd)}[/cmd]")
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
exec_cmd = resolve_executable(cmd)
|
|
78
|
+
|
|
79
|
+
run_kwargs = {
|
|
80
|
+
"text": True,
|
|
81
|
+
"encoding": "utf-8",
|
|
82
|
+
"errors": "replace",
|
|
83
|
+
"input": input_text,
|
|
84
|
+
"timeout": timeout,
|
|
85
|
+
}
|
|
60
86
|
# subprocess.run rejects passing both `input` and `stdin`. Only attach an
|
|
61
87
|
# explicit stdin (e.g. DEVNULL) when we are not feeding input, so callers can
|
|
62
88
|
# detach a child from the terminal and avoid it blocking on an inherited TTY.
|
|
@@ -66,12 +92,12 @@ def run_command(cmd, capture=False, check=True, input_text=None, status=None, ti
|
|
|
66
92
|
try:
|
|
67
93
|
if status:
|
|
68
94
|
with console.status(f"[info]{status}[/info]", spinner="dots"):
|
|
69
|
-
result = subprocess.run(
|
|
95
|
+
result = subprocess.run(exec_cmd, capture_output=True, **run_kwargs)
|
|
70
96
|
output = (result.stdout or "").strip()
|
|
71
97
|
if output:
|
|
72
98
|
console.print(output)
|
|
73
99
|
else:
|
|
74
|
-
result = subprocess.run(
|
|
100
|
+
result = subprocess.run(exec_cmd, capture_output=capture, **run_kwargs)
|
|
75
101
|
except subprocess.TimeoutExpired as exc:
|
|
76
102
|
console.print(f"[error]command timed out after {timeout}s: {' '.join(cmd)}[/error]")
|
|
77
103
|
if check:
|
evo_cli-0.10.0/evo_cli/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.10.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|