getbased-agent-stack 0.4.1__tar.gz → 0.5.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.
- {getbased_agent_stack-0.4.1/src/getbased_agent_stack.egg-info → getbased_agent_stack-0.5.0}/PKG-INFO +13 -2
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/README.md +12 -1
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/pyproject.toml +1 -1
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/cli.py +29 -7
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0/src/getbased_agent_stack.egg-info}/PKG-INFO +13 -2
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_cli.py +51 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/LICENSE +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/setup.cfg +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/__init__.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/env_file.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/mcp_configs.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/systemd/getbased-dashboard.service +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/systemd/getbased-rag.service +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/units.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack.egg-info/SOURCES.txt +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack.egg-info/dependency_links.txt +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack.egg-info/entry_points.txt +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack.egg-info/requires.txt +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack.egg-info/top_level.txt +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_env_file.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_integration.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_mcp_configs.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_systemd_units.py +0 -0
- {getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/tests/test_units.py +0 -0
{getbased_agent_stack-0.4.1/src/getbased_agent_stack.egg-info → getbased_agent_stack-0.5.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: getbased-agent-stack
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: One-command install of the full getbased agent stack — getbased-mcp + getbased-rag + getbased-dashboard
|
|
5
5
|
License-Expression: GPL-3.0-only
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -26,7 +26,18 @@ Part of the [getbased-agents monorepo](https://github.com/elkimek/getbased-agent
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
pipx install "getbased-agent-stack[full]"
|
|
29
|
+
pipx install --include-deps "getbased-agent-stack[full]"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `--include-deps` flag is required — it exposes `getbased-mcp`, `lens`, and `getbased-dashboard` alongside `getbased-stack` on your PATH. Without it, pipx only links the stack's own entry point and the MCP/rag/dashboard binaries stay hidden inside the venv.
|
|
33
|
+
|
|
34
|
+
`uv` users: install each package as its own tool instead, since `uv tool` has no `--include-deps` equivalent yet:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
uv tool install getbased-mcp
|
|
38
|
+
uv tool install "getbased-rag[full]"
|
|
39
|
+
uv tool install getbased-dashboard
|
|
40
|
+
uv tool install "getbased-agent-stack[full]"
|
|
30
41
|
```
|
|
31
42
|
|
|
32
43
|
Pulls:
|
|
@@ -7,7 +7,18 @@ Part of the [getbased-agents monorepo](https://github.com/elkimek/getbased-agent
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
pipx install "getbased-agent-stack[full]"
|
|
10
|
+
pipx install --include-deps "getbased-agent-stack[full]"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The `--include-deps` flag is required — it exposes `getbased-mcp`, `lens`, and `getbased-dashboard` alongside `getbased-stack` on your PATH. Without it, pipx only links the stack's own entry point and the MCP/rag/dashboard binaries stay hidden inside the venv.
|
|
14
|
+
|
|
15
|
+
`uv` users: install each package as its own tool instead, since `uv tool` has no `--include-deps` equivalent yet:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
uv tool install getbased-mcp
|
|
19
|
+
uv tool install "getbased-rag[full]"
|
|
20
|
+
uv tool install getbased-dashboard
|
|
21
|
+
uv tool install "getbased-agent-stack[full]"
|
|
11
22
|
```
|
|
12
23
|
|
|
13
24
|
Pulls:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "getbased-agent-stack"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.5.0"
|
|
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 = "GPL-3.0-only"
|
|
@@ -86,7 +86,14 @@ def _yesno(msg: str, default: bool = True) -> bool:
|
|
|
86
86
|
|
|
87
87
|
|
|
88
88
|
def cmd_init(args: argparse.Namespace) -> int:
|
|
89
|
+
# --yes / -y runs the full flow with defaults and no prompts. Intended
|
|
90
|
+
# for scripted installs (curl | bash) where stdin is unavailable and
|
|
91
|
+
# the EOF-returns-default path still triggers a getpass echo warning.
|
|
92
|
+
non_interactive = getattr(args, "yes", False)
|
|
93
|
+
|
|
89
94
|
print("getbased-stack init — one-time setup")
|
|
95
|
+
if non_interactive:
|
|
96
|
+
print("Running non-interactive (--yes) — takes default answers on every prompt.")
|
|
90
97
|
print(
|
|
91
98
|
"Writes ~/.config/getbased/env, (optionally) installs + starts systemd\n"
|
|
92
99
|
"user units for rag and dashboard. Idempotent: safe to re-run."
|
|
@@ -98,11 +105,15 @@ def cmd_init(args: argparse.Namespace) -> int:
|
|
|
98
105
|
current_token = existing.get("GETBASED_TOKEN", "")
|
|
99
106
|
masked = "****" + current_token[-4:] if current_token else "(unset)"
|
|
100
107
|
print(f"[1/4] getbased sync token (current: {masked})")
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
108
|
+
if non_interactive:
|
|
109
|
+
token = current_token
|
|
110
|
+
print(" keeping current value (set with `getbased-stack set GETBASED_TOKEN=…` later).")
|
|
111
|
+
else:
|
|
112
|
+
token = _prompt(
|
|
113
|
+
"Paste GETBASED_TOKEN (press Enter to keep current / skip)",
|
|
114
|
+
default=current_token,
|
|
115
|
+
secret=True,
|
|
116
|
+
)
|
|
106
117
|
|
|
107
118
|
# 2. API key
|
|
108
119
|
key_path = Path(existing.get("LENS_API_KEY_FILE", str(_default_api_key_file())))
|
|
@@ -127,7 +138,10 @@ def cmd_init(args: argparse.Namespace) -> int:
|
|
|
127
138
|
|
|
128
139
|
# 4. install units
|
|
129
140
|
print("\n[4/4] install systemd user units?")
|
|
130
|
-
|
|
141
|
+
install_units = True if non_interactive else _yesno(
|
|
142
|
+
"install + start getbased-rag + getbased-dashboard?", default=True
|
|
143
|
+
)
|
|
144
|
+
if install_units:
|
|
131
145
|
mgr = units.UnitManager()
|
|
132
146
|
for line in mgr.install(enable=True, start=True):
|
|
133
147
|
print(f" {line}")
|
|
@@ -304,7 +318,15 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
304
318
|
)
|
|
305
319
|
sub = p.add_subparsers(dest="command")
|
|
306
320
|
|
|
307
|
-
sub.add_parser(
|
|
321
|
+
pinit = sub.add_parser(
|
|
322
|
+
"init", help="Interactive one-time setup (token, API key, units)."
|
|
323
|
+
)
|
|
324
|
+
pinit.add_argument(
|
|
325
|
+
"-y",
|
|
326
|
+
"--yes",
|
|
327
|
+
action="store_true",
|
|
328
|
+
help="Non-interactive: take defaults on every prompt. Use for scripted installs.",
|
|
329
|
+
)
|
|
308
330
|
|
|
309
331
|
pi = sub.add_parser("install", help="Install + start the systemd user units.")
|
|
310
332
|
pi.add_argument("--no-enable", action="store_true", help="Copy files only; don't enable.")
|
{getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0/src/getbased_agent_stack.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: getbased-agent-stack
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: One-command install of the full getbased agent stack — getbased-mcp + getbased-rag + getbased-dashboard
|
|
5
5
|
License-Expression: GPL-3.0-only
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -26,7 +26,18 @@ Part of the [getbased-agents monorepo](https://github.com/elkimek/getbased-agent
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
pipx install "getbased-agent-stack[full]"
|
|
29
|
+
pipx install --include-deps "getbased-agent-stack[full]"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `--include-deps` flag is required — it exposes `getbased-mcp`, `lens`, and `getbased-dashboard` alongside `getbased-stack` on your PATH. Without it, pipx only links the stack's own entry point and the MCP/rag/dashboard binaries stay hidden inside the venv.
|
|
33
|
+
|
|
34
|
+
`uv` users: install each package as its own tool instead, since `uv tool` has no `--include-deps` equivalent yet:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
uv tool install getbased-mcp
|
|
38
|
+
uv tool install "getbased-rag[full]"
|
|
39
|
+
uv tool install getbased-dashboard
|
|
40
|
+
uv tool install "getbased-agent-stack[full]"
|
|
30
41
|
```
|
|
31
42
|
|
|
32
43
|
Pulls:
|
|
@@ -295,6 +295,57 @@ def test_init_reuses_existing_api_key(stack_home, fake_shell, monkeypatch):
|
|
|
295
295
|
assert key_path.read_text().strip() == "preexisting_key"
|
|
296
296
|
|
|
297
297
|
|
|
298
|
+
def test_init_yes_flag_skips_all_prompts(stack_home, fake_shell, monkeypatch):
|
|
299
|
+
"""`init --yes` must not call input() or getpass() at all. Scripted
|
|
300
|
+
installers (curl | bash) can't service prompts and the EOF fallback
|
|
301
|
+
triggers a Python getpass echo warning that pollutes output.
|
|
302
|
+
Strict assertion: any prompt call fails the test."""
|
|
303
|
+
def _forbid_input(*a, **kw):
|
|
304
|
+
raise AssertionError("input() called under --yes")
|
|
305
|
+
|
|
306
|
+
def _forbid_getpass(*a, **kw):
|
|
307
|
+
raise AssertionError("getpass() called under --yes")
|
|
308
|
+
|
|
309
|
+
monkeypatch.setattr("builtins.input", _forbid_input)
|
|
310
|
+
monkeypatch.setattr("getpass.getpass", _forbid_getpass)
|
|
311
|
+
|
|
312
|
+
rc, out, _ = _run(["init", "--yes"])
|
|
313
|
+
assert rc == 0
|
|
314
|
+
# Banner reflects the mode so the user sees what happened
|
|
315
|
+
assert "non-interactive" in out.lower()
|
|
316
|
+
# Env file + units still land
|
|
317
|
+
assert env_file.env_file_path().exists()
|
|
318
|
+
assert (stack_home / "config" / "systemd" / "user" / "getbased-rag.service").exists()
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def test_init_yes_installs_units_without_asking(stack_home, fake_shell, monkeypatch):
|
|
322
|
+
"""Default for the install-units prompt is Yes, so --yes must also
|
|
323
|
+
install + start. If this regressed to skip, install.sh would
|
|
324
|
+
silently leave services off."""
|
|
325
|
+
monkeypatch.setattr("builtins.input", lambda *a, **kw: "")
|
|
326
|
+
monkeypatch.setattr("getpass.getpass", lambda *a, **kw: "")
|
|
327
|
+
|
|
328
|
+
_run(["init", "--yes"])
|
|
329
|
+
# UnitManager.install() writes service files under XDG_CONFIG_HOME
|
|
330
|
+
assert (stack_home / "config" / "systemd" / "user" / "getbased-rag.service").exists()
|
|
331
|
+
assert (stack_home / "config" / "systemd" / "user" / "getbased-dashboard.service").exists()
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def test_init_yes_preserves_existing_token(stack_home, fake_shell, monkeypatch):
|
|
335
|
+
"""Non-interactive mode must not nuke a previously-saved token —
|
|
336
|
+
it takes the 'keep current' default, same as pressing Enter."""
|
|
337
|
+
env_file.write_env_file(
|
|
338
|
+
{"GETBASED_TOKEN": "keep_me", "GETBASED_STACK_MANAGED": "1"}
|
|
339
|
+
)
|
|
340
|
+
# No input/getpass expected, but stub defensively in case a future
|
|
341
|
+
# code path adds an unguarded prompt — test still catches it.
|
|
342
|
+
monkeypatch.setattr("builtins.input", lambda *a, **kw: (_ for _ in ()).throw(AssertionError("input under --yes")))
|
|
343
|
+
monkeypatch.setattr("getpass.getpass", lambda *a, **kw: (_ for _ in ()).throw(AssertionError("getpass under --yes")))
|
|
344
|
+
|
|
345
|
+
_run(["init", "-y"])
|
|
346
|
+
assert env_file.read_env_file()["GETBASED_TOKEN"] == "keep_me"
|
|
347
|
+
|
|
348
|
+
|
|
298
349
|
def test_init_is_reentrant(stack_home, fake_shell, monkeypatch):
|
|
299
350
|
"""Running init twice in a row must not break anything — second call
|
|
300
351
|
should be a cheap idempotent update, not a destructive rewrite."""
|
|
File without changes
|
|
File without changes
|
{getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/__init__.py
RENAMED
|
File without changes
|
{getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/env_file.py
RENAMED
|
File without changes
|
{getbased_agent_stack-0.4.1 → getbased_agent_stack-0.5.0}/src/getbased_agent_stack/mcp_configs.py
RENAMED
|
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
|