nefevcore / dsh-adt

Listed

ABAP Development Tools (ADT) plugin for DeepSeek Harness

mainTool View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:nefevcore/dsh-adt

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit aeb96f1Synced Aug 18, 2026

dsh-abap-adt — ABAP Development Tools for DeepSeek Harness

npm license tests dsh plugin

English — Agent-native SAP ABAP access for DeepSeek Harness (DSH): a Cordis plugin that speaks the SAP ADT REST protocol directly (/sap/bc/adt; no SAP libraries, no IDE) and registers 30 adt_* tools covering the full loop search → read → edit → activate → unit test → ATC → transport, plus agent-scale batch capabilities (whole-package quality reports, local export, offline abaplint, release gates). Ships with a zero-config mock server, so you can try everything without an SAP system.

DeepSeek Harness (DSH) 上直接访问 SAP ABAP 系统的插件与协议客户端。

本插件直接实现 SAP ADT(ABAP Development Tools)REST 协议/sap/bc/adt),不依赖任何 SAP 闭源库,也无需任何 IDE(headless 运行)。AI 代理获得了一整套 adt_* 原生工具,可以自主完成搜索 → 阅读 → 修改 → 激活 → 测试 → 传输的完整开发闭环,并提供代理尺度的批量能力(整包质量报告、源码导出、离线检查、发布门禁)。

🔎 找 DSH 插件? 本仓库已打上 GitHub Topic dsh-plugin(另见 deepseek-harness);npm 上检索关键词 dsh-plugin 也能找到本插件。

安装与更新

安装和更新只支持 dsh CLI 一种方式(要求 pnpm 在 PATH——corepack enablenpm i -g pnpm;缺失时 dsh 会明确报错)。三个包均已发布到 npm(@nefevcore/abap-adt-protocol 协议客户端、@nefevcore/abap-adt-mock 内置 mock、@nefevcore/abap-adt-dsh-plugin DSH 插件):

# ① 安装(装进 web profile;仅安装,不自动加载)
dsh plugin --profile web add @nefevcore/abap-adt-dsh-plugin

# ② 生成按会话启用的 agent 预设(一次性;复制默认预设并追加插件行)
dsh plugin --profile web exec abap-adt-preset

# 更新到最新版(更新不会动你的预设与配置)
dsh plugin --profile web update @nefevcore/abap-adt-dsh-plugin

# 或锁定指定版本
dsh plugin --profile web add @nefevcore/abap-adt-dsh-plugin@0.2.0

默认不加载,按会话启用(by design):包内不声明 dsh.bundle,安装只是把包放进 profile 的依赖里——adt_* 工具只出现在用 abap-adt 预设创建的会话,其他会话完全不受影响。安装时 dsh 会提示 declares no dsh.bundle — installed as a plain dependency,这正是预期行为。

②生成的预设:复制部署默认预设(~/.dsh/settings.yamlagent-presets.default,通常是 cordis)到 ~/.dsh/.agent-presets/abap-adt/ 并追加插件行;支持 --id/--from/--name/--force/--dry-run。重启 DSH 后新建会话,在预设 chip 选「ABAP Development」即可。手工建预设的说明见 presets/abap-adt.example/

DSH 的 profile 由 pnpm 管理(~/.dsh/profiles/web/ 下有 pnpm-workspace.yaml),不要用 npm 装进 profile(会生成 package-lock 并破坏 pnpm 布局)。装/更新插件、新建预设后重启 DSH;之后的配置变更走 DSH settings,免重启热生效。连接真实系统的 destinations 与权限开关配置在 ~/.dsh/settings.yamlabap-adt: 段(见下方「配置分层」)。

从 0.1.0 升级

0.2.0 改为默认不加载(全局层自动退场)且配置迁入 settings,升级后需做两件一次性操作:

# ① 更新(reconcile 会自动把插件移出全局 bundle 层——工具从默认会话消失是预期的)
dsh plugin --profile web update @nefevcore/abap-adt-dsh-plugin

# ② 重建预设(若 0.1.0 时代已手工建过 ~/.dsh/.agent-presets/abap-adt/,加 --force 覆盖)
dsh plugin --profile web exec abap-adt-preset --force

然后把 ~/.dsh/abap-adt.yml(0.1.0 的外部配置文件,已废弃)的内容整体缩进两格并入 ~/.dsh/settings.yamlabap-adt: 段并删除旧文件(不迁会有 deprecation 告警;模板见 presets/abap-adt.example/settings-section.example)。最后重启 DSH,新会话选「ABAP Development」预设。

