mirror of
https://github.com/katanemo/plano.git
synced 2026-05-05 13:53:03 +02:00
rename cli to plano (#647)
This commit is contained in:
parent
e224cba3e3
commit
e7ce00b5a7
70 changed files with 226 additions and 212 deletions
|
|
@ -1,5 +1,5 @@
|
|||
import os
|
||||
|
||||
SERVICE_NAME_ARCHGW = "archgw"
|
||||
ARCHGW_DOCKER_NAME = "archgw"
|
||||
ARCHGW_DOCKER_IMAGE = os.getenv("ARCHGW_DOCKER_IMAGE", "katanemo/archgw:0.3.22")
|
||||
SERVICE_NAME_ARCHGW = "plano"
|
||||
PLANO_DOCKER_NAME = "plano"
|
||||
PLANO_DOCKER_IMAGE = os.getenv("PLANO_DOCKER_IMAGE", "katanemo/plano:0.4.0")
|
||||
|
|
|
|||
|
|
@ -7,14 +7,14 @@ import sys
|
|||
import yaml
|
||||
from cli.utils import convert_legacy_listeners, getLogger
|
||||
from cli.consts import (
|
||||
ARCHGW_DOCKER_IMAGE,
|
||||
ARCHGW_DOCKER_NAME,
|
||||
PLANO_DOCKER_IMAGE,
|
||||
PLANO_DOCKER_NAME,
|
||||
)
|
||||
import subprocess
|
||||
from cli.docker_cli import (
|
||||
docker_container_status,
|
||||
docker_remove_container,
|
||||
docker_start_archgw_detached,
|
||||
docker_start_plano_detached,
|
||||
docker_stop_container,
|
||||
health_check_endpoint,
|
||||
stream_gateway_logs,
|
||||
|
|
@ -39,6 +39,9 @@ def _get_gateway_ports(arch_config_file: str) -> list[int]:
|
|||
|
||||
all_ports = [listener.get("port") for listener in listeners]
|
||||
|
||||
# unique ports
|
||||
all_ports = list(set(all_ports))
|
||||
|
||||
return all_ports
|
||||
|
||||
|
||||
|
|
@ -51,27 +54,26 @@ def start_arch(arch_config_file, env, log_timeout=120, foreground=False):
|
|||
log_timeout (int): Time in seconds to show logs before checking for healthy state.
|
||||
"""
|
||||
log.info(
|
||||
f"Starting arch gateway, image name: {ARCHGW_DOCKER_NAME}, tag: {ARCHGW_DOCKER_IMAGE}"
|
||||
f"Starting arch gateway, image name: {PLANO_DOCKER_NAME}, tag: {PLANO_DOCKER_IMAGE}"
|
||||
)
|
||||
|
||||
try:
|
||||
archgw_container_status = docker_container_status(ARCHGW_DOCKER_NAME)
|
||||
if archgw_container_status != "not found":
|
||||
log.info("archgw found in docker, stopping and removing it")
|
||||
docker_stop_container(ARCHGW_DOCKER_NAME)
|
||||
docker_remove_container(ARCHGW_DOCKER_NAME)
|
||||
plano_container_status = docker_container_status(PLANO_DOCKER_NAME)
|
||||
if plano_container_status != "not found":
|
||||
log.info("plano found in docker, stopping and removing it")
|
||||
docker_stop_container(PLANO_DOCKER_NAME)
|
||||
docker_remove_container(PLANO_DOCKER_NAME)
|
||||
|
||||
gateway_ports = _get_gateway_ports(arch_config_file)
|
||||
|
||||
return_code, _, archgw_stderr = docker_start_archgw_detached(
|
||||
return_code, _, plano_stderr = docker_start_plano_detached(
|
||||
arch_config_file,
|
||||
os.path.expanduser("~/archgw_logs"),
|
||||
env,
|
||||
gateway_ports,
|
||||
)
|
||||
if return_code != 0:
|
||||
log.info("Failed to start arch gateway: " + str(return_code))
|
||||
log.info("stderr: " + archgw_stderr)
|
||||
log.info("Failed to start plano gateway: " + str(return_code))
|
||||
log.info("stderr: " + plano_stderr)
|
||||
sys.exit(1)
|
||||
|
||||
start_time = time.time()
|
||||
|
|
@ -84,12 +86,12 @@ def start_arch(arch_config_file, env, log_timeout=120, foreground=False):
|
|||
if not health_check_status:
|
||||
all_listeners_healthy = False
|
||||
|
||||
archgw_status = docker_container_status(ARCHGW_DOCKER_NAME)
|
||||
plano_status = docker_container_status(PLANO_DOCKER_NAME)
|
||||
current_time = time.time()
|
||||
elapsed_time = current_time - start_time
|
||||
|
||||
if archgw_status == "exited":
|
||||
log.info("archgw container exited unexpectedly.")
|
||||
if plano_status == "exited":
|
||||
log.info("plano container exited unexpectedly.")
|
||||
stream_gateway_logs(follow=False)
|
||||
sys.exit(1)
|
||||
|
||||
|
|
@ -100,14 +102,14 @@ def start_arch(arch_config_file, env, log_timeout=120, foreground=False):
|
|||
sys.exit(1)
|
||||
|
||||
if all_listeners_healthy:
|
||||
log.info("archgw is running and is healthy!")
|
||||
log.info("plano is running and is healthy!")
|
||||
break
|
||||
else:
|
||||
health_check_status_str = (
|
||||
"healthy" if health_check_status else "not healthy"
|
||||
)
|
||||
log.info(
|
||||
f"archgw status: {archgw_status}, health status: {health_check_status_str}"
|
||||
f"plano status: {plano_status}, health status: {health_check_status_str}"
|
||||
)
|
||||
time.sleep(1)
|
||||
|
||||
|
|
@ -119,7 +121,7 @@ def start_arch(arch_config_file, env, log_timeout=120, foreground=False):
|
|||
stop_docker_container()
|
||||
|
||||
|
||||
def stop_docker_container(service=ARCHGW_DOCKER_NAME):
|
||||
def stop_docker_container(service=PLANO_DOCKER_NAME):
|
||||
"""
|
||||
Shutdown all Docker Compose services by running `docker-compose down`.
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ import sys
|
|||
import requests
|
||||
|
||||
from cli.consts import (
|
||||
ARCHGW_DOCKER_IMAGE,
|
||||
ARCHGW_DOCKER_NAME,
|
||||
PLANO_DOCKER_IMAGE,
|
||||
PLANO_DOCKER_NAME,
|
||||
)
|
||||
from cli.utils import getLogger
|
||||
|
||||
|
|
@ -40,9 +40,8 @@ def docker_remove_container(container: str) -> str:
|
|||
return result.returncode
|
||||
|
||||
|
||||
def docker_start_archgw_detached(
|
||||
def docker_start_plano_detached(
|
||||
arch_config_file: str,
|
||||
logs_path_abs: str,
|
||||
env: dict,
|
||||
gateway_ports: list[int],
|
||||
) -> str:
|
||||
|
|
@ -70,13 +69,13 @@ def docker_start_archgw_detached(
|
|||
"run",
|
||||
"-d",
|
||||
"--name",
|
||||
ARCHGW_DOCKER_NAME,
|
||||
PLANO_DOCKER_NAME,
|
||||
*port_mappings_args,
|
||||
*volume_mappings_args,
|
||||
*env_args,
|
||||
"--add-host",
|
||||
"host.docker.internal:host-gateway",
|
||||
ARCHGW_DOCKER_IMAGE,
|
||||
PLANO_DOCKER_IMAGE,
|
||||
]
|
||||
|
||||
result = subprocess.run(options, capture_output=True, text=True, check=False)
|
||||
|
|
@ -93,11 +92,11 @@ def health_check_endpoint(endpoint: str) -> bool:
|
|||
return False
|
||||
|
||||
|
||||
def stream_gateway_logs(follow, service="archgw"):
|
||||
def stream_gateway_logs(follow, service="plano"):
|
||||
"""
|
||||
Stream logs from the arch gateway service.
|
||||
Stream logs from the plano gateway service.
|
||||
"""
|
||||
log.info("Logs from arch gateway service.")
|
||||
log.info("Logs from plano gateway service.")
|
||||
|
||||
options = ["docker", "logs"]
|
||||
if follow:
|
||||
|
|
@ -116,7 +115,7 @@ def stream_gateway_logs(follow, service="archgw"):
|
|||
log.info(f"Failed to stream logs: {str(e)}")
|
||||
|
||||
|
||||
def docker_validate_archgw_schema(arch_config_file):
|
||||
def docker_validate_plano_schema(arch_config_file):
|
||||
result = subprocess.run(
|
||||
[
|
||||
"docker",
|
||||
|
|
@ -126,7 +125,7 @@ def docker_validate_archgw_schema(arch_config_file):
|
|||
f"{arch_config_file}:/app/arch_config.yaml:ro",
|
||||
"--entrypoint",
|
||||
"python",
|
||||
ARCHGW_DOCKER_IMAGE,
|
||||
PLANO_DOCKER_IMAGE,
|
||||
"-m",
|
||||
"cli.config_generator",
|
||||
],
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import importlib.metadata
|
|||
import json
|
||||
from cli import targets
|
||||
from cli.docker_cli import (
|
||||
docker_validate_archgw_schema,
|
||||
docker_validate_plano_schema,
|
||||
stream_gateway_logs,
|
||||
docker_container_status,
|
||||
)
|
||||
|
|
@ -25,43 +25,45 @@ from cli.core import (
|
|||
start_cli_agent,
|
||||
)
|
||||
from cli.consts import (
|
||||
ARCHGW_DOCKER_IMAGE,
|
||||
ARCHGW_DOCKER_NAME,
|
||||
PLANO_DOCKER_IMAGE,
|
||||
PLANO_DOCKER_NAME,
|
||||
SERVICE_NAME_ARCHGW,
|
||||
)
|
||||
|
||||
log = getLogger(__name__)
|
||||
|
||||
# ref https://patorjk.com/software/taag/#p=display&f=Doom&t=Plano&x=none&v=4&h=4&w=80&we=false
|
||||
logo = r"""
|
||||
_ _
|
||||
/ \ _ __ ___ | |__
|
||||
/ _ \ | '__|/ __|| '_ \
|
||||
/ ___ \ | | | (__ | | | |
|
||||
/_/ \_\|_| \___||_| |_|
|
||||
______ _
|
||||
| ___ \ |
|
||||
| |_/ / | __ _ _ __ ___
|
||||
| __/| |/ _` | '_ \ / _ \
|
||||
| | | | (_| | | | | (_) |
|
||||
\_| |_|\__,_|_| |_|\___/
|
||||
|
||||
"""
|
||||
|
||||
# Command to build archgw Docker images
|
||||
# Command to build plano Docker images
|
||||
ARCHGW_DOCKERFILE = "./arch/Dockerfile"
|
||||
|
||||
|
||||
def get_version():
|
||||
try:
|
||||
version = importlib.metadata.version("archgw")
|
||||
version = importlib.metadata.version("plano")
|
||||
return version
|
||||
except importlib.metadata.PackageNotFoundError:
|
||||
return "version not found"
|
||||
|
||||
|
||||
@click.group(invoke_without_command=True)
|
||||
@click.option("--version", is_flag=True, help="Show the archgw cli version and exit.")
|
||||
@click.option("--version", is_flag=True, help="Show the plano cli version and exit.")
|
||||
@click.pass_context
|
||||
def main(ctx, version):
|
||||
if version:
|
||||
click.echo(f"archgw cli version: {get_version()}")
|
||||
click.echo(f"plano cli version: {get_version()}")
|
||||
ctx.exit()
|
||||
|
||||
log.info(f"Starting archgw cli version: {get_version()}")
|
||||
log.info(f"Starting plano cli version: {get_version()}")
|
||||
|
||||
if ctx.invoked_subcommand is None:
|
||||
click.echo("""Arch (The Intelligent Prompt Gateway) CLI""")
|
||||
|
|
@ -76,7 +78,7 @@ def build():
|
|||
# Check if /arch/Dockerfile exists
|
||||
if os.path.exists(ARCHGW_DOCKERFILE):
|
||||
if os.path.exists(ARCHGW_DOCKERFILE):
|
||||
click.echo("Building archgw image...")
|
||||
click.echo("Building plano image...")
|
||||
try:
|
||||
subprocess.run(
|
||||
[
|
||||
|
|
@ -85,7 +87,7 @@ def build():
|
|||
"-f",
|
||||
ARCHGW_DOCKERFILE,
|
||||
"-t",
|
||||
f"{ARCHGW_DOCKER_IMAGE}",
|
||||
f"{PLANO_DOCKER_IMAGE}",
|
||||
".",
|
||||
"--add-host=host.docker.internal:host-gateway",
|
||||
],
|
||||
|
|
@ -93,7 +95,7 @@ def build():
|
|||
)
|
||||
click.echo("archgw image built successfully.")
|
||||
except subprocess.CalledProcessError as e:
|
||||
click.echo(f"Error building archgw image: {e}")
|
||||
click.echo(f"Error building plano image: {e}")
|
||||
sys.exit(1)
|
||||
else:
|
||||
click.echo("Error: Dockerfile not found in /arch")
|
||||
|
|
@ -128,7 +130,7 @@ def up(file, path, foreground):
|
|||
validation_return_code,
|
||||
validation_stdout,
|
||||
validation_stderr,
|
||||
) = docker_validate_archgw_schema(arch_config_file)
|
||||
) = docker_validate_plano_schema(arch_config_file)
|
||||
if validation_return_code != 0:
|
||||
log.info(f"Error: Validation failed. Exiting")
|
||||
log.info(f"Validation stdout: {validation_stdout}")
|
||||
|
|
@ -211,7 +213,7 @@ def generate_prompt_targets(file):
|
|||
@click.command()
|
||||
@click.option(
|
||||
"--debug",
|
||||
help="For detailed debug logs to trace calls from archgw <> api_server, etc",
|
||||
help="For detailed debug logs to trace calls from plano <> api_server, etc",
|
||||
is_flag=True,
|
||||
)
|
||||
@click.option("--follow", help="Follow the logs", is_flag=True)
|
||||
|
|
@ -259,11 +261,11 @@ def cli_agent(type, file, path, settings):
|
|||
CLI_AGENT: The type of CLI agent to start (currently only 'claude' is supported)
|
||||
"""
|
||||
|
||||
# Check if archgw docker container is running
|
||||
archgw_status = docker_container_status(ARCHGW_DOCKER_NAME)
|
||||
# Check if plano docker container is running
|
||||
archgw_status = docker_container_status(PLANO_DOCKER_NAME)
|
||||
if archgw_status != "running":
|
||||
log.error(f"archgw docker container is not running (status: {archgw_status})")
|
||||
log.error("Please start archgw using the 'archgw up' command.")
|
||||
log.error("Please start plano using the 'archgw up' command.")
|
||||
sys.exit(1)
|
||||
|
||||
# Determine arch_config.yaml path
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue