v0.1.2
DSH ABAP 工作台(dsh-abap-workbench)
一个 DeepSeek Harness (DSH) bundle 插件,把 SAP ABAP 开发工作流装进 DSH:
- ABAP 预设「ABAP 工作台」:新建会话时选择它,即挂载
adt_*工具(32 个,经 ADT REST 访问 SAP); - 三种运行模式(按工作区切换,安全基线默认只读):
- 只读:写/激活/删除/传输/执行/调试全部关闭,只做调查与补丁建议;
- 调试:允许执行触发断点 + 调试器(
adt_debug),写与传输仍关闭; - 更改:按白名单可写、允许传输(每次写需给请求号)、允许执行与调试器。
- 可视化配置页(设置 → ABAP ADT):工作区目的地增删改、连接测试、默认目的地、运行模式、可写白名单(
allowedPackages/allowedTransports); - 会话状态徽章:仅在配置了 ABAP 的工作区显示(存在
.dsh-abap-adt/destinations.yaml),显示默认目的地可切换 + 当前模式徽章。
ADT 工具本体来自依赖包 @nefevcore/abap-adt-dsh-plugin(MIT),本插件只负责预设、策略、配置页与状态条。
安装(在另一台 DSH 上)
前提:DSH ≥ 0.2.1-rc.2、pnpm 在 PATH 上、已配置好 DSH 的模型与凭据。
方式一:从 Git 仓库安装(推荐)
# 1. 克隆到任意工作目录
git clone https://www.heyoung.top/QQ597901027/dsh-abap-workbench.git
cd dsh-abap-workbench
然后二选一:
- 命令行(DSH 已提供 plugin 子命令,转发给 profile 的 pnpm):
再把包名加入 profile 的
dsh plugin --profile web add file:$(pwd)dsh.profile.bundles(见下方“手工登记”),或直接用方式二让 Plugin Manager 完成登记。 - Plugin Manager(推荐):把本仓库目录作为 bundle 安装:
它会完成 pnpm 安装 + bundle 登记;安装完成后重启 DSH。
plugin_manager { action: "install_bundle", target: "<本仓库绝对路径>" }
方式二:从 npm/其它 registry(如果已发布)
plugin_manager { action: "install_bundle", target: "dsh-abap-workbench@0.1.0" }
手工登记(仅当自行 pnpm add 时)
profile 的 package.json:
{
"dependencies": { "dsh-abap-workbench": "file:<本仓库绝对路径>" },
"dsh": { "profile": { "bundles": ["...", "dsh-abap-workbench"] } }
}
改完执行 pnpm install(关闭 DSH 后执行最稳,避免 Windows 上正在使用的原生模块被占用),再启动。
安装后
- 重启 DSH;
- 新建会话 → 预设选择器里选 “ABAP 工作台”;
- 打开 设置 → ABAP ADT:
- 填工作区与目的地(URL / client / 语言 / 用户名 /
passwordEnv); - 密码不要写明文:在 DSH 凭据库或环境变量里放
ADT_DEV_PASSWORD之类的引用名; - 点「测试连接」确认 ADT 服务可达(需在 SAP 侧 SICF 激活
/sap/bc/adt); - 选择运行模式(默认只读),需要写时切到「更改」并配置白名单。
- 填工作区与目的地(URL / client / 语言 / 用户名 /
使用
目的地与凭据
- 目的地配置写在工作区
<workspace>/.dsh-abap-adt/destinations.yaml(按会话工作区隔离,工具调用时热读); - 密码只写引用名(
passwordEnv),真值放 DSH 凭据库(~/.dsh/.credentials.yaml)或进程环境变量; - 内置
demo目的地是 in-process mock ADT 服务器(127.0.0.1),可零配置演练;它始终按预设的只读基线执行。
运行模式
| 模式 | 策略 | 说明 |
|---|---|---|
| 只读 | allowedPackages 哨兵值、allowTransportableEdits=false、allowExecution=false、allowDebugger=false;enableTransports=true(仅用于读传输请求/版本) |
安全基线:可搜索/读源码/读传输请求与版本/数据预览,写与激活全部拒绝 |
| 调试 | 只读 + allowExecution=true + allowDebugger=true |
额外允许执行触发断点、断点/单步/变量/栈;写与传输修改仍关闭 |
| 更改 | allowTransportableEdits=true、enableTransports=true、allowExecution=true、allowDebugger=true、白名单 |
写前 diff、传输请求纪律 |
说明:abap-adt 的
enableTransports会把整个 transport 工具族(adt_transports、adt_object_versions、adt_cochange)一起关掉——这些在 0.12.2 里都是只读工具,所以只读/调试模式保持enableTransports=true,真正拦写的是allowedPackages哨兵值 +allowTransportableEdits=false。
- 模式切换只在设置页,会话里不提供开关(安全);
- 只读/调试下白名单不生效但会保留,切回更改时复用;
- 白名单存在
<workspace>/.dsh-abap-adt/ui-settings.json(本插件私有,abap-adt 不会读取)。
显示名(中文)
- 每个目的地可设置显示名(如「广东开发」),只影响界面展示;工具调用仍使用稳定的「标识」(
name); - 显示名存在
ui-settings.json的labels里,不影响 abap-adt 的 schema; - 改名(标识)时默认目的地下拉会自动跟随,不会出现
defaultDestination ... is not a destination name; - 会话状态徽章、目的地表格、默认目的地选择都会显示「显示名(标识)」。
预设内建规则(来自 2026-10 实战复盘)
预设 persona 已内建以下纪律(细节来自内部复盘文档,未随仓库发布):
- 动手前澄清:交付几个对象(多表/多实体不得自行合并)、是否沿用参考程序结构(include 拆分)、包名与传输号、哪些必须由用户在 GUI 完成(GUI 状态、文本元素、SMW0、SE41)。
- 写前决策闸门:凡是为绕开工具/系统限制而改变形态或既有约定的动作,先停下请示并给 2–3 个方案与代价,由用户决策;纯机械的编译器对齐可直接做但须报告。
- 工具能力边界:
adt_batch404、adt_where_used405、adt_searchquickSearchSource 不支持、INCL不能新建、FUNC可能建出函数组、DDIC 写能力可能不可用、adt_object_read可能只回摘要(改用adt_export_objects)、GUI 状态/文本元素/SMW0 无工具。 - 传输纪律:写对象时
transport传父请求号(传任务号会报“已在请求中锁定”);对象常挂在任务号,先E070(K=请求/S=任务,D=开放/R=已释放)再E071;容器与成员可能在不同请求;adt_unlock_all不管传输占用。 - 验证阶梯(禁止跳步):
adt_check → adt_activate(相关对象一次传齐)→ adt_version_diff → TRDIR-SUBC → adt_run_atc → 报告;adt_checkPASSED ≠ 可激活;工具成功文案 ≠ 落地成功(DDIC 看AS4LOCAL,源码导出比对)。 - DDIC 走“Agent 出规格 + 人工 SE11”:探针优先(
$TMP一次性对象,验完即删),失败最多两轮。 adt_data_preview硬约束:SQL ≤255 字符(IN 拆包)、列名先查、OR+LIKE/COUNT/GROUP BY 可能被拒、并行查询偶发 400。
安全
- 只读 ≠ 无害:仍能读取 SAP 源码与业务数据,建议连开发/测试系统 + 最小权限账号;
- 「更改」模式是真实可写:
Z*/$TMP(或你的白名单)可编辑/激活/执行/调试;传输释放没有工具,仍由人在 SE10 执行; - 首次接入建议先把模式保持「只读」,验证完再切换。
目录结构
cordis.patch.yml # bundle patch:插入 preset-abap-adt(预设)+ abap-adt-ui(本插件 Host 半)
index.js # Host 半:HTTP 接口 /abap-adt/{state,save,mode,default,ping},读写工作区配置
client.js # Client 半:设置页(目的地/模式/白名单/连接测试)+ 会话状态徽章
locale/{zh,en}.json# 插件显示名与描述
icon.svg # 插件图标
package.json # dsh.bundle / dsh.client 声明;依赖 @nefevcore/abap-adt-dsh-plugin
- 预设里的
abap-adt行引用依赖包@nefevcore/abap-adt-dsh-plugin(安装本插件时由 pnpm 拉取); - 运行模式通过写入工作区策略生效,预设本身只带只读安全基线;
index.js只用 Node 内置模块,无需额外依赖。
开发
node --check index.js
node --check client.js
修改 cordis.patch.yml 后重启 DSH(bundle patch 在启动时应用)。若改了依赖版本,更新 package.json 后重新安装本 bundle。
License
MIT。ADT 工具本体版权归 @nefevcore/abap-adt-dsh-plugin 作者(MIT)。
Languages
JavaScript
100%