getbased-agent-stack 0.5.3__tar.gz → 0.5.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 (24) hide show
  1. {getbased_agent_stack-0.5.3/src/getbased_agent_stack.egg-info → getbased_agent_stack-0.5.4}/PKG-INFO +1 -1
  2. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/pyproject.toml +1 -1
  3. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/__init__.py +1 -1
  4. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/units.py +16 -1
  5. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4/src/getbased_agent_stack.egg-info}/PKG-INFO +1 -1
  6. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_cli.py +5 -1
  7. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_units.py +3 -1
  8. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/LICENSE +0 -0
  9. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/README.md +0 -0
  10. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/setup.cfg +0 -0
  11. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/cli.py +0 -0
  12. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/env_file.py +0 -0
  13. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/mcp_configs.py +0 -0
  14. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/systemd/getbased-dashboard.service +0 -0
  15. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack/systemd/getbased-rag.service +0 -0
  16. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack.egg-info/SOURCES.txt +0 -0
  17. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack.egg-info/dependency_links.txt +0 -0
  18. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack.egg-info/entry_points.txt +0 -0
  19. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack.egg-info/requires.txt +0 -0
  20. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/src/getbased_agent_stack.egg-info/top_level.txt +0 -0
  21. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_env_file.py +0 -0
  22. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_integration.py +0 -0
  23. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_mcp_configs.py +0 -0
  24. {getbased_agent_stack-0.5.3 → getbased_agent_stack-0.5.4}/tests/test_systemd_units.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: getbased-agent-stack
3
- Version: 0.5.3
3
+ Version: 0.5.4
4
4
  Summary: One-command install of the full getbased agent stack — getbased-mcp + getbased-rag + getbased-dashboard
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Requires-Python: >=3.10
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "getbased-agent-stack"
7
- version = "0.5.3"
7
+ version = "0.5.4"
8
8
  description = "One-command install of the full getbased agent stack — getbased-mcp + getbased-rag + getbased-dashboard"
9
9
  readme = "README.md"
10
10
  license = "AGPL-3.0-or-later"
@@ -5,4 +5,4 @@ plus a small CLI that proxies to the real binaries. Everything
5
5
  interesting lives in the sibling repos.
6
6
  """
7
7
 
8
- __version__ = "0.5.3"
8
+ __version__ = "0.5.4"
@@ -108,6 +108,17 @@ class UnitManager:
108
108
  args.extend(SERVICE_NAMES)
109
109
  return self._shell(args)
110
110
 
111
+ def restart(self) -> CommandResult:
112
+ """Restart bundled services after an upgrade/reinstall.
113
+
114
+ `uv tool install` replaces files inside the tool environment. If the
115
+ services are already running, `systemctl enable --now …` is a no-op and
116
+ the old Python processes can keep serving from a half-replaced venv.
117
+ Restarting makes repeated `curl | bash` installs safe and starts the
118
+ units when they were previously inactive.
119
+ """
120
+ return self._shell(["systemctl", "--user", "restart", *SERVICE_NAMES])
121
+
111
122
  def disable(self, now: bool = True) -> CommandResult:
112
123
  args = ["systemctl", "--user", "disable"]
113
124
  if now:
@@ -154,7 +165,11 @@ class UnitManager:
154
165
  else:
155
166
  log.append("enabled " + ", ".join(SERVICE_NAMES))
156
167
  if start:
157
- log.append("started " + ", ".join(SERVICE_NAMES))
168
+ r = self.restart()
169
+ if r.returncode != 0:
170
+ log.append(f"restart FAILED: {r.stderr.strip()}")
171
+ else:
172
+ log.append("restarted " + ", ".join(SERVICE_NAMES))
158
173
  return log
159
174
 
160
175
  def uninstall(self) -> "list[str]":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: getbased-agent-stack
3
- Version: 0.5.3
3
+ Version: 0.5.4
4
4
  Summary: One-command install of the full getbased agent stack — getbased-mcp + getbased-rag + getbased-dashboard
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Requires-Python: >=3.10
@@ -96,10 +96,14 @@ def test_install_writes_units_and_enables(stack_home, fake_shell):
96
96
  assert (unit_dir / "getbased-rag.service").exists()
97
97
  assert (unit_dir / "getbased-dashboard.service").exists()
98
98
 
99
- # daemon-reload and enable --now both ran
99
+ # daemon-reload, enable --now, and restart all run. The explicit restart
100
+ # matters for re-running install.sh over an active stack after uv replaces
101
+ # the tool environment: old Python processes must not keep serving from a
102
+ # half-replaced venv.
100
103
  all_calls = [" ".join(cmd) for cmd in fake_shell]
101
104
  assert any("daemon-reload" in c for c in all_calls)
102
105
  assert any("enable --now" in c for c in all_calls)
106
+ assert any("restart getbased-rag.service getbased-dashboard.service" in c for c in all_calls)
103
107
 
104
108
 
105
109
  def test_install_no_enable_flag(stack_home, fake_shell):
@@ -145,11 +145,13 @@ def test_install_full_sequence(tmp_path):
145
145
  # systemctl called in the expected order
146
146
  assert shell.calls[0] == ["systemctl", "--user", "daemon-reload"]
147
147
  assert shell.calls[1] == ["systemctl", "--user", "enable", "--now", *SERVICE_NAMES]
148
+ assert shell.calls[2] == ["systemctl", "--user", "restart", *SERVICE_NAMES]
148
149
  # Log mentions what happened
149
150
  joined = "\n".join(log)
150
151
  assert "wrote" in joined
151
152
  assert "enabled" in joined
152
- assert "started" in joined
153
+ assert "restarted" in joined
154
+ assert not any(line.startswith("started ") for line in log)
153
155
 
154
156
 
155
157
  def test_install_daemon_reload_failure_short_circuits(tmp_path):