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.
Files changed (60) hide show
  1. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/PKG-INFO +5 -5
  2. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/README.md +4 -4
  3. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/__init__.py +1 -1
  4. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/gui_installer.py +9 -71
  5. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/settings.py +1 -15
  6. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/PKG-INFO +5 -5
  7. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/LICENSE +0 -0
  8. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/__main__.py +0 -0
  9. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/advertise.py +0 -0
  10. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/autostart.py +0 -0
  11. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/autostart_gate.py +0 -0
  12. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/cli.py +0 -0
  13. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/cron_installer.py +0 -0
  14. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/discovery.py +0 -0
  15. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/host.py +0 -0
  16. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/icons.py +0 -0
  17. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/identity.py +0 -0
  18. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/install.py +0 -0
  19. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/onboarding.py +0 -0
  20. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/skills.py +0 -0
  21. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/sources.py +0 -0
  22. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/state.py +0 -0
  23. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/sweep.py +0 -0
  24. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/__init__.py +0 -0
  25. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/build.py +0 -0
  26. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/capability.py +0 -0
  27. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/cluster.py +0 -0
  28. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/corpus.py +0 -0
  29. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/embedder.py +0 -0
  30. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/groups.py +0 -0
  31. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/taxonomy/llm_groups.py +0 -0
  32. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/testing.py +0 -0
  33. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/tool_installer.py +0 -0
  34. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/tui_installer.py +0 -0
  35. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit/upgrade.py +0 -0
  36. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/SOURCES.txt +0 -0
  37. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/dependency_links.txt +0 -0
  38. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/entry_points.txt +0 -0
  39. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/requires.txt +0 -0
  40. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/cli_tools_kit.egg-info/top_level.txt +0 -0
  41. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/pyproject.toml +0 -0
  42. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/setup.cfg +0 -0
  43. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_autostart_gate.py +0 -0
  44. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_capability_groups.py +0 -0
  45. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_cron_installer.py +0 -0
  46. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_e2e.py +0 -0
  47. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_engine.py +0 -0
  48. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_gui_smoke.py +0 -0
  49. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_hooks.py +0 -0
  50. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_host.py +0 -0
  51. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_identity.py +0 -0
  52. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_llm_groups.py +0 -0
  53. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_public_api.py +0 -0
  54. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_skills.py +0 -0
  55. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_sources.py +0 -0
  56. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_taxonomy_cluster.py +0 -0
  57. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_testing.py +0 -0
  58. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_tool_installer.py +0 -0
  59. {cli_tools_kit-1.1.1 → cli_tools_kit-1.3.0}/tests/test_tui_installer.py +0 -0
  60. {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.1.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 points it at its own tree via
81
- `gui_installer.run(root_dir=..., entry_script=...)`; everything else
82
- (discovery layout, repo-cache bootstrap, login-check policy, window/desktop
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 points it at its own tree via
21
- `gui_installer.run(root_dir=..., entry_script=...)`; everything else
22
- (discovery layout, repo-cache bootstrap, login-check policy, window/desktop
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
@@ -56,4 +56,4 @@ __all__ = [
56
56
  "read_installed_skill",
57
57
  ]
58
58
 
59
- __version__ = "1.1.1"
59
+ __version__ = "1.3.0"
@@ -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
- # Opt-in: silently apply pending local updates on this launch, visibly
303
- # logged (see _maybe_auto_update_on_startup). Runs after the orphan
304
- # warning so the two don't fight over the log/dialog at the same tick.
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. If the user
3942
- has opted in via the startup checkbox, silently apply the same
3943
- network-free reconciliation the Up-to-date badge offers — but log every
3944
- step to the Operation Log (auto-expanding it) so the automatic run
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("Auto-update on startup is enabled — checking for pending updates...", "header")
3950
- if self._stale_cache:
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: auto-update, custom icons, icon generation."""
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.1.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 points it at its own tree via
81
- `gui_installer.run(root_dir=..., entry_script=...)`; everything else
82
- (discovery layout, repo-cache bootstrap, login-check policy, window/desktop
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