核心能力

  • 代理原生工具:30 个 adt_* 工具,AI 自主编排多步开发流程
  • 批量代码分析adt_batch_checks 一次对整个包跑 ATC + ABAP Unit 聚合质量报告
  • 传输自动化adt_list_transports / adt_get_transport / adt_release_transport
  • 本地版本化adt_export_objects 把对象源码落盘为 .abap 文件(git 化/备份/离线评审)
  • 本地静态检查adt_local_check 导出源码后离线跑 abaplint(语法 + lint),验证通过再一次性推送 SAP
  • 全链路自动化:search → read → write → activate → test → transport 由 AI 一条龙完成
  • 工作流编排:可配合 DSH 的 workflow/subagent 做大规模多目标分析
  • 定时任务:可配合 dsh-schedule 做夜间 ATC/质量巡检
  • 零配置 demo 模式:内置 mock ADT 服务器,无需任何 SAP 系统即可端到端体验

快速开始

完成上方 ①② 并重启 DSH,新建会话选择「ABAP Development」预设。插件默认 demo: true(进程内 mock ADT 服务器,demo 目的地)。直接对代理说:

列出 ADT 目的地 → 搜索 ZCL_DEMO → 读取其源码 → 修改它 → 激活 → 跑它的单元测试和 ATC → 导出整个 ZPACK_DEMO 包到本地 → 本地静态检查导出的源码

连真实系统:在 ~/.dsh/settings.yaml 增加 abap-adt: 段(保存即热生效,无需重启):

abap-adt:
  defaultDestination: dev
  destinations:
    - name: dev
      url: https://sap.example.com:443     # ABAP 前端的 HTTP(S) 地址
      client: '100'                        # 集团
      language: EN
      username: DEVELOPER
      passwordEnv: ADT_DEV_PASSWORD        # 从环境变量读密码(推荐)
      strictSSL: false                     # 自签名证书(SAP 内网常见)时必须关

配置分层(config layering)

配置走 DSH settings:插件把自身的配置 schema 注册为 abap-adt 命名空间,插件行的内联 config 是 composition base,~/.dsh/settings.yamlabap-adt: 段是用户层——保存即热生效(目的地表与权限策略原地重建,无需重启 DSH)。生效值就近覆盖

① schema 默认值                              (demo 开、8123、defaultDestination=demo、无目的地)
② 插件行内联 config                          (agent preset / cordis.patch.yml —— composition base)
③ 旧版独立文件 ~/.dsh/abap-adt.yml            (已废弃,仅迁移期兼容,出现即告警)
④ settings.yaml 的 abap-adt: 用户段           (用户覆盖层)
⑤ 显式 configFile(团队共享,最权威)          (路径可来自 ②-④ 任一层;~ 展开、相对路径锚定 dsh home)
⑥ SAP_* 环境变量                              (仅权限四开关,且仅在 ①-⑤ 均未设置时生效)
  • destinations 跨层按名字合并:高层的同名条目覆盖低层,新名字追加——随包发布的 destinations: [] 永远不会挡住其他层
  • settings 段/共享文件写错键名会明确报错(含路径与未知键名);显式指定的 configFile 不存在则告警并跳过该层
  • 密码在 schema 中标记为 secret(settings 展示时自动脱敏);解析优先级 config.password > passwordEnv 指定变量 > ADT_<NAME>_PASSWORD > ADT_PASSWORD切勿把密码明文写进任何配置。
  • 未挂载 settings 服务的精简 profile 自动降级:仅用插件行 config 解析,行为与组合时一致

