yncli 1.1.2__tar.gz → 1.1.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.
Files changed (42) hide show
  1. {yncli-1.1.2 → yncli-1.1.4}/PKG-INFO +1 -1
  2. {yncli-1.1.2 → yncli-1.1.4}/pyproject.toml +1 -1
  3. {yncli-1.1.2 → yncli-1.1.4}/setup.py +1 -1
  4. {yncli-1.1.2 → yncli-1.1.4}/yncli/tui.py +31 -10
  5. {yncli-1.1.2 → yncli-1.1.4}/yncli/update_checker.py +11 -1
  6. yncli-1.1.4/yncli/version.py +1 -0
  7. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/PKG-INFO +1 -1
  8. yncli-1.1.2/yncli/version.py +0 -1
  9. {yncli-1.1.2 → yncli-1.1.4}/README.md +0 -0
  10. {yncli-1.1.2 → yncli-1.1.4}/setup.cfg +0 -0
  11. {yncli-1.1.2 → yncli-1.1.4}/yncli/__init__.py +0 -0
  12. {yncli-1.1.2 → yncli-1.1.4}/yncli/agent.py +0 -0
  13. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/architect.md +0 -0
  14. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/code_review.md +0 -0
  15. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/debug_oracle.md +0 -0
  16. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/debugger.md +0 -0
  17. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/polyglot.md +0 -0
  18. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/refactor_master.md +0 -0
  19. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/security_auditor.md +0 -0
  20. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/system_architect.md +0 -0
  21. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/test_runner.md +0 -0
  22. {yncli-1.1.2 → yncli-1.1.4}/yncli/built_in_skills/ultrabrain.md +0 -0
  23. {yncli-1.1.2 → yncli-1.1.4}/yncli/clean_text.py +0 -0
  24. {yncli-1.1.2 → yncli-1.1.4}/yncli/client.py +0 -0
  25. {yncli-1.1.2 → yncli-1.1.4}/yncli/config.py +0 -0
  26. {yncli-1.1.2 → yncli-1.1.4}/yncli/language_detector.py +0 -0
  27. {yncli-1.1.2 → yncli-1.1.4}/yncli/main.py +0 -0
  28. {yncli-1.1.2 → yncli-1.1.4}/yncli/mention_resolver.py +0 -0
  29. {yncli-1.1.2 → yncli-1.1.4}/yncli/skills_manager.py +0 -0
  30. {yncli-1.1.2 → yncli-1.1.4}/yncli/system_prompt.py +0 -0
  31. {yncli-1.1.2 → yncli-1.1.4}/yncli/tools/__init__.py +0 -0
  32. {yncli-1.1.2 → yncli-1.1.4}/yncli/tools/file_tools.py +0 -0
  33. {yncli-1.1.2 → yncli-1.1.4}/yncli/tools/polyglot_tools.py +0 -0
  34. {yncli-1.1.2 → yncli-1.1.4}/yncli/tools/search_tools.py +0 -0
  35. {yncli-1.1.2 → yncli-1.1.4}/yncli/tools/system_tools.py +0 -0
  36. {yncli-1.1.2 → yncli-1.1.4}/yncli/workspace_memory.py +0 -0
  37. {yncli-1.1.2 → yncli-1.1.4}/yncli/workspace_scanner.py +0 -0
  38. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/SOURCES.txt +0 -0
  39. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/dependency_links.txt +0 -0
  40. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/entry_points.txt +0 -0
  41. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/requires.txt +0 -0
  42. {yncli-1.1.2 → yncli-1.1.4}/yncli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yncli
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Autonomous Polyglot AI Coding Agent & TUI
5
5
  Author: Yanzyuyu
6
6
  Requires-Python: >=3.8
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "yncli"
7
- version = "1.1.2"
7
+ version = "1.1.4"
8
8
  description = "Autonomous Polyglot AI Coding Agent & TUI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text(encoding="utf-8") if
6
6
 
7
7
  setup(
8
8
  name="yncli",
9
- version="1.1.2",
9
+ version="1.1.4",
10
10
  description="Autonomous Polyglot AI Coding Agent & TUI",
11
11
  long_description=long_description,
12
12
  long_description_content_type="text/markdown",
@@ -158,7 +158,8 @@ class TerminalUI:
158
158
  if update_info:
159
159
  update_panel = Panel(
160
160
  f"[bold yellow]🔔 Update Tersedia:[/] [dim]v{update_info['current']}[/] → [bold green]v{update_info['latest']}[/]\n"
161
- f"[dim]Perbarui sekarang:[reset] [cyan]pip install -U yncli[/cyan] [dim]atau[/dim] [cyan]npm i -g @yanzyuyu/yncli[/cyan]",
161
+ f"[dim]Ketik [bold cyan]/update[/bold cyan] untuk memperbarui & restart otomatis, atau jalankan:[reset]\n"
162
+ f"• [cyan]yncli --update[/cyan] • [cyan]npm i -g @yanzyuyu/yncli[/cyan]",
162
163
  border_style="yellow",
163
164
  padding=(0, 2)
164
165
  )
@@ -180,6 +181,7 @@ class TerminalUI:
180
181
  table.add_row("/plan", "Masuk ke Plan Mode (Riset & susun PRD plan.md otomatis)")
181
182
  table.add_row("/build", "Masuk ke Build Mode (Eksekusi autonomous pembuatan & editing kode)")
182
183
  table.add_row("/ask", "Masuk ke Ask Mode (Konsultasi murni tanpa modifikasi file)")
184
+ table.add_row("/update, /upgrade", "Perbarui yncli ke versi terbaru & restart otomatis")
183
185
  table.add_row("/cd <folder>", "Pindah direktori kerja aktif")
184
186
  table.add_row("/pwd", "Lihat path direktori saat ini")
185
187
  table.add_row("/approval [on|off]", "Atur persetujuan tool (on = otomatis, off = tanya dulu)")
@@ -202,17 +204,36 @@ class TerminalUI:
202
204
  self.console.print("[red]Gagal mengambil daftar model dari server.[/red]")
203
205
  return
204
206
 
207
+ # Filter out dead / zero-quota prefixes from provider (e.g. 'guts/' which returns 402 Payment Required)
208
+ # Prioritize top working models: 'ag/', 'cx/'
209
+ def model_sort_key(m_dict):
210
+ mid = m_dict.get("id", "")
211
+ if mid.startswith("ag/"):
212
+ return (0, mid)
213
+ elif mid.startswith("cx/"):
214
+ return (1, mid)
215
+ elif mid.startswith("cbcn/"):
216
+ return (3, mid)
217
+ elif mid.startswith("guts/"):
218
+ return (4, mid)
219
+ return (2, mid)
220
+
221
+ sorted_models = sorted(models, key=model_sort_key)
222
+
205
223
  values = []
206
- for m in models:
224
+ for m in sorted_models:
207
225
  mid = m.get("id", "")
208
- caps = []
209
- mcap = m.get("capabilities", {})
210
- if mcap.get("reasoning"):
211
- caps.append("Thinking")
212
- if mcap.get("tools"):
213
- caps.append("Tools")
214
- cap_str = f" [{', '.join(caps)}]" if caps else ""
215
- label = f"{mid}{cap_str}"
226
+ # Skip completely unpayable/broken models
227
+ if mid.startswith("guts/"):
228
+ continue
229
+
230
+ badge = ""
231
+ if mid.startswith("ag/"):
232
+ badge = " ⭐ (Ultra Fast & Stable)"
233
+ elif mid.startswith("cx/"):
234
+ badge = " ⚡ (Active)"
235
+
236
+ label = f"{mid}{badge}"
216
237
  values.append((mid, label))
217
238
 
218
239
  try:
@@ -110,9 +110,19 @@ def perform_self_update() -> bool:
110
110
  res = subprocess.run(pip_cmd)
111
111
  if res.returncode == 0:
112
112
  print("\n[SUCCESS] YNCLI berhasil diperbarui ke versi terbaru!")
113
- print("Silakan jalankan 'yncli' kembali untuk menikmati fitur baru.\n")
113
+ print("[YNCLI] Memulai ulang (restarting) CLI secara otomatis...\n")
114
114
  # Clear update cache
115
115
  CACHE_FILE.unlink(missing_ok=True)
116
+
117
+ # Automatically restart current process with same arguments
118
+ try:
119
+ import os
120
+ # Close old process and replace with new python instance
121
+ os.execv(sys.executable, [sys.executable, "-m", "yncli.main"] + sys.argv[1:])
122
+ except Exception:
123
+ # Fallback for Windows where execv might spawn
124
+ subprocess.run([sys.executable, "-m", "yncli.main"])
125
+ sys.exit(0)
116
126
  return True
117
127
  else:
118
128
  print("\n[ERROR] Gagal memperbarui via pip. Coba jalankan manual:")
@@ -0,0 +1 @@
1
+ __version__ = "1.1.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yncli
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Autonomous Polyglot AI Coding Agent & TUI
5
5
  Author: Yanzyuyu
6
6
  Requires-Python: >=3.8
@@ -1 +0,0 @@
1
- __version__ = "1.1.2"
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