cli-tools-kit 0.8.1__tar.gz → 0.8.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.
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/PKG-INFO +1 -1
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/__init__.py +1 -1
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/gui_installer.py +52 -14
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/PKG-INFO +1 -1
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/pyproject.toml +1 -1
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/LICENSE +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/README.md +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/__main__.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/advertise.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/autostart_gate.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/cron_installer.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/host.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/identity.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/onboarding.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/skills.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/sources.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/__init__.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/build.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/capability.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/cluster.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/corpus.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/embedder.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/groups.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/llm_groups.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/tool_installer.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/tui_installer.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/SOURCES.txt +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/dependency_links.txt +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/entry_points.txt +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/requires.txt +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/top_level.txt +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/setup.cfg +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_autostart_gate.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_capability_groups.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_cron_installer.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_host.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_identity.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_llm_groups.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_skills.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_sources.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_taxonomy_cluster.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_tool_installer.py +0 -0
- {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_tui_installer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-tools-kit
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.2
|
|
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
|
|
@@ -847,15 +847,30 @@ AUTOSTART_DIR = (host.startup_dir() if host.IS_WINDOWS
|
|
|
847
847
|
else os.path.join(os.path.expanduser("~"), ".config", "autostart"))
|
|
848
848
|
|
|
849
849
|
# --- Login update-check autostart -----------------------------------------
|
|
850
|
-
# A ~/.config/autostart
|
|
850
|
+
# A startup entry (~/.config/autostart, or the Start Menu's Startup folder on
|
|
851
|
+
# Windows) that runs `installer.py --check` once per login.
|
|
851
852
|
# The check APPLIES network-free reconciliations (drifted .desktop Exec paths,
|
|
852
|
-
# renamed aliases, stale installed SKILL.md — all rewritten from
|
|
853
|
-
#
|
|
853
|
+
# renamed aliases, stale installed SKILL.md — all rewritten from the source
|
|
854
|
+
# already on disk via skip_deps, no pip) and only NOTIFIES for updates that would touch
|
|
854
855
|
# the network (a new, not-yet-installed tool) or that add a new skill. The
|
|
855
856
|
# pip/network gate stays behind an explicit human action.
|
|
856
857
|
# Derived from the configurable *_NAME knobs above. run() recomputes these after
|
|
857
858
|
# a wrapper overrides the names; the defaults keep tools/installer.py unchanged.
|
|
858
|
-
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
def _autostart_check_path() -> str:
|
|
862
|
+
"""Where the login-check entry goes, named the way the platform runs it.
|
|
863
|
+
|
|
864
|
+
Windows' Startup folder executes shortcuts, not XDG .desktop files, so the
|
|
865
|
+
name carries .lnk there and the entry is written as one.
|
|
866
|
+
"""
|
|
867
|
+
name = AUTOSTART_CHECK_DESKTOP_NAME
|
|
868
|
+
if host.IS_WINDOWS:
|
|
869
|
+
name = os.path.splitext(name)[0] + ".lnk"
|
|
870
|
+
return os.path.join(AUTOSTART_DIR, name)
|
|
871
|
+
|
|
872
|
+
|
|
873
|
+
AUTOSTART_CHECK_DESKTOP = _autostart_check_path()
|
|
859
874
|
CHECK_LOG = os.path.join(os.path.expanduser("~"), ".local", "log", CHECK_LOG_NAME)
|
|
860
875
|
# Remembers the last actionable (new tool / new skill / failure) set so the
|
|
861
876
|
# login check notifies once when it CHANGES instead of nagging every login.
|
|
@@ -894,7 +909,7 @@ def _recompute_check_paths() -> None:
|
|
|
894
909
|
"""Re-derive the login-check artifact paths from the *_NAME knobs (call after
|
|
895
910
|
a wrapper overrides them, e.g. inside run())."""
|
|
896
911
|
global AUTOSTART_CHECK_DESKTOP, CHECK_LOG, CHECK_STATE
|
|
897
|
-
AUTOSTART_CHECK_DESKTOP =
|
|
912
|
+
AUTOSTART_CHECK_DESKTOP = _autostart_check_path()
|
|
898
913
|
CHECK_LOG = os.path.join(os.path.expanduser("~"), ".local", "log", CHECK_LOG_NAME)
|
|
899
914
|
CHECK_STATE = os.path.join(os.path.expanduser("~"), ".local", "state", CHECK_STATE_NAME)
|
|
900
915
|
|
|
@@ -920,6 +935,23 @@ def autostart_check_enabled() -> bool:
|
|
|
920
935
|
def enable_autostart_check() -> str:
|
|
921
936
|
"""Write the login update-check autostart entry. Returns its path."""
|
|
922
937
|
os.makedirs(AUTOSTART_DIR, exist_ok=True)
|
|
938
|
+
|
|
939
|
+
if host.IS_WINDOWS:
|
|
940
|
+
# The Startup folder runs shortcuts; a .desktop file dropped there is
|
|
941
|
+
# never executed. pythonw keeps the console window from flashing up at
|
|
942
|
+
# every login, since the check reports through a notification anyway.
|
|
943
|
+
runner = sys.executable
|
|
944
|
+
windowless = os.path.join(os.path.dirname(runner), "pythonw.exe")
|
|
945
|
+
if os.path.exists(windowless):
|
|
946
|
+
runner = windowless
|
|
947
|
+
host.write_shortcut(
|
|
948
|
+
AUTOSTART_CHECK_DESKTOP,
|
|
949
|
+
target=runner,
|
|
950
|
+
args=f'"{ENTRY_SCRIPT}" --check',
|
|
951
|
+
workdir=os.path.dirname(ENTRY_SCRIPT),
|
|
952
|
+
)
|
|
953
|
+
return AUTOSTART_CHECK_DESKTOP
|
|
954
|
+
|
|
923
955
|
exec_line = f"{sys.executable} {ENTRY_SCRIPT} --check"
|
|
924
956
|
content = (
|
|
925
957
|
"[Desktop Entry]\n"
|
|
@@ -940,10 +972,15 @@ def enable_autostart_check() -> str:
|
|
|
940
972
|
|
|
941
973
|
def disable_autostart_check() -> bool:
|
|
942
974
|
"""Remove the login update-check autostart entry. True if one was present."""
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
975
|
+
removed = False
|
|
976
|
+
# On Windows, also clear the .desktop an older version wrote into the
|
|
977
|
+
# Startup folder, where it sat inert instead of running the check.
|
|
978
|
+
stale = os.path.join(AUTOSTART_DIR, AUTOSTART_CHECK_DESKTOP_NAME)
|
|
979
|
+
for path in {AUTOSTART_CHECK_DESKTOP, stale}:
|
|
980
|
+
if os.path.exists(path):
|
|
981
|
+
os.remove(path)
|
|
982
|
+
removed = True
|
|
983
|
+
return removed
|
|
947
984
|
|
|
948
985
|
|
|
949
986
|
def _notify_send(summary: str, body: str = "") -> None:
|
|
@@ -2635,11 +2672,12 @@ class InstallerApp:
|
|
|
2635
2672
|
self._attach_tooltip(
|
|
2636
2673
|
self._autostart_check_cb,
|
|
2637
2674
|
"Check for updates on login (local, no network)\n\n"
|
|
2638
|
-
"Installs a
|
|
2675
|
+
"Installs a startup entry that, once per login, applies "
|
|
2639
2676
|
"network-free reconciliations (drifted shortcuts, renamed aliases, and "
|
|
2640
|
-
"stale installed skills — rewritten from
|
|
2641
|
-
"and only notifies for updates that need the network (a new, "
|
|
2677
|
+
"stale installed skills — rewritten from the tool's source on disk, "
|
|
2678
|
+
"never pip) and only notifies for updates that need the network (a new, "
|
|
2642
2679
|
"not-yet-installed tool).\n\n"
|
|
2680
|
+
f"Entry: {AUTOSTART_CHECK_DESKTOP}\n"
|
|
2643
2681
|
f"Log: {CHECK_LOG}")
|
|
2644
2682
|
|
|
2645
2683
|
# "Reinstall deps" is the deliberate, network-touching pip action — kept in
|
|
@@ -6014,7 +6052,7 @@ def cli_check() -> int:
|
|
|
6014
6052
|
|
|
6015
6053
|
Auto-applies the network-free reconciliations and notifies for the rest:
|
|
6016
6054
|
|
|
6017
|
-
APPLY (no pip, no network — rewritten from already
|
|
6055
|
+
APPLY (no pip, no network — rewritten from the source already on disk):
|
|
6018
6056
|
• a drifted shortcut (moved .desktop Exec path / renamed alias) -> install_tool(skip_deps=True)
|
|
6019
6057
|
• a currently-installed SKILL.md that has drifted -> idempotent --install-skill
|
|
6020
6058
|
(only touched when the skill is already present, so a skill the
|
|
@@ -6138,7 +6176,7 @@ def main():
|
|
|
6138
6176
|
parser.add_argument("--check", action="store_true",
|
|
6139
6177
|
help="Headless login check: auto-apply network-free reconciliations, notify for new tools")
|
|
6140
6178
|
parser.add_argument("--enable-autostart-check", action="store_true",
|
|
6141
|
-
help="Install the login update-check autostart entry
|
|
6179
|
+
help="Install the login update-check autostart entry")
|
|
6142
6180
|
parser.add_argument("--disable-autostart-check", action="store_true",
|
|
6143
6181
|
help="Remove the login update-check autostart entry")
|
|
6144
6182
|
parser.add_argument("--refresh", action="store_true",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-tools-kit
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.2
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cli-tools-kit"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.2"
|
|
8
8
|
description = "Installer protocol + helpers for self-installing Python CLI/GUI tools (desktop shortcuts, bash aliases, cron entries), plus reusable tkinter and curses installer screens"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
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
|