认证说明:

  • on-prem 经典 ABAP:Basic Auth(支持自签名证书时设 strictSSL: false
  • ABAP Cloud (BTP):需要 JWT/服务键认证(本版本已预留 auth 类型扩展点,'basic' 之外可扩展 'jwt'

权限管控(Permission Policy)

所有会修改 SAP 系统状态的工具(adt_write_object / adt_create_object / adt_delete_object / adt_activate / 传输工具族)在执行前都会经过一层权限策略(src/policy.ts),不满足即抛 [POLICY] 错误并指明具体规则。只读工具(搜索/读取/检查/测试/ATC/导出)不受限制。

四个独立开关,生效值优先级为 settings 用户段/共享文件 > 插件行内联 config > SAP_* 环境变量 > 内置默认值(详见上方「配置分层」):

开关config 键环境变量默认含义
传输开关enableTransportsSAP_ENABLE_TRANSPORTStruefalse 时传输工具族、显式 transport 参数、以及可传输包的一切编辑(隐式产生传输内容)全部拒绝
允许的传输号allowedTransportsSAP_ALLOWED_TRANSPORTS*逗号分隔 glob(如 D01K96*)。既约束显式传入的传输号,也约束后端在 lock 时自动分配的 CORRNR——不匹配则回滚(解锁)并拒绝
可传输编辑allowTransportableEditsSAP_ALLOW_TRANSPORTABLE_EDITStruefalse 时只允许编辑 $TMP(本地对象)中的对象
允许的包allowedPackagesSAP_ALLOWED_PACKAGES*逗号分隔 glob(如 Z*,$TMP),只有白名单内的包可被编辑;* = 全部

要点:

  • 包校验对新建用显式 packageName;对已存在对象(write/delete/activate)优先取调用方传入的 packageName,否则通过搜索精确命中解析包名;无法确定包名时失败关闭(拒绝并提示补传 packageName)。
  • $TMP 不被隐式放行——白名单是权威的,需要本地对象就把 $TMP 写进 allowedPackages
  • 环境变量示例:SAP_ENABLE_TRANSPORTS=true SAP_ALLOWED_TRANSPORTS='D01K96*' SAP_ALLOW_TRANSPORTABLE_EDITS=true SAP_ALLOWED_PACKAGES='Z*,$TMP'
  • adt_permissions 查看当前生效策略与每个开关的来源(config/env/default)。
  • 注意:demo 目的地的 mock 传输号(S4HK900001 等)通常不在 allowedTransports 白名单内,因此 demo 上对可传输对象的写入/激活会被策略拒绝——纯演示时把 allowedTransports 设为 *,或只做只读演示。

协议实现要点(与真实 SAP 兼容)

基于对生产级开源客户端的交叉验证(@mcp-abap-adt/adt-clientsabap-adt-apivscode_abap_remote_fs)与 SAP 官方 BTP REST 文档:

  • 认证:Basic Auth + sap-adt-connection-id(UUID)头;CSRF 通过 GET /sap/bc/adt/core/discovery + x-csrf-token: fetch 握手;写操作自动带 token,403/401 时重置会话重试一次
  • 会话:cookie 自动管理;sap-usercontext 强制覆盖为请求的 client;写链(lock→PUT→unlock)发送 x-sap-adt-sessiontype: stateful
  • POST {uri}?_action=LOCK&accessMode=MODIFY → 解析 asx:abap 响应取 LOCK_HANDLE / CORRNR;解锁 ?_action=UNLOCK&lockHandle=
  • 源码:读 GET {uri}/source/main(Accept text/plain);写 PUT {uri}/source/main?lockHandle=...&corrNr=...(CT text/plain; charset=utf-8);对不支持 /source/main 的后端回退到对象 URI
  • 激活POST /sap/bc/adt/repository/activation?method=activate&preauditRequested=true,body 为 adtcore:objectReferences激活错误在 HTTP 200 body 的 chkl:messages(type="E")
  • 语法检查POST /sap/bc/adt/checkruns?reporters=abapCheckRunchkrun:checkObjectList
  • ABAP UnitPOST /sap/bc/adt/abapunit/runsaunit:run + OSL objectSet)→ 轮询状态 → GET /sap/bc/adt/abapunit/results/{id}(JUnit XML)
  • ATCPOST /sap/bc/adt/atc/runsatc:runparameters)→ 轮询 → GET /sap/bc/adt/atc/results/{displayId}(checkstyle XML)
  • 传输/sap/bc/adt/cts/transportrequests(列表/详情/release)
  • 创建:类型专用集合端点(/sap/bc/adt/oo/classes 等)+ 命名空间元数据 XML + package 查询参数,201 + Location
  • 搜索/sap/bc/adt/repository/informationsystem/search?operation=...&query=...&maxResults=...
  • 包内容/sap/bc/adt/repository/nodestructure?parent_name=DEVC/K&parent_type=DEVC/K

详见 docs/adt-protocol-notes.md

测试

100 项pnpm test,CI 发布前强制跑全量):协议解析(XML/传输)、客户端 ↔ mock 端到端、权限策略、abaplint 本地检查、版本 diff、发布门禁、配置分层。

路线图(可扩展方向)

  • JWT/OAuth2(ABAP Cloud / BTP 服务键)认证支持——auth 类型扩展点已预留,目前仅 'basic'
  • ABAP Debugger REST API 工具(断点/栈/变量)
  • RAP 对象(BDEF/DDLX/SRVD)专项工具
  • ATC 豁免/基线(exemptions)管理

已落地(早期路线图项):adt_where_used(影响分析)、adt_data_preview(CDS/SQL 数据预览)、adt_object_versions / adt_version_diff(版本历史与 diff)、adt_lock_info / adt_unlock_all(锁状态查询与残留锁清理)。

许可证

MIT(本仓库代码)。协议知识参考社区开源实现与 SAP 公开文档;不包含 SAP 专有代码。注意 SAP Developer License 禁止将 SAP 材料用于 AI 训练——本插件是运行时集成工具,请合规使用。

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected
Security policyDetected
Contributing guideDetected
DocumentationDetected
ExamplesDetected

Repository information

Language
TypeScript
License
Not reported
Last updated
Aug 18, 2026, 2:27 PM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.