sapbuddy-dsh 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +34 -122
  3. package/defaults/AGENTS.md +114 -114
  4. package/defaults/connections.example.json +21 -21
  5. package/defaults/prompts/Memory.md +21 -21
  6. package/defaults/prompts/SYSTEM.md +110 -110
  7. package/defaults/settings.example.json +3 -3
  8. package/dist/sap-tools/adtManager.d.ts +11 -1
  9. package/dist/sap-tools/adtManager.js +176 -9
  10. package/dist/sap-tools/connections-store.js +4 -1
  11. package/dist/sap-tools/execution.js +1 -1
  12. package/dist/sap-tools/tools/activationResult.d.ts +4 -2
  13. package/dist/sap-tools/tools/activationResult.js +33 -4
  14. package/dist/sap-tools/tools/writeTools.js +11 -9
  15. package/dist/tools.js +5 -3
  16. package/package.json +5 -5
  17. package/skills/abap-code-review/SKILL.md +75 -75
  18. package/skills/abap-code-review/assets/report-template.html +142 -142
  19. package/skills/abap-code-review/references/checklist.md +114 -114
  20. package/skills/abap-explain/SKILL.md +126 -126
  21. package/skills/abap-templates/SKILL.md +764 -764
  22. package/skills/abap-wiki/SKILL.md +104 -104
  23. package/skills/clean-abap/SKILL.md +91 -91
  24. package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
  25. package/skills/dev-write/SKILL.md +137 -137
  26. package/skills/sap-abap-skills/README.md +205 -205
  27. package/skills/sap-abap-skills/SKILL.md +498 -498
  28. package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
  29. package/skills/sap-abap-skills/references/abap-sql.md +588 -588
  30. package/skills/sap-abap-skills/references/amdp.md +279 -279
  31. package/skills/sap-abap-skills/references/authorization.md +149 -149
  32. package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
  33. package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
  34. package/skills/sap-abap-skills/references/cds-views.md +412 -412
  35. package/skills/sap-abap-skills/references/cloud-development.md +299 -299
  36. package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
  37. package/skills/sap-abap-skills/references/date-time.md +415 -415
  38. package/skills/sap-abap-skills/references/design-patterns.md +292 -292
  39. package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
  40. package/skills/sap-abap-skills/references/exceptions.md +432 -432
  41. package/skills/sap-abap-skills/references/generative-ai.md +180 -180
  42. package/skills/sap-abap-skills/references/internal-tables.md +578 -578
  43. package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
  44. package/skills/sap-abap-skills/references/object-orientation.md +518 -518
  45. package/skills/sap-abap-skills/references/performance.md +428 -428
  46. package/skills/sap-abap-skills/references/program-flow.md +302 -302
  47. package/skills/sap-abap-skills/references/rap-eml.md +549 -549
  48. package/skills/sap-abap-skills/references/released-classes.md +308 -308
  49. package/skills/sap-abap-skills/references/sap-luw.md +203 -203
  50. package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
  51. package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
  52. package/skills/sap-abap-skills/references/string-processing.md +488 -488
  53. package/skills/sap-abap-skills/references/table-grouping.md +150 -150
  54. package/skills/sap-abap-skills/references/tool-guide.md +285 -285
  55. package/skills/sap-abap-skills/references/unit-testing.md +512 -512
  56. package/skills/sap-abap-skills/references/where-conditions.md +223 -223
  57. package/skills/sap-abap-skills/references/xml-json.md +315 -315
  58. package/skills/translate-workflow/SKILL.md +69 -69
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 SapBuddy Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SapBuddy Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,162 +1,74 @@
1
1
  # sapbuddy-dsh
2
2
 
