Files
speckle-server/.agent/scripts/auto_preview.py
T
huanld d1871b3979
Release pipeline / Get version (push) Has been cancelled
Release pipeline / Get Chart Name (push) Has been cancelled
Release pipeline / tests (push) Has been cancelled
Release pipeline / builds (push) Has been cancelled
Release pipeline / builds-ghcr (push) Has been cancelled
Release pipeline / test-deployments (push) Has been cancelled
Release pipeline / deploy (push) Has been cancelled
Release pipeline / Helm chart oci (push) Has been cancelled
Release pipeline / npm (push) Has been cancelled
Release pipeline / snyk (push) Has been cancelled
chore: apply viewer optimizations, tailscale networking fixes, and Dev environment configurations
2026-04-16 13:55:08 +07:00

149 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Auto Preview - Antigravity Kit
==============================
Manages (start/stop/status) the local development server for previewing the application.
Usage:
python .agent/scripts/auto_preview.py start [port]
python .agent/scripts/auto_preview.py stop
python .agent/scripts/auto_preview.py status
"""
import os
import sys
import time
import json
import signal
import argparse
import subprocess
from pathlib import Path
AGENT_DIR = Path(".agent")
PID_FILE = AGENT_DIR / "preview.pid"
LOG_FILE = AGENT_DIR / "preview.log"
def get_project_root():
return Path(".").resolve()
def is_running(pid):
try:
os.kill(pid, 0)
return True
except OSError:
return False
def get_start_command(root):
pkg_file = root / "package.json"
if not pkg_file.exists():
return None
with open(pkg_file, 'r') as f:
data = json.load(f)
scripts = data.get("scripts", {})
if "dev" in scripts:
return ["npm", "run", "dev"]
elif "start" in scripts:
return ["npm", "start"]
return None
def start_server(port=3000):
if PID_FILE.exists():
try:
pid = int(PID_FILE.read_text().strip())
if is_running(pid):
print(f"⚠️ Preview already running (PID: {pid})")
return
except:
pass # Invalid PID file
root = get_project_root()
cmd = get_start_command(root)
if not cmd:
print("❌ No 'dev' or 'start' script found in package.json")
sys.exit(1)
# Add port env var if needed (simple heuristic)
env = os.environ.copy()
env["PORT"] = str(port)
print(f"🚀 Starting preview on port {port}...")
with open(LOG_FILE, "w") as log:
process = subprocess.Popen(
cmd,
cwd=str(root),
stdout=log,
stderr=log,
env=env,
shell=True # Required for npm on windows often, or consistent path handling
)
PID_FILE.write_text(str(process.pid))
print(f"✅ Preview started! (PID: {process.pid})")
print(f" Logs: {LOG_FILE}")
print(f" URL: http://localhost:{port}")
def stop_server():
if not PID_FILE.exists():
print("️ No preview server found.")
return
try:
pid = int(PID_FILE.read_text().strip())
if is_running(pid):
# Try gentle kill first
os.kill(pid, signal.SIGTERM) if sys.platform != 'win32' else subprocess.call(['taskkill', '/F', '/T', '/PID', str(pid)])
print(f"🛑 Preview stopped (PID: {pid})")
else:
print("️ Process was not running.")
except Exception as e:
print(f"❌ Error stopping server: {e}")
finally:
if PID_FILE.exists():
PID_FILE.unlink()
def status_server():
running = False
pid = None
url = "Unknown"
if PID_FILE.exists():
try:
pid = int(PID_FILE.read_text().strip())
if is_running(pid):
running = True
# Heuristic for URL, strictly we should save it
url = "http://localhost:3000"
except:
pass
print("\n=== Preview Status ===")
if running:
print(f"✅ Status: Running")
print(f"🔢 PID: {pid}")
print(f"🌐 URL: {url} (Likely)")
print(f"📝 Logs: {LOG_FILE}")
else:
print("⚪ Status: Stopped")
print("===================\n")
def main():
parser = argparse.ArgumentParser()
parser.add_argument("action", choices=["start", "stop", "status"])
parser.add_argument("port", nargs="?", default="3000")
args = parser.parse_args()
if args.action == "start":
start_server(int(args.port))
elif args.action == "stop":
stop_server()
elif args.action == "status":
status_server()
if __name__ == "__main__":
main()