# 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`](https://www.npmjs.com/package/@nefevcore/abap-adt-dsh-plugin)(MIT),本插件只负责预设、策略、配置页与状态条。 --- ## 安装(在另一台 DSH 上) 前提:DSH ≥ `0.2.1-rc.2`、`pnpm` 在 PATH 上、已配置好 DSH 的模型与凭据。 ### 方式一:从 Git 仓库安装(推荐) ```bash # 1. 克隆到任意工作目录 git clone https://www.heyoung.top/QQ597901027/dsh-abap-workbench.git cd dsh-abap-workbench ``` 然后二选一: - **命令行**(DSH 已提供 plugin 子命令,转发给 profile 的 pnpm): ```bash 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`: ```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`); - 选择运行模式(默认只读),需要写时切到「更改」并配置白名单。 --- ## 使用 ### 目的地与凭据 - 目的地配置写在**工作区** `/.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`。 - 模式切换**只在设置页**,会话里不提供开关(安全); - 只读/调试下白名单不生效但会保留,切回更改时复用; - 白名单存在 `/.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 内置模块,无需额外依赖。 ## 开发 ```bash 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](https://github.com/nefevcore/dsh-adt) 作者(MIT)。