sapbuddy-dsh 0.0.6 → 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 (55) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +12 -4
  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/tools.js +5 -3
  13. package/package.json +5 -3
  14. package/skills/abap-code-review/SKILL.md +75 -75
  15. package/skills/abap-code-review/assets/report-template.html +142 -142
  16. package/skills/abap-code-review/references/checklist.md +114 -114
  17. package/skills/abap-explain/SKILL.md +126 -126
  18. package/skills/abap-templates/SKILL.md +764 -764
  19. package/skills/abap-wiki/SKILL.md +104 -104
  20. package/skills/clean-abap/SKILL.md +91 -91
  21. package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
  22. package/skills/dev-write/SKILL.md +137 -137
  23. package/skills/sap-abap-skills/README.md +205 -205
  24. package/skills/sap-abap-skills/SKILL.md +498 -498
  25. package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
  26. package/skills/sap-abap-skills/references/abap-sql.md +588 -588
  27. package/skills/sap-abap-skills/references/amdp.md +279 -279
  28. package/skills/sap-abap-skills/references/authorization.md +149 -149
  29. package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
  30. package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
  31. package/skills/sap-abap-skills/references/cds-views.md +412 -412
  32. package/skills/sap-abap-skills/references/cloud-development.md +299 -299
  33. package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
  34. package/skills/sap-abap-skills/references/date-time.md +415 -415
  35. package/skills/sap-abap-skills/references/design-patterns.md +292 -292
  36. package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
  37. package/skills/sap-abap-skills/references/exceptions.md +432 -432
  38. package/skills/sap-abap-skills/references/generative-ai.md +180 -180
  39. package/skills/sap-abap-skills/references/internal-tables.md +578 -578
  40. package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
  41. package/skills/sap-abap-skills/references/object-orientation.md +518 -518
  42. package/skills/sap-abap-skills/references/performance.md +428 -428
  43. package/skills/sap-abap-skills/references/program-flow.md +302 -302
  44. package/skills/sap-abap-skills/references/rap-eml.md +549 -549
  45. package/skills/sap-abap-skills/references/released-classes.md +308 -308
  46. package/skills/sap-abap-skills/references/sap-luw.md +203 -203
  47. package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
  48. package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
  49. package/skills/sap-abap-skills/references/string-processing.md +488 -488
  50. package/skills/sap-abap-skills/references/table-grouping.md +150 -150
  51. package/skills/sap-abap-skills/references/tool-guide.md +285 -285
  52. package/skills/sap-abap-skills/references/unit-testing.md +512 -512
  53. package/skills/sap-abap-skills/references/where-conditions.md +223 -223
  54. package/skills/sap-abap-skills/references/xml-json.md +315 -315
  55. 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
@@ -10,13 +10,13 @@
10
10
  在 DSH 的插件管理页添加:
11
11
 
12
12
  ```text
13
- sapbuddy-dsh@0.0.6
13
+ sapbuddy-dsh@0.0.7
14
14
  ```
15
15
 
16
16
  也可以通过 DSH 命令行安装:
17
17
 
18
18
  ```bash
19
- dsh plugin --profile desktop add sapbuddy-dsh@0.0.6
19
+ dsh plugin --profile desktop add sapbuddy-dsh@0.0.7
20
20
  ```
21
21
 
22
22
  更新已安装插件后,完整退出并重新启动 DSH,再新建会话选择 **SapBuddy**。
@@ -32,6 +32,14 @@ dsh plugin --profile desktop add sapbuddy-dsh@0.0.6
32
32
 
33
33
  源码不一致、相关对象仍未激活或核对查询失败时,继续保留失败。对象元数据中的 `active` 字段不能单独证明本次修改已生效。非源码对象沿用其激活接口结果。
34
34
 
35
+ ## 连接切换与会话自愈
36
+
37
+ 切换或保存 SAP 连接后,插件会立刻作废进程内池化的 ADT 客户端,下一次调用按新配置重新登录,不会带着上一个系统的 cookie 与 CSRF 令牌去读写当前系统。
38
+
39
+ 写操作(编辑、激活、DDIC、传输等)在进入独占写序列前会刷新会话:会话超过 5 分钟没有被确认可用就先重新登录(清空 cookie、换一份新的 CSRF 令牌)。原因是 ABAP 侧的会话空闲超时会让旧令牌失效,而 ADT 客户端 SDK 只在无状态(stateless)请求上自动重登录——有状态写请求不会,于是会出现"读源码正常、每次写都报 `CSRF 令牌验证失败`"的僵局。
40
+
41
+ 如果写请求仍然收到 CSRF 或会话失效错误(例如 ABAP 侧刚重启),插件会丢弃该会话、重建连接并整体重试一次。CSRF 校验失败的请求在 SAP 侧不会执行,因此重试不会造成重复写入。上述恢复对工具层透明,不需要重启 DSH,也不需要重新切换连接。
42
+
35
43
  ## 工具与技能
36
44
 
37
45
  工具涵盖对象搜索与读码、代码导航、语法诊断与激活、ATC 与单元测试、SQL 查询、DDIC、文本池、屏幕文本、消息类、函数模块接口和传输请求。
@@ -53,11 +61,11 @@ dsh plugin --profile desktop add sapbuddy-dsh@0.0.6
53
61
  从 GitHub 克隆仓库后,在 `packages/sapbuddy-dsh` 下运行激活回归测试(需要 Node.js 24+,无需连接 SAP):
54
62
 
55
63
  ```bash
56
- npm run test:activation
64
+ npm test # = test:activation + test:session + test:store
57
65
  npm pack --dry-run --ignore-scripts
58
66
  ```
59
67
 
60
- 回归测试使用模拟 SAP 响应,覆盖误报恢复、失败计数、审计记录和核对失败边界;不能替代真实 SAP 联机验收。
68
+ `test:activation` 覆盖激活结果核对的误报恢复、失败计数、审计记录和核对失败边界;`test:session` 覆盖写前会话刷新、CSRF 失效自动重建,以及"已落库则绝不重试"的边界;`test:store` 用真实模块验证设置页保存/切换/删除连接确实会作废连接池。测试都使用模拟 SAP 响应,不能替代真实 SAP 联机验收。
61
69
 
62
70
  ## 许可证
63
71
 
@@ -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