Files
dsh-abap-workbench/README.md
T

8.5 KiB
Raw Blame History

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):
    dsh plugin --profile web add file:$(pwd)
    
    再把包名加入 profile 的 dsh.profile.bundles(见下方“手工登记”),或直接用方式二让 Plugin Manager 完成登记。
  • Plugin Manager(推荐):把本仓库目录作为 bundle 安装:
    plugin_manager { action: "install_bundle", target: "<本仓库绝对路径>" }
    
    它会完成 pnpm 安装 + bundle 登记;安装完成后重启 DSH。

方式二:从 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 上正在使用的原生模块被占用),再启动。

安装后

  1. 重启 DSH;
  2. 新建会话 → 预设选择器里选 “ABAP 工作台”;
  3. 打开 设置 → ABAP ADT:
    • 填工作区与目的地(URL / client / 语言 / 用户名 / passwordEnv);
    • 密码不要写明文:在 DSH 凭据库或环境变量里放 ADT_DEV_PASSWORD 之类的引用名;
    • 点「测试连接」确认 ADT 服务可达(需在 SAP 侧 SICF 激活 /sap/bc/adt);
    • 选择运行模式(默认只读),需要写时切到「更改」并配置白名单。

使用

目的地与凭据

  • 目的地配置写在工作区 <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 已内建以下纪律(细节来自内部复盘文档,未随仓库发布):

  1. 动手前澄清:交付几个对象(多表/多实体不得自行合并)、是否沿用参考程序结构(include 拆分)、包名与传输号、哪些必须由用户在 GUI 完成(GUI 状态、文本元素、SMW0、SE41)。
  2. 写前决策闸门:凡是为绕开工具/系统限制而改变形态或既有约定的动作,先停下请示并给 2–3 个方案与代价,由用户决策;纯机械的编译器对齐可直接做但须报告。
  3. 工具能力边界:adt_batch 404、adt_where_used 405、adt_search quickSearchSource 不支持、INCL 不能新建、FUNC 可能建出函数组、DDIC 写能力可能不可用、adt_object_read 可能只回摘要(改用 adt_export_objects)、GUI 状态/文本元素/SMW0 无工具。
  4. 传输纪律:写对象时 transport 传父请求号(传任务号会报“已在请求中锁定”);对象常挂在任务号,先 E070(K=请求/S=任务,D=开放/R=已释放)再 E071;容器与成员可能在不同请求;adt_unlock_all 不管传输占用。
  5. 验证阶梯(禁止跳步):adt_check → adt_activate(相关对象一次传齐)→ adt_version_diff → TRDIR-SUBC → adt_run_atc → 报告;adt_check PASSED ≠ 可激活;工具成功文案 ≠ 落地成功(DDIC 看 AS4LOCAL,源码导出比对)。
  6. DDIC 走“Agent 出规格 + 人工 SE11”:探针优先($TMP 一次性对象,验完即删),失败最多两轮。
  7. 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)。