cli-tools-kit 1.1.1__tar.gz → 1.3.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.
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/PKG-INFO +5 -5
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/README.md +4 -4
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/__init__.py +1 -1
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/gui_installer.py +9 -71
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/settings.py +1 -15
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/PKG-INFO +5 -5
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/LICENSE +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/__main__.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/advertise.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/autostart.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/autostart_gate.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/cli.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/cron_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/discovery.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/host.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/icons.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/identity.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/install.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/onboarding.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/skills.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/sources.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/state.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/sweep.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/__init__.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/build.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/capability.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/cluster.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/corpus.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/embedder.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/groups.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/llm_groups.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/testing.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/tool_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/tui_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/upgrade.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/SOURCES.txt +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/dependency_links.txt +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/entry_points.txt +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/requires.txt +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/top_level.txt +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/pyproject.toml +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/setup.cfg +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_autostart_gate.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_capability_groups.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_cron_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_e2e.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_engine.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_gui_smoke.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_hooks.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_host.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_identity.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_llm_groups.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_public_api.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_skills.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_sources.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_taxonomy_cluster.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_testing.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_tool_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_tui_installer.py +0 -0
- {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_upgrade.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-tools-kit
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Installer protocol + helpers for self-installing Python CLI/GUI tools (desktop shortcuts, bash aliases, cron entries), plus reusable tkinter and curses installer screens
|
|
5
5
|
Author: Steffen Probst
|
|
6
6
|
License: MIT License
|
|
@@ -77,10 +77,10 @@ Provides:
|
|
|
77
77
|
- **`gui_installer`** — a full, reusable tkinter GUI installer *engine*: it
|
|
78
78
|
discovers every tool in a project tree that speaks `--advertise`, and offers
|
|
79
79
|
batch install/remove, per-row skill toggles, themes, orphan cleanup, and an
|
|
80
|
-
opt-in login update-check. A thin wrapper
|
|
81
|
-
`gui_installer.run(root_dir=...,
|
|
82
|
-
(discovery layout, repo-cache
|
|
83
|
-
identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
80
|
+
opt-in login update-check (`--enable-autostart-check`). A thin wrapper
|
|
81
|
+
points it at its own tree via `gui_installer.run(root_dir=...,
|
|
82
|
+
entry_script=...)`; everything else (discovery layout, repo-cache
|
|
83
|
+
bootstrap, login-check policy, window/desktop identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
84
84
|
|
|
85
85
|
- **`sources`** — one installer offering tools from several repos. A TOML
|
|
86
86
|
file lists them, the kit clones what is missing over HTTPS and hands the
|
|
@@ -17,10 +17,10 @@ Provides:
|
|
|
17
17
|
- **`gui_installer`** — a full, reusable tkinter GUI installer *engine*: it
|
|
18
18
|
discovers every tool in a project tree that speaks `--advertise`, and offers
|
|
19
19
|
batch install/remove, per-row skill toggles, themes, orphan cleanup, and an
|
|
20
|
-
opt-in login update-check. A thin wrapper
|
|
21
|
-
`gui_installer.run(root_dir=...,
|
|
22
|
-
(discovery layout, repo-cache
|
|
23
|
-
identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
20
|
+
opt-in login update-check (`--enable-autostart-check`). A thin wrapper
|
|
21
|
+
points it at its own tree via `gui_installer.run(root_dir=...,
|
|
22
|
+
entry_script=...)`; everything else (discovery layout, repo-cache
|
|
23
|
+
bootstrap, login-check policy, window/desktop identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
24
24
|
|
|
25
25
|
- **`sources`** — one installer offering tools from several repos. A TOML
|
|
26
26
|
file lists them, the kit clones what is missing over HTTPS and hands the
|
|
@@ -299,9 +299,9 @@ class InstallerApp:
|
|
|
299
299
|
if self.orphan_desktops or self.orphan_aliases:
|
|
300
300
|
self.root.after(100, self._show_orphan_warning)
|
|
301
301
|
|
|
302
|
-
#
|
|
303
|
-
#
|
|
304
|
-
#
|
|
302
|
+
# Apply pending local updates on this launch, visibly logged (see
|
|
303
|
+
# _maybe_auto_update_on_startup). Runs after the orphan warning so the
|
|
304
|
+
# two don't fight over the log/dialog at the same tick.
|
|
305
305
|
self.root.after(200, self._maybe_auto_update_on_startup)
|
|
306
306
|
|
|
307
307
|
# Newer installer, tool repos or kit: asks git and pip off the main
|
|
@@ -991,58 +991,18 @@ class InstallerApp:
|
|
|
991
991
|
self._apply_btn.pack(side="right", padx=5)
|
|
992
992
|
self._apply_highlighted = False
|
|
993
993
|
self._op_in_progress = False # guards against overlapping bulk operations
|
|
994
|
-
ttk.Button(footer, text="Refresh Status", command=self._update_status_labels).pack(side="right", padx=5)
|
|
995
994
|
|
|
996
995
|
ttk.Button(footer, text="Select All", command=self._select_all).pack(side="left", padx=5)
|
|
997
996
|
ttk.Button(footer, text="Select None", command=self._select_none).pack(side="left", padx=5)
|
|
998
997
|
|
|
999
998
|
ttk.Separator(footer, orient="vertical").pack(side="left", fill="y", padx=15)
|
|
1000
999
|
|
|
1001
|
-
# Auto-update-on-startup toggle: persists to config.json so that the
|
|
1002
|
-
# NEXT launch of this GUI silently applies any pending local updates —
|
|
1003
|
-
# the same network-free reconciliation as clicking the badge to its
|
|
1004
|
-
# right — logging what it did to the Operation Log so it stays visible
|
|
1005
|
-
# even though it ran automatically. Sits immediately left of the badge.
|
|
1006
|
-
self._auto_update_startup_var = tk.BooleanVar(value=settings.get_auto_update_on_startup())
|
|
1007
|
-
auto_update_cb = ttk.Checkbutton(
|
|
1008
|
-
footer, variable=self._auto_update_startup_var,
|
|
1009
|
-
command=self._toggle_auto_update_startup)
|
|
1010
|
-
auto_update_cb.pack(side="left", padx=(5, 2))
|
|
1011
|
-
self._attach_tooltip(
|
|
1012
|
-
auto_update_cb,
|
|
1013
|
-
"Auto-update on startup\n\n"
|
|
1014
|
-
"When checked, the next time this installer GUI starts it "
|
|
1015
|
-
"automatically applies any pending local updates (the same "
|
|
1016
|
-
"network-free shortcut/alias refresh as clicking the badge to "
|
|
1017
|
-
"the right) and logs what it did to the Operation Log below.")
|
|
1018
|
-
|
|
1019
1000
|
# Stale-shortcut indicator (the "Update all" replacement): a count badge —
|
|
1020
1001
|
# an "N updates pending" pill that falls back to a muted "Up to date", with a
|
|
1021
1002
|
# hover tooltip detailing which tools drifted and when. Local-only (orphan
|
|
1022
1003
|
# cleanup + .desktop/alias refresh, no pip).
|
|
1023
1004
|
self._build_update_btn(footer)
|
|
1024
1005
|
|
|
1025
|
-
# Login auto-check toggle: enable/disable the ~/.config/autostart entry that
|
|
1026
|
-
# runs `installer.py --check` once per login — applies the same local-only
|
|
1027
|
-
# reconciliations the badge does (no pip) and notifies for new tools. Same
|
|
1028
|
-
# safety class as the badge, so it sits in the badge's group.
|
|
1029
|
-
ttk.Separator(footer, orient="vertical").pack(side="left", fill="y", padx=15)
|
|
1030
|
-
self._autostart_check_var = tk.BooleanVar(value=autostart.autostart_check_enabled())
|
|
1031
|
-
self._autostart_check_cb = ttk.Checkbutton(
|
|
1032
|
-
footer, text="Check on login", variable=self._autostart_check_var,
|
|
1033
|
-
command=self._toggle_autostart_check)
|
|
1034
|
-
self._autostart_check_cb.pack(side="left", padx=5)
|
|
1035
|
-
self._attach_tooltip(
|
|
1036
|
-
self._autostart_check_cb,
|
|
1037
|
-
"Check for updates on login (local, no network)\n\n"
|
|
1038
|
-
"Installs a startup entry that, once per login, applies "
|
|
1039
|
-
"network-free reconciliations (drifted shortcuts, renamed aliases, and "
|
|
1040
|
-
"stale installed skills — rewritten from the tool's source on disk, "
|
|
1041
|
-
"never pip) and only notifies for updates that need the network (a new, "
|
|
1042
|
-
"not-yet-installed tool).\n\n"
|
|
1043
|
-
f"Entry: {state.AUTOSTART_CHECK_DESKTOP}\n"
|
|
1044
|
-
f"Log: {state.CHECK_LOG}")
|
|
1045
|
-
|
|
1046
1006
|
# "Reinstall deps" is the deliberate, network-touching pip action — kept in
|
|
1047
1007
|
# its own group (own separator) so it reads as distinct from the local badge.
|
|
1048
1008
|
ttk.Separator(footer, orient="vertical").pack(side="left", fill="y", padx=15)
|
|
@@ -1057,8 +1017,6 @@ class InstallerApp:
|
|
|
1057
1017
|
"Unlike the update badge (local shortcut refresh, no network), this "
|
|
1058
1018
|
"reaches the internet and confirms before running.")
|
|
1059
1019
|
|
|
1060
|
-
ttk.Separator(footer, orient="vertical").pack(side="left", fill="y", padx=15)
|
|
1061
|
-
|
|
1062
1020
|
# Collapsible Log Area
|
|
1063
1021
|
self.log_expanded = tk.BooleanVar(value=False)
|
|
1064
1022
|
|
|
@@ -3933,25 +3891,15 @@ class InstallerApp:
|
|
|
3933
3891
|
"""
|
|
3934
3892
|
self._bulk_reinstall(skip_deps=True, only_stale=True)
|
|
3935
3893
|
|
|
3936
|
-
def _toggle_auto_update_startup(self):
|
|
3937
|
-
"""Persist the 'Auto-update on startup' checkbox to config.json."""
|
|
3938
|
-
settings.set_auto_update_on_startup(self._auto_update_startup_var.get())
|
|
3939
|
-
|
|
3940
3894
|
def _maybe_auto_update_on_startup(self):
|
|
3941
|
-
"""Run once per GUI launch, after the initial status scan
|
|
3942
|
-
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
stays visible rather than happening silently in the background."""
|
|
3946
|
-
if not self._auto_update_startup_var.get():
|
|
3895
|
+
"""Run once per GUI launch, after the initial status scan: apply the
|
|
3896
|
+
network-free reconciliation the Up-to-date badge offers. The log opens
|
|
3897
|
+
only when there is something to apply."""
|
|
3898
|
+
if not self._stale_cache:
|
|
3947
3899
|
return
|
|
3948
3900
|
self._toggle_log(force_expand=True)
|
|
3949
|
-
self._log("
|
|
3950
|
-
|
|
3951
|
-
self._log(f"Found {len(self._stale_cache)} pending update(s) — applying automatically...", "info")
|
|
3952
|
-
self._update_all()
|
|
3953
|
-
else:
|
|
3954
|
-
self._log("Already up to date — nothing to do.", "success")
|
|
3901
|
+
self._log(f"Applying {len(self._stale_cache)} pending local update(s) on startup...", "header")
|
|
3902
|
+
self._update_all()
|
|
3955
3903
|
|
|
3956
3904
|
# --- upgrades -----------------------------------------------------------------
|
|
3957
3905
|
|
|
@@ -4064,16 +4012,6 @@ class InstallerApp:
|
|
|
4064
4012
|
self.root.destroy()
|
|
4065
4013
|
host.restart(argv)
|
|
4066
4014
|
|
|
4067
|
-
def _toggle_autostart_check(self):
|
|
4068
|
-
"""Enable/disable the login update-check autostart entry."""
|
|
4069
|
-
if self._autostart_check_var.get():
|
|
4070
|
-
path = autostart.enable_autostart_check()
|
|
4071
|
-
self._log(f"Login update check enabled → {path}", "success")
|
|
4072
|
-
self._log(" On login: applies local reconciliations (no pip), notifies for new tools.", "info")
|
|
4073
|
-
else:
|
|
4074
|
-
autostart.disable_autostart_check()
|
|
4075
|
-
self._log("Login update check disabled.", "info")
|
|
4076
|
-
|
|
4077
4015
|
def _reinstall_deps(self):
|
|
4078
4016
|
"""Full reinstall (pip dependencies + shortcuts) for every installed tool.
|
|
4079
4017
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""The installer's own settings file:
|
|
1
|
+
"""The installer's own settings file: theme, custom icons, icon generation."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -25,20 +25,6 @@ def save_config(config: dict):
|
|
|
25
25
|
json.dump(config, f)
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def get_auto_update_on_startup() -> bool:
|
|
29
|
-
"""Whether this GUI should silently apply pending local updates the next
|
|
30
|
-
time it launches (the "Auto-update on startup" checkbox next to the
|
|
31
|
-
Up-to-date badge)."""
|
|
32
|
-
return bool(load_config().get("auto_update_on_startup", False))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def set_auto_update_on_startup(enabled: bool):
|
|
36
|
-
"""Persist the 'Auto-update on startup' checkbox state."""
|
|
37
|
-
config = load_config()
|
|
38
|
-
config["auto_update_on_startup"] = enabled
|
|
39
|
-
save_config(config)
|
|
40
|
-
|
|
41
|
-
|
|
42
28
|
def get_custom_icon_path(tool_key: str) -> Optional[str]:
|
|
43
29
|
"""Get custom icon path for a tool if one exists.
|
|
44
30
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-tools-kit
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Installer protocol + helpers for self-installing Python CLI/GUI tools (desktop shortcuts, bash aliases, cron entries), plus reusable tkinter and curses installer screens
|
|
5
5
|
Author: Steffen Probst
|
|
6
6
|
License: MIT License
|
|
@@ -77,10 +77,10 @@ Provides:
|
|
|
77
77
|
- **`gui_installer`** — a full, reusable tkinter GUI installer *engine*: it
|
|
78
78
|
discovers every tool in a project tree that speaks `--advertise`, and offers
|
|
79
79
|
batch install/remove, per-row skill toggles, themes, orphan cleanup, and an
|
|
80
|
-
opt-in login update-check. A thin wrapper
|
|
81
|
-
`gui_installer.run(root_dir=...,
|
|
82
|
-
(discovery layout, repo-cache
|
|
83
|
-
identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
80
|
+
opt-in login update-check (`--enable-autostart-check`). A thin wrapper
|
|
81
|
+
points it at its own tree via `gui_installer.run(root_dir=...,
|
|
82
|
+
entry_script=...)`; everything else (discovery layout, repo-cache
|
|
83
|
+
bootstrap, login-check policy, window/desktop identities) is configurable. See [§ GUI installer engine](#gui-installer-engine).
|
|
84
84
|
|
|
85
85
|
- **`sources`** — one installer offering tools from several repos. A TOML
|
|
86
86
|
file lists them, the kit clones what is missing over HTTPS and hands the
|
|
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
|
|
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
|