aizen-ai-cli 2.2.3__tar.gz → 2.2.4__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.
- {aizen_ai_cli-2.2.3/aizen_ai_cli.egg-info → aizen_ai_cli-2.2.4}/PKG-INFO +1 -1
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/config.py +25 -8
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/tools.py +22 -13
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4/aizen_ai_cli.egg-info}/PKG-INFO +1 -1
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/pyproject.toml +1 -1
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/setup.py +1 -1
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/MANIFEST.in +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/README.md +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/__init__.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/commands.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/context.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/exceptions.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/logging_config.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/main.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/mcp.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/plugins.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/retry.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/session.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen/utils.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen_ai_cli.egg-info/SOURCES.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen_ai_cli.egg-info/dependency_links.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen_ai_cli.egg-info/entry_points.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen_ai_cli.egg-info/requires.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/aizen_ai_cli.egg-info/top_level.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/requirements.txt +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/setup.cfg +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_commands.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_config.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_context.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_main.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_mcp.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_session.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_tools.py +0 -0
- {aizen_ai_cli-2.2.3 → aizen_ai_cli-2.2.4}/tests/test_utils.py +0 -0
|
@@ -21,7 +21,7 @@ logger = logging.getLogger("aizen")
|
|
|
21
21
|
|
|
22
22
|
# Read version from installed package metadata (stays in sync with pyproject.toml).
|
|
23
23
|
# Falls back to a hardcoded value only when running from source without installing.
|
|
24
|
-
_FALLBACK_VERSION = "2.2.
|
|
24
|
+
_FALLBACK_VERSION = "2.2.4"
|
|
25
25
|
try:
|
|
26
26
|
VERSION = _pkg_version("aizen-ai-cli")
|
|
27
27
|
except PackageNotFoundError:
|
|
@@ -273,12 +273,20 @@ def _do_update_check(config: dict):
|
|
|
273
273
|
except Exception as e:
|
|
274
274
|
logger.debug("Failed to save config after update check: %s", e)
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
try:
|
|
277
|
+
latest_parts = tuple(map(int, latest.split('.')))
|
|
278
|
+
current_parts = tuple(map(int, VERSION.split('.')))
|
|
279
|
+
is_newer = latest_parts > current_parts
|
|
280
|
+
except Exception:
|
|
281
|
+
is_newer = latest != VERSION
|
|
282
|
+
|
|
283
|
+
if is_newer:
|
|
277
284
|
console.print(
|
|
278
285
|
f"\n[bold magenta]🔔 Update available:[/bold magenta] v{VERSION} → v{latest}"
|
|
279
286
|
)
|
|
280
287
|
console.print("[dim]Run: pip install -U aizen-ai-cli (or brew upgrade aizen)[/dim]")
|
|
281
|
-
console.print("[dim]Then restart Aizen to use the new version![/dim]\n"
|
|
288
|
+
console.print("[dim]Then restart Aizen to use the new version![/dim]\n"
|
|
289
|
+
)
|
|
282
290
|
except Exception as e:
|
|
283
291
|
logger.debug("Update check failed (network/parsing): %s", e)
|
|
284
292
|
|
|
@@ -295,11 +303,20 @@ def check_for_updates(config: dict | None = None):
|
|
|
295
303
|
# Check if we have a cached latest version that's newer
|
|
296
304
|
cached = config.get("_latest_version")
|
|
297
305
|
if cached and cached != VERSION:
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
306
|
+
try:
|
|
307
|
+
cached_parts = tuple(map(int, cached.split('.')))
|
|
308
|
+
current_parts = tuple(map(int, VERSION.split('.')))
|
|
309
|
+
is_newer = cached_parts > current_parts
|
|
310
|
+
except Exception:
|
|
311
|
+
is_newer = cached != VERSION
|
|
312
|
+
|
|
313
|
+
if is_newer:
|
|
314
|
+
console.print(
|
|
315
|
+
f"\n[bold magenta]🔔 Update available:[/bold magenta] v{VERSION} → v{cached}"
|
|
316
|
+
)
|
|
317
|
+
console.print("[dim]Run: pip install -U aizen-ai-cli (or brew upgrade aizen)[/dim]")
|
|
318
|
+
console.print("[dim]Then restart Aizen to use the new version![/dim]\n"
|
|
319
|
+
)
|
|
303
320
|
return
|
|
304
321
|
|
|
305
322
|
thread = threading.Thread(target=_do_update_check, args=(config,), daemon=True)
|
|
@@ -697,19 +697,28 @@ def run_command_impl(command: str, auto_approve: bool = False, timeout: int = 12
|
|
|
697
697
|
logger.warning("Command timed out after %ds: %s", timeout, command)
|
|
698
698
|
return f"Error: Command timed out after {timeout} seconds."
|
|
699
699
|
|
|
700
|
-
# Read available stdout non-blockingly
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
700
|
+
# Read available stdout and stderr non-blockingly
|
|
701
|
+
reads = []
|
|
702
|
+
if proc.stdout: reads.append(proc.stdout)
|
|
703
|
+
if proc.stderr: reads.append(proc.stderr)
|
|
704
|
+
|
|
705
|
+
if reads:
|
|
706
|
+
rlist, _, _ = select.select(reads, [], [], 0.1)
|
|
707
|
+
for fd in rlist:
|
|
708
|
+
if fd == proc.stdout:
|
|
709
|
+
line = proc.stdout.readline()
|
|
710
|
+
if line:
|
|
711
|
+
stdout_lines.append(line)
|
|
712
|
+
# Show live output tail (last 15 lines)
|
|
713
|
+
tail = "".join(stdout_lines[-15:])
|
|
714
|
+
display = Text()
|
|
715
|
+
display.append(f" ▶ Running ({elapsed:.0f}s)\n", style="dim italic")
|
|
716
|
+
display.append(tail.rstrip(), style="dim")
|
|
717
|
+
live.update(display)
|
|
718
|
+
elif fd == proc.stderr:
|
|
719
|
+
line = proc.stderr.readline()
|
|
720
|
+
if line:
|
|
721
|
+
stderr_lines.append(line)
|
|
713
722
|
|
|
714
723
|
# Read remaining output after process exits
|
|
715
724
|
if proc.stdout:
|
|
@@ -8,7 +8,7 @@ def parse_requirements(filename):
|
|
|
8
8
|
|
|
9
9
|
setup(
|
|
10
10
|
name="aizen-ai-cli",
|
|
11
|
-
version="2.2.
|
|
11
|
+
version="2.2.4",
|
|
12
12
|
description="Aizen AI Agent — A professional-grade AI coding assistant for your terminal.",
|
|
13
13
|
packages=["aizen"],
|
|
14
14
|
install_requires=parse_requirements("requirements.txt"),
|
|
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
|