3
- [SapBuddy](https://github.com/gxx950224/sapbuddy) 的 **DeepSeek Harness(DSH)** 底座:
4
- **41 个 SAP ABAP 工具 + 8 个 ABAP 技能 + agent preset `sapbuddy` + 三层写门禁 + 连接设置页**。
3
+ [![npm](https://img.shields.io/npm/v/sapbuddy-dsh)](https://www.npmjs.com/package/sapbuddy-dsh) [GitHub](https://github.com/gxx950224/sapbuddy-dsh)
5
4
 
6
- 面向 **DSH 0.2.0-rc.2**,需要 Node >= 22。**一个包名装完全部。**
7
-
8
- ---
5
+ [SapBuddy](https://github.com/gxx950224/sapbuddy) 的 DeepSeek Harness 插件,提供 41 个 SAP ABAP 工具、8 个技能、SapBuddy agent preset 和 SAP 连接设置页。
9
6
 
10
7
  ## 安装
11
8
 
12
- 在 DSH 的 **插件 → 添加插件** 对话框里填:
13
-
14
- ```
15
- sapbuddy-dsh
16
- ```
17
-
18
- 或命令行:
19
-
20
- ```bash
21
- dsh plugin --profile <profile> add sapbuddy-dsh
22
- ```
23
-
24
- **装完必须完整重启 DSH**(托盘退出,不是关窗口)——插件代码在宿主启动时加载。
25
- 重启后新建会话时选择 **SapBuddy** preset,并在 **设置 → SAP 连接** 里新建 SAP 连接。
26
-
27
- ### ⚠️ 手工安装前必须配好构建放行
28
-
29
- 依赖链里有个遥测包会注册构建脚本:
30
-
31
- ```
32
- sapbuddy-dsh → abap-adt-api → io-ts-reporters → @scarf/scarf(遥测,无需构建)
33
- ```
34
-
35
- pnpm 11 把「存在未批准的构建脚本」当**错误**(`ERR_PNPM_IGNORED_BUILDS`,退出码 1)。
36
- 而 **`dsh plugin add` 在 pnpm 失败后不会再注册 bundle** —— 包进了 `node_modules`,
37
- `dsh.profile.bundles` 却没更新,于是 **preset 永远不出现,且没有任何明显报错**。
9
+ 需要 Node.js 22+ 和兼容的 DSH;具体宿主依赖要求见 package.json 的 peerDependencies。
10
+ 在 DSH 的插件管理页添加:
38
11
 
39
- 在目标 profile 的 `pnpm-workspace.yaml` 里放行:
40
-
41
- ```yaml
42
- allowBuilds:
43
- '@scarf/scarf': false
12
+ ```text
13
+ sapbuddy-dsh@0.0.7
44
14
  ```
45
15
 
46
- 或在仓库里跑安装器(会自动做这一步):
16
+ 也可以通过 DSH 命令行安装:
47
17
 
48
18
  ```bash
49
- node scripts/install.mjs --profile desktop
19
+ dsh plugin --profile desktop add sapbuddy-dsh@0.0.7
50
20
  ```
51
21
 
52
- > 包自身声明 `pnpm.ignoredBuiltDependencies` **不足以**覆盖三级传递依赖(已实测),
53
- > 必须在安装侧声明。
54
-
55
- ### 这个包往 profile 里插两条行
56
-
57
- | 行 | 作用 |
58
- |---|---|
59
- | `sapbuddy-dsh`(顶层) | 设置页的 HTTP 路由,并让客户端页面被加载 |
60
- | preset 内的 `sapbuddy-dsh/tools` | 41 个工具 + 写门禁 + 提示词注入 |
61
-
62
- 两条都必须存在,写法也受 DSH 约束(`dsh-client-modules` 只扫描**顶层**行、
63
- 且只认**精确包名**)。这也是包的主入口是设置页、工具走子路径的原因。
64
- 详见仓库 README 的「为什么只有一个包」。
22
+ 更新已安装插件后,完整退出并重新启动 DSH,再新建会话选择 **SapBuddy**。
23
+ 在 **设置 → SAP 连接** 中配置连接。请只安装裸包名 `sapbuddy-dsh`,避免与同功能的作用域包或拆分插件同时启用。
65
24
 
66
- ---
25
+ 依赖 `@scarf/scarf` 的遥测脚本不影响 SAP 功能。如果包管理器提示未批准构建脚本,可通过宿主提供的依赖脚本管理禁用该遥测脚本,再重试安装。
67
26
 
68
- ## 首次运行会落盘什么
69
-
70
- 插件加载时把包内 `defaults/` 中**缺失**的文件补写到配置根
71
- (`<DSH_HOME|~/.dsh>/.agent-presets/sapbuddy/`),并创建 `prompts/ logs/ output/ uploads/`:
72
-
73
- ```
74
- prompts/SYSTEM.md # 铁律与输出约定(每次会话实时注入)
75
- prompts/Memory.md # 避坑记录,随会话累积
76
- AGENTS.md # 项目开发指南
77
- connections.example.json # 连接配置示例(参考用)
78
- settings.example.json
79
- ```
27
+ ## 激活结果核对
80
28
 
81
- **仅补缺,绝不覆盖**——`Memory.md` 是累积数据,用户改过的 `SYSTEM.md` / `AGENTS.md` 同理。
82
- 配置根可用环境变量 `SAPBUDDY_HOME` 覆盖。
29
+ `abap_activate` 先检查待激活源码的语法,执行激活后读取 active 源码进行核对;激活阶段返回错误或抛异常时也会继续核对。
83
30
 
84
- 本包**不创建 `connections.json`**:那是用户数据(含凭据),请在
85
- 「设置 → SAP 连接」中新建,或参照 `connections.example.json` 手工创建。
86
- 密码在设置页的响应中脱敏为 `***`。
31
+ 例如 INCLUDE 阶段报错,后续主程序实际已经激活:只有 active 源码与激活前快照一致,并且实时未激活清单中没有目标、直接引用的 INCLUDE 或激活响应中报告的未激活对象时,才确认成功并清零该对象的连续失败计数。原始阶段诊断保留,本次不再登记为审计失败。
87
32
 
88
- ---
33
+ 源码不一致、相关对象仍未激活或核对查询失败时,继续保留失败。对象元数据中的 `active` 字段不能单独证明本次修改已生效。非源码对象沿用其激活接口结果。
89
34
 
90
- ## 写门禁
35
+ ## 连接切换与会话自愈
91
36
 
92
- 写操作受三层约束,任一层都能单独拒绝:
37
+ 切换或保存 SAP 连接后,插件会立刻作废进程内池化的 ADT 客户端,下一次调用按新配置重新登录,不会带着上一个系统的 cookie 与 CSRF 令牌去读写当前系统。
93
38
 
94
- 1. **连接级只读** —— 连接未声明 `security.readOnly: false` 即拒写(连接级优先、顶层兜底,
95
- 读取失败 fail-closed)。连接级判定不会被"不传 `connectionId`"绕过,所以可以做到
96
- 开发系统可写、QAS/生产锁死。
97
- 2. **开发客户端守卫** —— 读 `T000.CCCATEGORY`,默认只放行 `C`(定制/客户开发);
98
- 查不到时 fail-closed。生产系统(`P`)即使关掉只读也写不进去。
99
- 3. **人工确认** —— 需用户批准(确认词须位于句首;窗口默认 15 分钟,见配置根
100
- `settings.json` 的 `approvalWindowMinutes`)。
39
+ 写操作(编辑、激活、DDIC、传输等)在进入独占写序列前会刷新会话:会话超过 5 分钟没有被确认可用就先重新登录(清空 cookie、换一份新的 CSRF 令牌)。原因是 ABAP 侧的会话空闲超时会让旧令牌失效,而 ADT 客户端 SDK 只在无状态(stateless)请求上自动重登录——有状态写请求不会,于是会出现"读源码正常、每次写都报 `CSRF 令牌验证失败`"的僵局。
101
40
 
102
- 另有内容级硬校验:写入含用户可见中文字面量的代码会被拒(须走消息类 / 文本元素)。
103
- 命名空间强制:只写 `Z*`/`Y*`,SAP 标准对象只读。
41
+ 如果写请求仍然收到 CSRF 或会话失效错误(例如 ABAP 侧刚重启),插件会丢弃该会话、重建连接并整体重试一次。CSRF 校验失败的请求在 SAP 侧不会执行,因此重试不会造成重复写入。上述恢复对工具层透明,不需要重启 DSH,也不需要重新切换连接。
104
42
 
105
- ---
43
+ ## 工具与技能
106
44
 
107
- ## 工具清单
45
+ 工具涵盖对象搜索与读码、代码导航、语法诊断与激活、ATC 与单元测试、SQL 查询、DDIC、文本池、屏幕文本、消息类、函数模块接口和传输请求。
108
46
 
109
- 41 个工具覆盖:对象搜索 / 读码 / 代码定位、ADT 文档、ATC 检查、单元测试、SQL 查询、
110
- DDIC(域 / 数据元素 / 结构 / 表)、文本池与文本元素、屏幕文字、消息类、函数模块接口、
111
- 传输请求、激活与语法诊断、Mermaid 校验等。
47
+ 技能包括 `abap-code-review`、`abap-explain`、`abap-templates`、`abap-wiki`、`clean-abap`、`dev-write`、`sap-abap-skills`、`translate-workflow`。
112
48
 
113
- 8 个技能:`abap-code-review`、`abap-explain`、`abap-templates`、`abap-wiki`、
114
- `clean-abap`、`dev-write`、`sap-abap-skills`、`translate-workflow`。
49
+ ## 配置和写入保护
115
50
 
116
- 完整清单见技能 `sap-abap-skills/references/tool-guide.md`(场景 → 工具 → 传参示例)。
51
+ 首次加载时,插件会在 `<DSH_HOME|~/.dsh>/.agent-presets/sapbuddy/` 补充缺失的默认提示词与示例配置;也可用 `SAPBUDDY_HOME` 指定位置。已有连接、Memory 和自定义提示词不会被覆盖。连接凭据通过 SAP 连接设置页管理,不应提交到 Git。
117
52
 
118
- ---
53
+ 写操作受连接级只读、开发客户端检查、Z/Y 命名空间及人工授权约束。中文文案采用维护建议,不再按源码中的中文字符统一阻断。
119
54
 
120
- ## 导出
55
+ 插件包含顶层设置入口 `sapbuddy-dsh` 和 preset 内工具入口 `sapbuddy-dsh/tools`;使用插件管理器安装以同时登记 bundle 和 preset。
121
56
 
122
- | 子路径 | 内容 |
123
- |---|---|
124
- | `sapbuddy-dsh`(主入口) | 顶层插件:设置页的 `webServer` 路由 |
125
- | `sapbuddy-dsh/tools` | preset 内插件:41 工具注册 + 写门禁 + 提示词注入 |
126
- | `sapbuddy-dsh/client` | 设置页浏览器端 bundle(`dsh.client`) |
57
+ ## 开发与验证
127
58
 
128
- ---
59
+ 仓库中的 `packages/sapbuddy-dsh` 是可发布的统一插件,包含已构建运行代码、类型声明、默认提示词和技能。维护此目录时直接验证运行代码;这里不提供重建该统一包的 TypeScript 开发树。
129
60
 
130
- ## 开发
61
+ 从 GitHub 克隆仓库后,在 `packages/sapbuddy-dsh` 下运行激活回归测试(需要 Node.js 24+,无需连接 SAP):
131
62
 
132
63
  ```bash
133
- pnpm install
134
- pnpm --filter sapbuddy-dsh build # clean + tsc + esbuild → dist/
135
- pnpm --filter sapbuddy-dsh test # 172 用例
64
+ npm test # = test:activation + test:session + test:store
65
+ npm pack --dry-run --ignore-scripts
136
66
  ```
137
67
 
138
- 技能与默认提示词分别在 `skills/` 与 `defaults/`,两者都随包发布——改动后请跑一次
139
- `npm pack --dry-run` 确认内容仍在(`README.md` 与 `LICENSE` 是 npm 自动收录的)。
140
-
141
- ---
142
-
143
- ## 链接
144
-
145
- - 仓库与完整文档:<https://github.com/gxx950224/sapbuddy-dsh>
146
- - 上游 CLI / Web 版(pi 引擎):<https://github.com/gxx950224/sapbuddy>
147
- - 问题反馈:<https://github.com/gxx950224/sapbuddy-dsh/issues>
148
-
149
- > 注意区分:npm 上的 `sapbuddy` 是上游 CLI 版;本包 `sapbuddy-dsh` 是 DSH 底座版。
150
- > 旧的 `sapbuddy-tools` / `sapbuddy-settings` / `sapbuddy-settings-ui` 已合并进本包并弃用。
68
+ `test:activation` 覆盖激活结果核对的误报恢复、失败计数、审计记录和核对失败边界;`test:session` 覆盖写前会话刷新、CSRF 失效自动重建,以及"已落库则绝不重试"的边界;`test:store` 用真实模块验证设置页保存/切换/删除连接确实会作废连接池。测试都使用模拟 SAP 响应,不能替代真实 SAP 联机验收。
151
69
 
152
70
  ## 许可证
153
71
 
154
- MIT。工具实现同步自上游 [gxx950224/sapbuddy](https://github.com/gxx950224/sapbuddy)。
155
-
156
- ## 0.0.4
157
-
158
- 本版本基于已构建产物修改发布。取消 ABAP 源码硬编码中文的写入阻断;修复 Web 原生审批获批后未开启默认 15 分钟授权窗口的问题,写入与激活共用窗口。中文文案改为维护建议,其他连接与对象保护保持生效。
159
-
160
- ## 0.0.5
72
+ MIT。工具实现来自 [SapBuddy](https://github.com/gxx950224/sapbuddy)。
161
73
 
162
- 本版本基于已构建产物修改发布。修复 0.0.4 的 preset `persona.suffix` 引用未注册提示词变量 `{{cwd}}`、导致 DSH 新版本在提示词装配阶段(模型请求之前)整轮失败的问题:移除该后缀,工作目录由运行时上下文提供。其余内容与 0.0.4 一致。
74
+ [![](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
@@ -1,114 +1,114 @@
1
- # AGENTS.md — sapbuddy-dsh 项目指南(面向 AI 编码代理与贡献者)
2
-
3
- > 原始版(pi 时代,面向 SapBuddy 原仓库)已归档 `docs/original-prompts/AGENTS.md`;
4
- > 本文件为 DSH 底座版的适配版,描述本仓库架构与安全规则的**代码位置映射**。
5
- > 随 sapbuddy preset 每次会话注入上下文,保证 AI 编码代理遵循同一套强控规则。
6
-
7
- ## 项目简介
8
-
9
- SapBuddy × DeepSeek Harness:SAP ABAP AI 全能助手,面向开发顾问与业务顾问。
10
- 以 **DSH(Cordis 工具插件 + agent preset)** 为运行时,41 个 SAP 工具 + 技能 + 写门禁
11
- 以 `sapbuddy-dsh` 插件形态嵌入 DSH;Web GUI(选 preset)+ headless 单次问答双模式。
12
-
13
- ## 核心架构
14
-
15
- ```
16
- packages/sapbuddy-dsh/ # 41 个 SAP 工具插件(纯 TS,zod schema + execute)
17
- ├── src/index.ts # 入口:首次运行 seed → ctx.tools.register(41 工具)+ 写门禁 + 提示词注入
18
- ├── src/sap-tools/
19
- │ ├── tools/*.ts # 工具实现(按主题分组,tools/index.ts 汇总注册)
20
- │ ├── adtManager.ts # SAP 连接池(basic/OAuth2)+ assertDevClient 开发客户端守卫
21
- │ ├── config.ts # 连接配置加载 + resolveReadOnly(连接级只读唯一出处)
22
- │ ├── sapbuddy-home.ts # 配置根解析 + ensureSapbuddyHome(首次运行 seed-if-absent)
23
- │ ├── connections-store.ts # 连接配置存储(导出 ./store,设置页复用)
24
- │ ├── code-policy.ts # 代码规则扫描(scanCodeIssues / validateSourceMode)
25
- │ ├── register.ts # 纯逻辑:授权窗口 / namespaceViolation / isReadOnly
26
- │ ├── gate.ts # 写门禁三层(guard → pre-execute ask → 确认词窗口)
27
- │ ├── auditLog.ts # 写操作审计
28
- │ └── prompt-files.ts # 提示词注入(SYSTEM.md / AGENTS.md / Memory.md)
29
- ├── skills/ # 8 个 ABAP 技能(随包分发,preset 经 createRequire 解析)
30
- ├── defaults/ # 首次运行 seed 到 preset 目录的默认文件(绝不覆盖已有)
31
- └── cordis.patch.yml # dsh.bundle.patch:preset-sapbuddy 行(preset 唯一注册途径)
32
- scripts/install.mjs # 安装器(校验 dsh.bundle.patch + dsh plugin add)
33
- ```
34
-
35
- - **注册**:DSH 原生 `ctx.tools.register(defineTool(...))`(index.ts),不依赖任何 MCP 框架;
36
- - **preset 注册**:0.2.0-rc.2 **不扫描** `~/.dsh/.agent-presets/`。preset 是 `cordis.patch.yml`
37
- 里的一条 `@deepseek-ai/dsh-agent-preset` 行,靠 `package.json` 的 `dsh.bundle.patch` 生效。
38
- 没有 `dsh.bundle` 的包会被 `dsh plugin add` 装成普通依赖,配置一行都不生效。
39
- - **提示词注入**:`prompt-files.ts` 把配置根里的 `prompts/SYSTEM.md`、`AGENTS.md`、
40
- `prompts/Memory.md` 注册为 systemPrompt section,**每次会话组装时实时读取文件**,
41
- Memory.md 即改即生效(避坑沉淀随会话累积)。这些文件由 `ensureSapbuddyHome()` 在插件
42
- 加载时从包内 `defaults/` **仅补缺**落盘——覆盖会抹掉用户的 Memory.md 与自定义提示词。
43
-
44
- ## 安全拦截层(★ 代码级强制,不依赖 LLM 自觉)
45
-
46
- ```
47
- 写工具调用
48
- │
49
- ├─ ① gate.ts guard(同步硬规则,所有工具)
50
- │ ├─ wikiWriteViolation → mcp__abap_wiki__ 写工具一律硬拦截(知识库只读)
51
- │ ├─ configPathViolation → 敏感配置目录/文件名禁止 AI 读写(output/skills/prompts/uploads 子树除外)
52
- │ ├─ 只读模式 → 连接级 readOnly 优先、顶层兜底(resolveReadOnly)
53
- │ ├─ 连接变更 → 连接配置被改后必须先 get_connected_systems
54
- │ └─ namespaceViolation → 只写 Z*/Y*(函数组内部程序按所属函数组判断)
55
- │
56
- ├─ ② tools/pre-execute ask 门 → 写工具且窗口未开 → {kind:'ask'}(Web 审批浮层,fail-closed)
57
- │
58
- ├─ ③ agent/inbox/claimed → 用户确认词/拒绝词 → 授权窗口(headless/CLI 回退)
59
- │
60
- └─ ④ index.ts execute 路径(每个写工具,纵深防御)
61
- ├─ isConnectionDirty → 连接变更强制重确认
62
- ├─ scanCodeIssues → 自建结构字段裸内置类型仅提示
63
- └─ assertDevClient → 非开发客户端(T000.CCCATEGORY 非 C)拒绝写
64
- ```
65
-
66
- **规则唯一出处**:gate.ts / register.ts / index.ts;设置页(sapbuddy-dsh)与 preset 只做挂载,不重复实现 → 行为一致。
67
-
68
- ## 开发命令
69
-
70
- ```bash
71
- pnpm install # 安装依赖
72
- pnpm -r build # 编译三个包(tsc/esbuild → dist/,build 前清空 dist)
73
- pnpm -r test # sapbuddy-dsh:172 用例(门禁/转换器/插件加载/连接存储)
74
- node scripts/install.mjs --profile desktop --from-source # link: 装到本地 profile
75
- node scripts/install.mjs --profile desktop --dry-run # 预览命令
76
- ```
77
-
78
- ## 代码规范
79
-
80
- - 工具代码(TS):严格模式、NodeNext、无分号、双引号(见 tsconfig.json)
81
- - 新增 SAP 工具:在 `packages/sapbuddy-dsh/src/sap-tools/tools/` 新建文件,导出
82
- `{ name, title, description, inputSchema(zod), execute() }`,并在 `tools/index.ts` 注册;
83
- 写操作必须标记 `write: true`
84
- - 工具遵循"读优先、写需显式授权";提示词/技能文件改动遵守 `docs/original-prompts/` 归档口径
85
-
86
- ### 强制规则 → 代码位置映射
87
-
88
- | 规则 | 位置 | 层 |
89
- |---|---|---|
90
- | 写工具名单 / 授权窗口 / 只读模式 / 命名空间 | `register.ts`(isWriteTool/handleUserMessage/isReadOnly/namespaceViolation)+ `gate.ts` decideWriteApproval | 硬强制 |
91
- | 写操作拦截(确认/知识库只读/配置保护) | `gate.ts` installWriteGate(guard + pre-execute + inbox) | 硬强制 |
92
- | abap_wiki 知识库写工具拦截(`mcp__abap_wiki__*`,一律硬拦、不可放行) | `gate.ts` wikiWriteViolation | 硬强制 |
93
- | 敏感配置禁止 AI 读写(connections/auth/settings/models;bash 命令含敏感路径/文件名也拦;preset 目录 output/skills/sessions/prompts/uploads 子树除外) | `gate.ts` configPathViolation | 硬强制 |
94
- | 代码规则扫描(自建表结构字段裸内置类型仅提示;程序内局部变量放行) | `code-policy.ts` scanCodeIssues + `index.ts` execute | 裸类型非阻断;中文按规范建议处理 |
95
- | 开发客户端守卫(T000 类别) | `adtManager.ts` assertDevClient + `index.ts` execute | 硬强制 |
96
- | 创建:包名/描述必填、$TMP 提示、requestText 建请求 | `tools/writeTools.ts` create_object_programmatically | 硬强制 |
97
- | 修改:自动沿用/创建请求、请求描述格式 | `tools/writeTools.ts` replace_string_in_abap_object | 硬强制 |
98
- | 传输请求:状态码中文、底表 E070/E071、只读放行 | `tools/transportText.ts` manage_transport_requests | 硬强制 |
99
- | 创建/修改流程、避坑记录(Memory.md)、请求描述格式(行为层) | 配置根 `prompts/SYSTEM.md` 铁律 6b / 输出约定 | 提示层(AI 执行,工具已兜底) |
100
-
101
- ## 安全
102
-
103
- - `connections.json`(SAP 凭据)不入库、不提交;由设置页或用户写入 `~/.dsh/.agent-presets/sapbuddy/`
104
- - **默认只读**:只读判定为**连接级优先、顶层兜底**(`resolveReadOnly`)——连接声明 `security.readOnly`
105
- 则以它为准,未声明则继承顶层 `security.readOnly`,两者都缺失即为只读(fail-closed)。
106
- 连接级判定不会被"不传 connectionId"绕过:省略时按 active → 第一个 解析生效连接。
107
- - 写操作另有双层保护:**人工确认**(拦截 → 用户批准/输入"确认"放行)+ **开发客户端守卫**(非 C 类拒绝)
108
- - MCP 服务器配置由用户在 DSH 内置 dsh-mcp-client 管理(profile patch),仓库不提供程序化写配置
109
-
110
- ## 提交
111
-
112
- - 提交前 `pnpm -r build` 确保编译通过;`pnpm -r test` 全绿
113
- - 不提交:`node_modules/`、`dist/`、`connections.json`、`.DS_Store`、`output/`、日志
114
- - 提交信息简洁中文或英文均可
1
+ # AGENTS.md — sapbuddy-dsh 项目指南(面向 AI 编码代理与贡献者)
2
+
3
+ > 原始版(pi 时代,面向 SapBuddy 原仓库)已归档 `docs/original-prompts/AGENTS.md`;
4
+ > 本文件为 DSH 底座版的适配版,描述本仓库架构与安全规则的**代码位置映射**。
5
+ > 随 sapbuddy preset 每次会话注入上下文,保证 AI 编码代理遵循同一套强控规则。
6
+
7
+ ## 项目简介
8
+
9
+ SapBuddy × DeepSeek Harness:SAP ABAP AI 全能助手,面向开发顾问与业务顾问。
10
+ 以 **DSH(Cordis 工具插件 + agent preset)** 为运行时,41 个 SAP 工具 + 技能 + 写门禁
11
+ 以 `sapbuddy-dsh` 插件形态嵌入 DSH;Web GUI(选 preset)+ headless 单次问答双模式。
12
+
13
+ ## 核心架构
14
+
15
+ ```
16
+ packages/sapbuddy-dsh/ # 41 个 SAP 工具插件(纯 TS,zod schema + execute)
17
+ ├── src/index.ts # 入口:首次运行 seed → ctx.tools.register(41 工具)+ 写门禁 + 提示词注入
18
+ ├── src/sap-tools/
19
+ │ ├── tools/*.ts # 工具实现(按主题分组,tools/index.ts 汇总注册)
20
+ │ ├── adtManager.ts # SAP 连接池(basic/OAuth2)+ assertDevClient 开发客户端守卫
21
+ │ ├── config.ts # 连接配置加载 + resolveReadOnly(连接级只读唯一出处)
22
+ │ ├── sapbuddy-home.ts # 配置根解析 + ensureSapbuddyHome(首次运行 seed-if-absent)
23
+ │ ├── connections-store.ts # 连接配置存储(导出 ./store,设置页复用)
24
+ │ ├── code-policy.ts # 代码规则扫描(scanCodeIssues / validateSourceMode)
25
+ │ ├── register.ts # 纯逻辑:授权窗口 / namespaceViolation / isReadOnly
26
+ │ ├── gate.ts # 写门禁三层(guard → pre-execute ask → 确认词窗口)
27
+ │ ├── auditLog.ts # 写操作审计
28
+ │ └── prompt-files.ts # 提示词注入(SYSTEM.md / AGENTS.md / Memory.md)
29
+ ├── skills/ # 8 个 ABAP 技能(随包分发,preset 经 createRequire 解析)
30
+ ├── defaults/ # 首次运行 seed 到 preset 目录的默认文件(绝不覆盖已有)
31
+ └── cordis.patch.yml # dsh.bundle.patch:preset-sapbuddy 行(preset 唯一注册途径)
32
+ scripts/install.mjs # 安装器(校验 dsh.bundle.patch + dsh plugin add)
33
+ ```
34
+
35
+ - **注册**:DSH 原生 `ctx.tools.register(defineTool(...))`(index.ts),不依赖任何 MCP 框架;
36
+ - **preset 注册**:0.2.0-rc.2 **不扫描** `~/.dsh/.agent-presets/`。preset 是 `cordis.patch.yml`
37
+ 里的一条 `@deepseek-ai/dsh-agent-preset` 行,靠 `package.json` 的 `dsh.bundle.patch` 生效。
38
+ 没有 `dsh.bundle` 的包会被 `dsh plugin add` 装成普通依赖,配置一行都不生效。
39
+ - **提示词注入**:`prompt-files.ts` 把配置根里的 `prompts/SYSTEM.md`、`AGENTS.md`、
40
+ `prompts/Memory.md` 注册为 systemPrompt section,**每次会话组装时实时读取文件**,
41
+ Memory.md 即改即生效(避坑沉淀随会话累积)。这些文件由 `ensureSapbuddyHome()` 在插件
42
+ 加载时从包内 `defaults/` **仅补缺**落盘——覆盖会抹掉用户的 Memory.md 与自定义提示词。
43
+
44
+ ## 安全拦截层(★ 代码级强制,不依赖 LLM 自觉)
45
+
46
+ ```
47
+ 写工具调用
48
+ │
49
+ ├─ ① gate.ts guard(同步硬规则,所有工具)
50
+ │ ├─ wikiWriteViolation → mcp__abap_wiki__ 写工具一律硬拦截(知识库只读)
51
+ │ ├─ configPathViolation → 敏感配置目录/文件名禁止 AI 读写(output/skills/prompts/uploads 子树除外)
52
+ │ ├─ 只读模式 → 连接级 readOnly 优先、顶层兜底(resolveReadOnly)
53
+ │ ├─ 连接变更 → 连接配置被改后必须先 get_connected_systems
54
+ │ └─ namespaceViolation → 只写 Z*/Y*(函数组内部程序按所属函数组判断)
55
+ │
56
+ ├─ ② tools/pre-execute ask 门 → 写工具且窗口未开 → {kind:'ask'}(Web 审批浮层,fail-closed)
57
+ │
58
+ ├─ ③ agent/inbox/claimed → 用户确认词/拒绝词 → 授权窗口(headless/CLI 回退)
59
+ │
60
+ └─ ④ index.ts execute 路径(每个写工具,纵深防御)
61
+ ├─ isConnectionDirty → 连接变更强制重确认
62
+ ├─ scanCodeIssues → 自建结构字段裸内置类型仅提示
63
+ └─ assertDevClient → 非开发客户端(T000.CCCATEGORY 非 C)拒绝写
64
+ ```
65
+
66
+ **规则唯一出处**:gate.ts / register.ts / index.ts;设置页(sapbuddy-dsh)与 preset 只做挂载,不重复实现 → 行为一致。
67
+
68
+ ## 开发命令
69
+
70
+ ```bash
71
+ pnpm install # 安装依赖
72
+ pnpm -r build # 编译三个包(tsc/esbuild → dist/,build 前清空 dist)
73
+ pnpm -r test # sapbuddy-dsh:172 用例(门禁/转换器/插件加载/连接存储)
74
+ node scripts/install.mjs --profile desktop --from-source # link: 装到本地 profile
75
+ node scripts/install.mjs --profile desktop --dry-run # 预览命令
76
+ ```
77
+
78
+ ## 代码规范
79
+
80
+ - 工具代码(TS):严格模式、NodeNext、无分号、双引号(见 tsconfig.json)
81
+ - 新增 SAP 工具:在 `packages/sapbuddy-dsh/src/sap-tools/tools/` 新建文件,导出
82
+ `{ name, title, description, inputSchema(zod), execute() }`,并在 `tools/index.ts` 注册;
83
+ 写操作必须标记 `write: true`
84
+ - 工具遵循"读优先、写需显式授权";提示词/技能文件改动遵守 `docs/original-prompts/` 归档口径
85
+
86
+ ### 强制规则 → 代码位置映射
87
+
88
+ | 规则 | 位置 | 层 |
89
+ |---|---|---|
90
+ | 写工具名单 / 授权窗口 / 只读模式 / 命名空间 | `register.ts`(isWriteTool/handleUserMessage/isReadOnly/namespaceViolation)+ `gate.ts` decideWriteApproval | 硬强制 |
91
+ | 写操作拦截(确认/知识库只读/配置保护) | `gate.ts` installWriteGate(guard + pre-execute + inbox) | 硬强制 |
92
+ | abap_wiki 知识库写工具拦截(`mcp__abap_wiki__*`,一律硬拦、不可放行) | `gate.ts` wikiWriteViolation | 硬强制 |
93
+ | 敏感配置禁止 AI 读写(connections/auth/settings/models;bash 命令含敏感路径/文件名也拦;preset 目录 output/skills/sessions/prompts/uploads 子树除外) | `gate.ts` configPathViolation | 硬强制 |
94
+ | 代码规则扫描(自建表结构字段裸内置类型仅提示;程序内局部变量放行) | `code-policy.ts` scanCodeIssues + `index.ts` execute | 裸类型非阻断;中文按规范建议处理 |
95
+ | 开发客户端守卫(T000 类别) | `adtManager.ts` assertDevClient + `index.ts` execute | 硬强制 |
96
+ | 创建:包名/描述必填、$TMP 提示、requestText 建请求 | `tools/writeTools.ts` create_object_programmatically | 硬强制 |
97
+ | 修改:自动沿用/创建请求、请求描述格式 | `tools/writeTools.ts` replace_string_in_abap_object | 硬强制 |
98
+ | 传输请求:状态码中文、底表 E070/E071、只读放行 | `tools/transportText.ts` manage_transport_requests | 硬强制 |
99
+ | 创建/修改流程、避坑记录(Memory.md)、请求描述格式(行为层) | 配置根 `prompts/SYSTEM.md` 铁律 6b / 输出约定 | 提示层(AI 执行,工具已兜底) |
100
+
101
+ ## 安全
102
+
103
+ - `connections.json`(SAP 凭据)不入库、不提交;由设置页或用户写入 `~/.dsh/.agent-presets/sapbuddy/`
104
+ - **默认只读**:只读判定为**连接级优先、顶层兜底**(`resolveReadOnly`)——连接声明 `security.readOnly`
105
+ 则以它为准,未声明则继承顶层 `security.readOnly`,两者都缺失即为只读(fail-closed)。
106
+ 连接级判定不会被"不传 connectionId"绕过:省略时按 active → 第一个 解析生效连接。
107
+ - 写操作另有双层保护:**人工确认**(拦截 → 用户批准/输入"确认"放行)+ **开发客户端守卫**(非 C 类拒绝)
108
+ - MCP 服务器配置由用户在 DSH 内置 dsh-mcp-client 管理(profile patch),仓库不提供程序化写配置
109
+
110
+ ## 提交
111
+
112
+ - 提交前 `pnpm -r build` 确保编译通过;`pnpm -r test` 全绿
113
+ - 不提交:`node_modules/`、`dist/`、`connections.json`、`.DS_Store`、`output/`、日志
114
+ - 提交信息简洁中文或英文均可
@@ -1,21 +1,21 @@
1
- {
2
- "connections": [
3
- {
4
- "id": "AI",
5
- "url": "https://your-sap-host:44300",
6
- "client": "100",
7
- "username": "YOUR_USER",
8
- "password": "YOUR_PASSWORD",
9
- "language": "ZH",
10
- "authMethod": "basic",
11
- "ssl": { "allowSelfSigned": true },
12
- "description": "开发系统",
13
- "security": {
14
- "requireDevClient": true,
15
- "developmentCategories": ["C"],
16
- "readOnly": true
17
- }
18
- }
19
- ],
20
- "security": { "readOnly": true }
21
- }
1
+ {
2
+ "connections": [
3
+ {
4
+ "id": "AI",
5
+ "url": "https://your-sap-host:44300",
6
+ "client": "100",
7
+ "username": "YOUR_USER",
8
+ "password": "YOUR_PASSWORD",
9
+ "language": "ZH",
10
+ "authMethod": "basic",
11
+ "ssl": { "allowSelfSigned": true },
12
+ "description": "开发系统",
13
+ "security": {
14
+ "requireDevClient": true,
15
+ "developmentCategories": ["C"],
16
+ "readOnly": true
17
+ }
18
+ }
19
+ ],
20
+ "security": { "readOnly": true }
21
+ }
@@ -1,22 +1,22 @@
1
- # Memory — 避坑记录
2
-
3
- > 本文件是 sapbuddy-dsh 使用过程中的**经验沉淀**:每次会话开始都会注入上下文;
4
- > 新避坑由 SYSTEM.md 输出约定自动追加到文件末尾(保留现有内容),也可由你手动补充。
5
-
6
- > 记录 ABAP 开发与 SapBuddy 使用中遇到的问题和解决方案。
7
- > 新条目追加在文件末尾,按模板填写。
8
-
9
- ## 条目模板
10
-
11
- ```markdown
12
- ## <一句话问题描述>
13
-
14
- - **日期:** YYYY-MM-DD
15
- - **对象:** <程序名/函数名>
16
- - **问题:** <现象>
17
- - **原因:** <根因>
18
- - **解决:** <方案>
19
- ```
20
-
21
- ---
1
+ # Memory — 避坑记录
2
+
3
+ > 本文件是 sapbuddy-dsh 使用过程中的**经验沉淀**:每次会话开始都会注入上下文;
4
+ > 新避坑由 SYSTEM.md 输出约定自动追加到文件末尾(保留现有内容),也可由你手动补充。
5
+
6
+ > 记录 ABAP 开发与 SapBuddy 使用中遇到的问题和解决方案。
7
+ > 新条目追加在文件末尾,按模板填写。
8
+
9
+ ## 条目模板
10
+
11
+ ```markdown
12
+ ## <一句话问题描述>
13
+
14
+ - **日期:** YYYY-MM-DD
15
+ - **对象:** <程序名/函数名>
16
+ - **问题:** <现象>
17
+ - **原因:** <根因>
18
+ - **解决:** <方案>
19
+ ```
20
+
21
+ ---
22
22
  新建请求的描述默认格式:sapbuddy_修改内容摘要_YYYYMMDD