feat: sap-cli skill v2.1.0 — self-contained distributable package

- assets/: sap-cli source (v2.1.0, 26 commands, 16 object types)
- references/: tool constraints + error handling (self-contained)
- scripts/setup.py: one-click install/config/verify
- SKILL.md: full command reference + dual-platform install guide
- VERSION: 2.1.0

Built from D:/Codespace/sap-cli via scripts/pack_skill.py
This commit is contained in:
2026-06-13 20:52:24 +08:00
commit 1e39b6da88
49 changed files with 7172 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
"""传输管理命令:transport (list / info / release / objects)。"""
from __future__ import annotations
import argparse
import logging
from sapcli.client import ADTClient
logger = logging.getLogger("sapcli.commands.transport")
def cmd_transport(args: argparse.Namespace, client: ADTClient) -> None:
"""传输请求管理。"""
action = getattr(args, "transport_action", None)
if action == "list":
_transport_list(args, client)
elif action == "info":
_transport_info(args, client)
elif action == "release":
_transport_release(args, client)
elif action == "objects":
_transport_objects(args, client)
else:
print(" 用法: sap-cli transport [list|info|release|objects]")
print(" list — 列出可修改的传输请求")
print(" info — 查看传输请求详情")
print(" release — 释放传输请求")
print(" objects — 列出传输请求中的对象")
def _transport_list(args: argparse.Namespace, client: ADTClient) -> None:
"""列出可修改的传输请求。"""
print("=" * 60)
print(" SAP 传输请求列表")
print("=" * 60)
print(f"\n → 正在查询传输请求...")
try:
requests_list = client.list_transport_requests()
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
if not requests_list:
print(" 未找到可修改的传输请求")
return
print(f" ✓ 找到 {len(requests_list)} 个传输请求\n")
print(f" {'编号':<15s} {'描述':<40s} {'所有者':<15s}")
print(f" {'' * 15} {'' * 40} {'' * 15}")
for req in requests_list:
num = req.get("number", "")[:15]
desc = req.get("description", "")[:40]
owner = req.get("owner", "")[:15]
print(f" {num:<15s} {desc:<40s} {owner:<15s}")
def _transport_info(args: argparse.Namespace, client: ADTClient) -> None:
"""查看传输请求详情。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 传输请求详情")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n → 正在查询...")
try:
info = client.transport_info(corr_nr)
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
print(f"\n {'' * 50}")
print(f" 描述: {info.get('description', '')}")
print(f" 状态: {info.get('status', '')}")
print(f" 所有者: {info.get('owner', '')}")
print(f" {'' * 50}")
def _transport_release(args: argparse.Namespace, client: ADTClient) -> None:
"""释放传输请求。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 释放传输请求")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n ⚠️ 即将释放传输请求: {corr_nr}")
confirm = input(" 确认释放? (输入 yes 确认): ").strip()
if confirm.lower() != "yes":
print(" 已取消释放操作")
return
print(f"\n → 正在释放...")
try:
success = client.transport_release(corr_nr)
except Exception as e:
print(f" ✗ 释放失败: {e}")
return
if success:
print(f" ✓ 传输请求 {corr_nr} 已成功释放!")
else:
print(f" ✗ 释放失败,请检查传输请求状态")
def _transport_objects(args: argparse.Namespace, client: ADTClient) -> None:
"""列出传输请求中的对象。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 传输请求对象列表")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n → 正在查询...")
try:
objects = client.transport_objects(corr_nr)
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
if not objects:
print(" 传输请求中无对象")
return
print(f" ✓ 找到 {len(objects)} 个对象\n")
print(f" {'名称':<30s} {'类型':<15s}")
print(f" {'' * 30} {'' * 15}")
for obj in objects:
obj_name = obj.get("name", "")[:30]
obj_type = obj.get("type", "")[:15]
print(f" {obj_name:<30s} {obj_type:<15s}")