Files
dsh-abap-workbench/README.md
T

149 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`);
- 选择运行模式(默认只读),需要写时切到「更改」并配置白名单。
---
## 使用
### 目的地与凭据
- 目的地配置写在**工作区** `<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)。