Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ keywords:
- management
- integration
license: Apache-2.0
version: 26.02.17
date-released: "2026-02-17"
version: 26.03.1
date-released: "2026-03-25"
174 changes: 163 additions & 11 deletions commands/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from rich.table import Table

from core.config import add_db_to_json, load_db_config, write_env_file, write_file
from core.docker import ensure_network, run_compose
from core.docker import ensure_network, run_compose, update_compose_file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Unused import: update_compose_file is not used in this file.

The import of update_compose_file was added but the function is not called anywhere in commands/agent.py. This file builds the compose file from templates directly rather than using update_compose_file.

♻️ Proposed fix
-from core.docker import ensure_network, run_compose, update_compose_file
+from core.docker import ensure_network, run_compose
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@commands/agent.py` at line 13, The import update_compose_file is unused in
commands/agent.py; remove update_compose_file from the import list (leaving
ensure_network and run_compose) to eliminate the unused-import warning, or if
you intended to use it, replace the manual compose-file build logic in the
function that currently constructs the compose template with a call to
update_compose_file so the import is actually used (refer to the symbols
update_compose_file, ensure_network, run_compose to locate the import and
compose-building logic).

from core.network import fetch_template
from core.utils import (
check_system,
Expand All @@ -25,6 +25,10 @@
AGENT_MONGODB_AUTH_SNIPPET,
AGENT_MONGODB_SNIPPET,
AGENT_POSTGRES_SNIPPET,
AGENT_REDIS_AUTH_SNIPPET,
AGENT_REDIS_SNIPPET,
AGENT_VALKEY_AUTH_SNIPPET,
AGENT_VALKEY_SNIPPET,
)


Expand Down Expand Up @@ -120,7 +124,7 @@ def agent(
else:
db_type = Prompt.ask(
"Type",
choices=["mongodb"],
choices=["mongodb", "redis", "valkey"],
default="mongodb",
)

Expand All @@ -146,12 +150,16 @@ def agent(
else:
db_name = Prompt.ask("Database Name")
host = Prompt.ask("Host", default="localhost")
port = IntPrompt.ask(
"Port",
default=5432
if db_type == "postgresql"
else (3306 if db_type in ["mysql", "mariadb"] else 27017),
)

default_port = 5432
if db_type in ["mysql", "mariadb"]:
default_port = 3306
elif db_type == "mongodb":
default_port = 27017
elif db_type in ["redis", "valkey"]:
default_port = 6379

port = IntPrompt.ask("Port", default=default_port)
user = Prompt.ask("Username")
password = Prompt.ask("Password", password=True)

Expand Down Expand Up @@ -184,12 +192,14 @@ def agent(
else:
db_engine = Prompt.ask(
"Engine",
choices=["mongodb"],
choices=["mongodb", "redis", "valkey"],
default="mongodb",
)
db_variant = Prompt.ask(
"Type", choices=["standard", "with-auth"], default="standard"
"Variant", choices=["standard", "with-auth"], default="standard"
)
if db_variant == "with-auth":
db_engine = f"{db_engine}-auth"

if db_engine == "sqlite":
db_name = Prompt.ask("Database Name", default="local")
Expand Down Expand Up @@ -372,6 +382,148 @@ def agent(
f"[success]✔ Added MongoDB container (Port {mongo_port})[/success]"
)

elif db_engine == "redis":
redis_port = get_free_port()
db_name = f"redis_{secrets.token_hex(4)}"
service_name = f"db-redis-{secrets.token_hex(2)}"

var_prefix = service_name.upper().replace("-", "_")
env_vars[f"{var_prefix}_PORT"] = str(redis_port)

snippet = (
AGENT_REDIS_SNIPPET.replace("${SERVICE_NAME}", service_name)
.replace("${PORT}", f"${{{var_prefix}_PORT}}")
.replace("${VOL_NAME}", f"{service_name}-data")
)

extra_services += snippet
volumes_list.append(f"{service_name}-data")

add_db_to_json(
path,
{
"name": db_name,
"database": "0",
"type": "redis",
"username": "",
"password": "",
"port": redis_port,
"host": "localhost",
"generated_id": str(uuid.uuid4()),
},
)
console.print(
f"[success]✔ Added Redis container (Port {redis_port})[/success]"
)

elif db_engine == "redis-auth":
redis_port = get_free_port()
db_name = f"redis_{secrets.token_hex(4)}"
service_name = f"db-redis-auth-{secrets.token_hex(2)}"
db_pass = secrets.token_hex(8)

var_prefix = service_name.upper().replace("-", "_")
env_vars[f"{var_prefix}_PORT"] = str(redis_port)
env_vars[f"{var_prefix}_PASS"] = db_pass

snippet = (
AGENT_REDIS_AUTH_SNIPPET.replace("${SERVICE_NAME}", service_name)
.replace("${PORT}", f"${{{var_prefix}_PORT}}")
.replace("${VOL_NAME}", f"{service_name}-data")
.replace("${PASSWORD}", f"${{{var_prefix}_PASS}}")
)

extra_services += snippet
volumes_list.append(f"{service_name}-data")

add_db_to_json(
path,
{
"name": db_name,
"database": "0",
"type": "redis",
"username": "",
"password": db_pass,
"port": redis_port,
"host": "localhost",
"generated_id": str(uuid.uuid4()),
},
)
console.print(
f"[success]✔ Added Redis Auth container (Port {redis_port})[/success]"
)

elif db_engine == "valkey":
valkey_port = get_free_port()
db_name = f"valkey_{secrets.token_hex(4)}"
service_name = f"db-valkey-{secrets.token_hex(2)}"

var_prefix = service_name.upper().replace("-", "_")
env_vars[f"{var_prefix}_PORT"] = str(valkey_port)

snippet = (
AGENT_VALKEY_SNIPPET.replace("${SERVICE_NAME}", service_name)
.replace("${PORT}", f"${{{var_prefix}_PORT}}")
.replace("${VOL_NAME}", f"{service_name}-data")
)

extra_services += snippet
volumes_list.append(f"{service_name}-data")

add_db_to_json(
path,
{
"name": db_name,
"database": "0",
"type": "valkey",
"username": "",
"password": "",
"port": valkey_port,
"host": "localhost",
"generated_id": str(uuid.uuid4()),
},
)
console.print(
f"[success]✔ Added Valkey container (Port {valkey_port})[/success]"
)

elif db_engine == "valkey-auth":
valkey_port = get_free_port()
db_name = f"valkey_{secrets.token_hex(4)}"
service_name = f"db-valkey-auth-{secrets.token_hex(2)}"
db_pass = secrets.token_hex(8)

var_prefix = service_name.upper().replace("-", "_")
env_vars[f"{var_prefix}_PORT"] = str(valkey_port)
env_vars[f"{var_prefix}_PASS"] = db_pass

snippet = (
AGENT_VALKEY_AUTH_SNIPPET.replace("${SERVICE_NAME}", service_name)
.replace("${PORT}", f"${{{var_prefix}_PORT}}")
.replace("${VOL_NAME}", f"{service_name}-data")
.replace("${PASSWORD}", f"${{{var_prefix}_PASS}}")
)

extra_services += snippet
volumes_list.append(f"{service_name}-data")

add_db_to_json(
path,
{
"name": db_name,
"database": "0",
"type": "valkey",
"username": "",
"password": db_pass,
"port": valkey_port,
"host": "localhost",
"generated_id": str(uuid.uuid4()),
},
)
console.print(
f"[success]✔ Added Valkey Auth container (Port {valkey_port})[/success]"
)

if volumes_list:
for vol in volumes_list:
extra_volumes += f" {vol}:\n"
Expand Down Expand Up @@ -419,7 +571,7 @@ def agent(
console.print(
Panel(
summary,
title="[bold white]PROPOSED CONFIGURATION[/bold white]",
title="[bold white]SUMMARY[/bold white]",
border_style="bold blue",
expand=False,
)
Expand Down
2 changes: 1 addition & 1 deletion commands/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ def dashboard(
console.print(
Panel(
summary,
title="[bold white]PROPOSED CONFIGURATION[/bold white]",
title="[bold white]SUMMARY[/bold white]",
border_style="bold blue",
expand=False,
)
Expand Down
Loading
Loading