utim-cli 1.0.0__tar.gz → 1.43.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.
- {utim_cli-1.0.0/utim_cli.egg-info → utim_cli-1.43.0}/PKG-INFO +1 -1
- {utim_cli-1.0.0 → utim_cli-1.43.0}/pyproject.toml +1 -1
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/utim.py +33 -8
- {utim_cli-1.0.0 → utim_cli-1.43.0/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-1.0.0 → utim_cli-1.43.0}/CHANGELOG.md +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/LICENSE +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/MANIFEST.in +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/README.md +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/setup.cfg +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/setup.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/__init__.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/agent.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/auth.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/backup.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/billing.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/config.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/doctor.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/logger.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/mcp_client.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/orchestrator.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/reflection.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/report.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/share.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/state.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/tools.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli/workspace.py +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-1.0.0 → utim_cli-1.43.0}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utim-cli"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.43.0"
|
|
8
8
|
description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -422,6 +422,7 @@ PT_STYLE = PTStyle.from_dict({
|
|
|
422
422
|
'input-field': 'fg:#cdd6f4',
|
|
423
423
|
'input-prompt': 'fg:#cdd6f4 bold',
|
|
424
424
|
'image-path': 'fg:#a6e3a1',
|
|
425
|
+
'placeholder': 'fg:#45475a italic',
|
|
425
426
|
|
|
426
427
|
# Status bar
|
|
427
428
|
'status-bar': '',
|
|
@@ -992,7 +993,7 @@ def _handle_command(cmd: str, orchestrator: Orchestrator, app_ref) -> None:
|
|
|
992
993
|
con.print(Panel(
|
|
993
994
|
Text.from_markup(
|
|
994
995
|
"[bold white]U Think I Make (UTIM)[/bold white]\n"
|
|
995
|
-
"[dim]Version
|
|
996
|
+
"[dim]Version 1.43.0[/dim]\n\n"
|
|
996
997
|
"The next-generation CLI agent for autonomous software engineering.\n"
|
|
997
998
|
"Built with [bold #42bcf5]UTIM AI[/bold #42bcf5].\n\n"
|
|
998
999
|
"[dim]Website:[/dim] https://utim.dev\n"
|
|
@@ -2864,6 +2865,10 @@ def _manual_confirm_internal(tool_name: str, arguments: dict, diff_lines: list =
|
|
|
2864
2865
|
if tool_name == "run_command":
|
|
2865
2866
|
import utim_cli.tools as _t
|
|
2866
2867
|
is_safe, reason = _t.analyze_command_safety(target_str)
|
|
2868
|
+
# ── Session-level safe-command bypass ─────────────────────────────
|
|
2869
|
+
if is_safe and STATE.get("session_allow_safe_cmds"):
|
|
2870
|
+
_t.approve_command(target_str)
|
|
2871
|
+
return "allow"
|
|
2867
2872
|
if is_safe:
|
|
2868
2873
|
body.append(f"? {label} (Safe): ", style="bold green")
|
|
2869
2874
|
body.append(target_str, style="bold white")
|
|
@@ -2929,12 +2934,16 @@ def _manual_confirm_internal(tool_name: str, arguments: dict, diff_lines: list =
|
|
|
2929
2934
|
_t.approve_command(target_str)
|
|
2930
2935
|
console.print("[dim] ✓ Allowed[/dim]\n")
|
|
2931
2936
|
return "allow"
|
|
2932
|
-
elif choice == 1: # Allow session
|
|
2937
|
+
elif choice == 1: # Allow session / auto-allow safe
|
|
2933
2938
|
if tool_name == "run_command":
|
|
2934
2939
|
import utim_cli.tools as _t
|
|
2935
2940
|
_t.approve_command(target_str)
|
|
2936
|
-
|
|
2937
|
-
|
|
2941
|
+
# Mark that safe commands should be auto-allowed for the rest of the session
|
|
2942
|
+
STATE["session_allow_safe_cmds"] = True
|
|
2943
|
+
console.print("[dim] ✓ Allowed for session — safe commands will auto-run[/dim]\n")
|
|
2944
|
+
else:
|
|
2945
|
+
console.print("[dim] ✓ Allowed for session — auto-accepting remaining changes[/dim]\n")
|
|
2946
|
+
STATE["mode"] = "auto-accept edits"
|
|
2938
2947
|
return "allow_session"
|
|
2939
2948
|
else: # Reject / Escape
|
|
2940
2949
|
if tool_name == "run_command":
|
|
@@ -3275,6 +3284,13 @@ def _build_pt_app(orchestrator, last_sigint):
|
|
|
3275
3284
|
|
|
3276
3285
|
@kb.add('enter')
|
|
3277
3286
|
def _on_enter(event):
|
|
3287
|
+
buf = input_field.buffer
|
|
3288
|
+
|
|
3289
|
+
# ── If completion menu is open, accept the highlighted item ──────────
|
|
3290
|
+
if buf.complete_state:
|
|
3291
|
+
buf.apply_completion(buf.complete_state.current_completion)
|
|
3292
|
+
return
|
|
3293
|
+
|
|
3278
3294
|
text = input_field.text.strip()
|
|
3279
3295
|
input_field.text = ''
|
|
3280
3296
|
_hist_state["cursor"] = -1
|
|
@@ -3282,12 +3298,21 @@ def _build_pt_app(orchestrator, last_sigint):
|
|
|
3282
3298
|
|
|
3283
3299
|
if not text:
|
|
3284
3300
|
return
|
|
3285
|
-
|
|
3301
|
+
|
|
3286
3302
|
if text.startswith('/'):
|
|
3303
|
+
# Strip to just the command word (e.g. "/res" → "/resume" after completion)
|
|
3304
|
+
cmd_word = text.split()[0].lower()
|
|
3305
|
+
# If incomplete slash command with no match, try to find best prefix match
|
|
3306
|
+
bare = cmd_word.lstrip('/')
|
|
3307
|
+
if bare and bare not in COMMANDS:
|
|
3308
|
+
match = next((c for c in COMMANDS if c.startswith(bare)), None)
|
|
3309
|
+
if match:
|
|
3310
|
+
cmd_word = '/' + match
|
|
3311
|
+
text = cmd_word # replace with resolved command
|
|
3287
3312
|
if STATE["busy"]:
|
|
3288
3313
|
console.print(f"\n[dim yellow]⚠ Cannot execute command {text} while agent is busy.[/dim yellow]")
|
|
3289
3314
|
return
|
|
3290
|
-
run_in_terminal(lambda: _handle_command(
|
|
3315
|
+
run_in_terminal(lambda: _handle_command(cmd_word, orchestrator, event.app))
|
|
3291
3316
|
return
|
|
3292
3317
|
|
|
3293
3318
|
if not _prompt_history or _prompt_history[-1] != text:
|
|
@@ -3420,7 +3445,7 @@ def _build_pt_app(orchestrator, last_sigint):
|
|
|
3420
3445
|
Float(
|
|
3421
3446
|
xcursor=True,
|
|
3422
3447
|
ycursor=True,
|
|
3423
|
-
content=CompletionsMenu(max_height=
|
|
3448
|
+
content=CompletionsMenu(max_height=8, scroll_offset=2),
|
|
3424
3449
|
),
|
|
3425
3450
|
],
|
|
3426
3451
|
),
|
|
@@ -3657,7 +3682,7 @@ app = typer.Typer()
|
|
|
3657
3682
|
def version_callback(value: bool):
|
|
3658
3683
|
if value:
|
|
3659
3684
|
import typer
|
|
3660
|
-
print("
|
|
3685
|
+
print("U Think I Make v1.43.0")
|
|
3661
3686
|
raise typer.Exit()
|
|
3662
3687
|
|
|
3663
3688
|
@app.callback(invoke_without_command=True)
|
|
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
|