168 lines
10 KiB
Markdown
168 lines
10 KiB
Markdown
# 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 上正在使用的原生模块被占用),再启动。
|
||
|
||
### 方式三:DSH 桌面版(Electron)
|
||
|
||
桌面版也是 DSH,插件机制相同,但 profile 名是**保留的 `desktop`**,且由桌面应用自己管理。要点:
|
||
|
||
1. **前提版本**:桌面版需基于 DSH **≥ 0.2.1-rc.2**(本插件 `dsh.engines.dsh` 的要求;0.1.x 不支持预设声明行机制)。
|
||
2. **安装入口**:用**桌面版自带的插件管理界面**(设置 → 插件 / Plugin Manager)安装本仓库目录作为 bundle;
|
||
```text
|
||
install_bundle target = <本仓库克隆目录的绝对路径>
|
||
```
|
||
或安装一个可解析的包 / Git 仓库地址。
|
||
⚠️ 不要用 npm 全局安装的 `dsh` CLI 去管 `desktop` profile——CLI 会拒绝桌面版 profile 的启动与插件管理请求,必须使用桌面安装自带的命令运行时。
|
||
3. **依赖**:`@nefevcore/abap-adt-dsh-plugin` 会随包安装;桌面版的插件操作会使用其安装的包管理器(需能访问 npm registry)。
|
||
4. **重启桌面应用** → 新建会话选「ABAP 工作台」→ 设置 → ABAP ADT 配置目的地/模式(用法与 Web 版一致)。
|
||
5. **已知差异/注意**:
|
||
- 桌面版的 Web UI 同样加载本插件的 Client 半(设置页「ABAP ADT」+ 会话状态徽章),但 `dsh.client` 支持取决于桌面版是否加载第三方 client 插件;若设置页没有出现 ABAP ADT,先确认桌面版版本与插件是否真的激活。
|
||
- 内置 mock `demo` 会在 `127.0.0.1` 随机端口监听,桌面版可能弹一次防火墙提示(仅本机回环,放行即可/拒绝也不影响真实 SAP 目的地)。
|
||
- 工作区是普通目录,目的地/模式配置仍写在工作区 `.dsh-abap-adt/`,与 Web 版一致。
|
||
- Host 半只用 Node 内置模块;`@nefevcore` core 通过扫描 `~/.dsh/profiles/*` 定位,桌面版 profile 在 `~/.dsh/profiles/desktop` 下同样适用。
|
||
|
||
### 安装后
|
||
|
||
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 内置模块,无需额外依赖。
|
||
|
||
## 开发
|
||
|
||
```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)。
|