chore: 同步至源码 2.5.1 — SKILL.md 改为构建产物 + 工具代码刷新

SKILL.md(唯一来源 = sap-cli/skill-src/SKILL.md.tmpl):
- 本仓 SKILL.md 自此为构建产物,勿手工编辑;手改后再构建会被漂移护栏拦下
- 并入模板独有内容:调用方式节 + 补齐 parser 真实命令(clone/enhancement/
  history/unit-test/unlock/transport create,原表只 9 个,实际 31 个)
- 版本号改为 {{VERSION}} 注入(原字面量停在 v2.2.1/v2.3.0,与工具实际版本脱节)
- 修 1 处违反铁律 5 的示例(--path ./src → ./src/TMP/class/)

assets/(工具代码,此前严重过时):
- 9 个文件与源码不一致,scanner.py 尤甚:3818B → 6664B
- 修复前从本仓装出的工具**不支持三层 src 结构**,铁律 5 实际跑不通
- transport.py 反向漂移(分发版多 transport create,源码无)已随源码回迁对齐

VERSION 2.5.1;references/ 三份规则与源码一致(无差异)
This commit is contained in:
吴让宇
2026-09-11 00:22:05 +08:00
parent df1533e843
commit e786742bcb
10 changed files with 231 additions and 55 deletions
+2
View File
@@ -8,6 +8,7 @@ from sapcli.commands.crud import (
cmd_download,
cmd_info,
cmd_sync,
cmd_unlock,
)
from sapcli.commands.batch import (
cmd_init,
@@ -76,6 +77,7 @@ from sapcli.commands.enhancement import (
__all__ = [
"cmd_create",
"cmd_delete",
"cmd_unlock",
"cmd_download",
"cmd_info",
"cmd_init",
+3 -2
View File
@@ -37,8 +37,9 @@ def cmd_init(args: argparse.Namespace, client: ADTClient) -> None:
if not scanned:
print(" 未扫描到 .abap 文件")
print(" 请确认项目目录结构是否符合约定:")
print(" reports/, classes/, interfaces/, functions/, domains/, ...")
print(" 请确认项目目录结构是否符合约定(两种布局均可):")
print(" 三层: src/<开发包>/<对象类型>/<文件名>.abap (本地开发包固定 TMP)")
print(" 扁平: <对象类型>/<文件名>.abap (对象类型目录单复数均可)")
return
print(f" ✓ 扫描到 {len(scanned)} 个本地文件\n")
+24
View File
@@ -589,6 +589,30 @@ def cmd_delete(args: argparse.Namespace, client: ADTClient) -> None:
raise DeleteError(f"删除失败: {error}")
def cmd_unlock(args: argparse.Namespace, client: ADTClient) -> None:
"""释放指定对象的 enqueue 锁(清理 delete 后残留锁 / SM12 场景)。"""
obj_type: str = args.type
name: str = args.name
lock_handle: str = args.lock_handle
parsed = parse_object_name(name, obj_type)
type_label = get_type_config(obj_type).label
print("=" * 60)
print(" SAP ADT 释放对象锁")
print("=" * 60)
print(f" 对象类型: {type_label}")
print(f" 对象名称: {parsed.display_name}")
print(f"\n → 正在释放锁 (lockHandle={lock_handle[:12]}...)...")
ok = client.unlock(parsed.obj_uri, lock_handle)
if ok:
print(" ✓ 锁释放成功")
else:
print(" ✗ 锁释放失败(HTTP 非 200,可能锁已不存在或 handle 无效)")
raise SapCliError(f"解锁失败: {parsed.display_name}")
def _update_manifest_after_delete(
args: argparse.Namespace,
name: str,
+3 -3
View File
@@ -1,4 +1,4 @@
"""传输管理命令:transport (list / info / release / objects)。"""
"""传输管理命令:transport (list / info / release / objects / create)。"""
from __future__ import annotations
import argparse
@@ -119,7 +119,7 @@ def _transport_create(args: argparse.Namespace, client: ADTClient) -> None:
print("=" * 60)
print(f" 描述: {description}")
print(f"\n → 正在创建...")
print("\n → 正在创建...")
try:
new_nr = client.create_transport_request(description)
except Exception as e:
@@ -129,7 +129,7 @@ def _transport_create(args: argparse.Namespace, client: ADTClient) -> None:
if new_nr:
print(f"\n ✓ 传输请求已创建: {new_nr}")
else:
print(f"\n ✗ 创建失败(未返回编号),请检查系统或描述合法性")
print("\n ✗ 创建失败(未返回编号),请检查系统或描述合法性")
def _transport_objects(args: argparse.Namespace, client: ADTClient) -> None: