fix(goose): rename mai to mc, add initialization status

This commit is contained in:
2025-03-10 23:44:09 -06:00
parent 08ba1ab2da
commit 74c723db7b
7 changed files with 182 additions and 17 deletions

View File

@@ -104,7 +104,9 @@ def create_session(
False, "--no-connect", help="Don't automatically connect to the session"
),
no_mount: bool = typer.Option(
False, "--no-mount", help="Don't mount local directory to /app"
False,
"--no-mount",
help="Don't mount local directory to /app (ignored if --project is used)",
),
) -> None:
"""Create a new MC session"""
@@ -216,15 +218,33 @@ def connect_session(
def session_logs(
session_id: str = typer.Argument(..., help="Session ID to get logs from"),
follow: bool = typer.Option(False, "--follow", "-f", help="Follow log output"),
init: bool = typer.Option(
False, "--init", "-i", help="Show initialization logs instead of container logs"
),
) -> None:
"""Stream logs from a MC session"""
if follow:
console.print(f"Streaming logs from session {session_id}... (Ctrl+C to exit)")
container_manager.get_session_logs(session_id, follow=True)
if init:
# Show initialization logs
if follow:
console.print(
f"Streaming initialization logs from session {session_id}... (Ctrl+C to exit)"
)
container_manager.get_init_logs(session_id, follow=True)
else:
logs = container_manager.get_init_logs(session_id)
if logs:
console.print(logs)
else:
logs = container_manager.get_session_logs(session_id)
if logs:
console.print(logs)
# Show regular container logs
if follow:
console.print(
f"Streaming logs from session {session_id}... (Ctrl+C to exit)"
)
container_manager.get_session_logs(session_id, follow=True)
else:
logs = container_manager.get_session_logs(session_id)
if logs:
console.print(logs)
@app.command()
@@ -255,7 +275,9 @@ def quick_create(
False, "--no-connect", help="Don't automatically connect to the session"
),
no_mount: bool = typer.Option(
False, "--no-mount", help="Don't mount local directory to /app"
False,
"--no-mount",
help="Don't mount local directory to /app (ignored if a project is specified)",
),
) -> None:
"""Create a new MC session with a project repository"""

View File

@@ -119,6 +119,10 @@ class ContainerManager:
# Prepare environment variables
env_vars = environment or {}
# Add project URL to environment if provided
if project:
env_vars["MC_PROJECT_URL"] = project
# Pull image if needed
try:
self.client.images.get(driver.image)
@@ -128,13 +132,19 @@ class ContainerManager:
# Set up volume mounts
volumes = {}
if mount_local:
# If project URL is provided, don't mount local directory (will clone into /app)
# If no project URL and mount_local is True, mount local directory to /app
if not project and mount_local:
# Mount current directory to /app in the container
import os
current_dir = os.getcwd()
volumes[current_dir] = {"bind": "/app", "mode": "rw"}
print(f"Mounting local directory {current_dir} to /app")
elif project:
print(
f"Project URL provided - container will clone {project} into /app during initialization"
)
# Create container
container = self.client.containers.create(
@@ -220,6 +230,8 @@ class ContainerManager:
return False
# Execute interactive shell in container
# The init-status.sh script will automatically show logs if needed
print(f"Connecting to session {session_id}...")
os.system(f"docker exec -it {session.container_id} /bin/bash")
return True
@@ -345,3 +357,53 @@ class ContainerManager:
except DockerException as e:
print(f"Error getting session logs: {e}")
return None
def get_init_logs(self, session_id: str, follow: bool = False) -> Optional[str]:
"""Get initialization logs from a MC session
Args:
session_id: The session ID
follow: Whether to follow the logs
Returns:
The logs as a string, or None if there was an error
"""
try:
sessions = self.list_sessions()
for session in sessions:
if session.id == session_id and session.container_id:
container = self.client.containers.get(session.container_id)
# Check if initialization is complete
init_complete = False
try:
exit_code, output = container.exec_run(
"grep -q 'INIT_COMPLETE=true' /init.status"
)
init_complete = exit_code == 0
except DockerException:
pass
if follow and not init_complete:
print(
f"Following initialization logs for session {session_id}..."
)
print("Press Ctrl+C to stop following")
container.exec_run(
"tail -f /init.log", stream=True, demux=True, tty=True
)
return None
else:
exit_code, output = container.exec_run("cat /init.log")
if exit_code == 0:
return output.decode()
else:
print("No initialization logs found")
return None
print(f"Session '{session_id}' not found")
return None
except DockerException as e:
print(f"Error getting initialization logs: {e}")
return None