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.
Files changed (43) hide show
  1. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/PKG-INFO +1 -1
  2. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/__init__.py +1 -1
  3. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/gui_installer.py +52 -14
  4. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/PKG-INFO +1 -1
  5. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/pyproject.toml +1 -1
  6. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/LICENSE +0 -0
  7. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/README.md +0 -0
  8. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/__main__.py +0 -0
  9. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/advertise.py +0 -0
  10. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/autostart_gate.py +0 -0
  11. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/cron_installer.py +0 -0
  12. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/host.py +0 -0
  13. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/identity.py +0 -0
  14. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/onboarding.py +0 -0
  15. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/skills.py +0 -0
  16. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/sources.py +0 -0
  17. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/__init__.py +0 -0
  18. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/build.py +0 -0
  19. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/capability.py +0 -0
  20. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/cluster.py +0 -0
  21. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/corpus.py +0 -0
  22. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/embedder.py +0 -0
  23. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/groups.py +0 -0
  24. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/taxonomy/llm_groups.py +0 -0
  25. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/tool_installer.py +0 -0
  26. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit/tui_installer.py +0 -0
  27. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/SOURCES.txt +0 -0
  28. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/dependency_links.txt +0 -0
  29. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/entry_points.txt +0 -0
  30. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/requires.txt +0 -0
  31. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/cli_tools_kit.egg-info/top_level.txt +0 -0
  32. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/setup.cfg +0 -0
  33. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_autostart_gate.py +0 -0
  34. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_capability_groups.py +0 -0
  35. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_cron_installer.py +0 -0
  36. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_host.py +0 -0
  37. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_identity.py +0 -0
  38. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_llm_groups.py +0 -0
  39. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_skills.py +0 -0
  40. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_sources.py +0 -0
  41. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_taxonomy_cluster.py +0 -0
  42. {cli_tools_kit-0.8.1 → cli_tools_kit-0.8.2}/tests/test_tool_installer.py +0 -0
  43. {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.1
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
@@ -56,4 +56,4 @@ __all__ = [
56
56
  "read_installed_skill",
57
57
  ]
58
58
 
59
- __version__ = "0.8.1"
59
+ __version__ = "0.8.2"
@@ -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 entry that runs `installer.py --check` once per login.
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 already-synced
853
- # source via skip_deps, no pip) and only NOTIFIES for updates that would touch
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
- AUTOSTART_CHECK_DESKTOP = os.path.join(AUTOSTART_DIR, AUTOSTART_CHECK_DESKTOP_NAME)
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 = os.path.join(AUTOSTART_DIR, AUTOSTART_CHECK_DESKTOP_NAME)
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
- if os.path.exists(AUTOSTART_CHECK_DESKTOP):
944
- os.remove(AUTOSTART_CHECK_DESKTOP)
945
- return True
946
- return False
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 ~/.config/autostart entry that, once per login, applies "
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 your synced source, never pip) "
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-synced source):
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 (~/.config/autostart)")
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.1
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.1"
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