c2d6a5a0d7
Redeploy locally with docker compose when the node is 127.0.0.1 and the image already exists. Make list/sync/remote/deb importable under python3 -I -S. Add human README.md for every builtin skill, slim ack's user-facing docs, and drop unused OpenSpec config.
42 lines
1.1 KiB
Python
Executable File
42 lines
1.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""列出仓库内所有可部署服务及其目标节点。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
import sys
|
||
from collections import defaultdict
|
||
from pathlib import Path
|
||
|
||
_SCRIPT_DIR = Path(__file__).resolve().parent
|
||
if str(_SCRIPT_DIR) not in sys.path:
|
||
sys.path.insert(0, str(_SCRIPT_DIR))
|
||
|
||
from lib import discover_services, project_root # noqa: E402
|
||
|
||
|
||
def main() -> int:
|
||
root = project_root()
|
||
os.chdir(root)
|
||
services = discover_services()
|
||
if not services:
|
||
print("未找到任何可部署服务(需 compose.yaml 且能解析 node)")
|
||
return 0
|
||
|
||
by_node: dict[str, list[str]] = defaultdict(list)
|
||
for info in services:
|
||
rel = os.path.relpath(info["service_dir"], root)
|
||
by_node[info["node"]].append(rel)
|
||
|
||
print(f"共 {len(services)} 个服务,分布在 {len(by_node)} 个节点:\n")
|
||
for node in sorted(by_node):
|
||
print(f"[{node}]")
|
||
for service in by_node[node]:
|
||
print(f" - {service}")
|
||
print()
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|