oisee/vibing-steampunk
GitHub: oisee/vibing-steampunk
一个基于 Go 重写的 ABAP 分析平台,通过 MCP 与 LSP 提供轻量、脚本化且高度自动化的代码审计与变更管理能力。
Stars: 283 | Forks: 64
# Vibing Steampunk (vsp)
**AI-Agentic Development Unlocked for ABAP** — ECC, S/4HANA, everywhere ADT 可用。

## 热门推荐
### 包分析套件
五个分析命令,回答关于 ABAP 包的实际问题:
```
vsp health --package '$ZDEV' # tests + ATC + boundaries + staleness
vsp health --package '$ZDEV' --report html # full HTML report with details
vsp slim '$ZDEV' --level methods # dead code detection (method-level)
vsp api-surface '$ZDEV' --include-subpackages # Clean Core: which standard APIs do you use?
vsp boundaries '$ZDEV' # directional boundary crossing analysis
vsp boundaries '$ZDEV' --format mermaid # visual graph with package subgraphs
```
### 传输与变更历史
```
vsp changelog '$ZDEV' --since 20260101 # what changed in this package?
vsp changes '$ZDEV' --attribute SAPTEST # group transports by CR attribute (E070A)
```
### 方向边界跨越
不仅仅是“跨越”或“未跨越”——**哪个方向**的依赖流动:
| 方向 | 含义 | 判定 |
|-----------|---------|---------|
| UPWARD | 子 → 父 | OK |
| COMMON | 任意 → _00 包 | OK |
| SIBLING | 模块 → 模块 | BAD — 提取到公共部分 |
| DOWNWARD | 父 → 子 | BAD — 颠倒层级 |
| EXTERNAL | 跨层级 | WARN — 隔离违规 |
| CIRCULAR | A→B + B→A 兄弟 | BAD — 耦合模块 |
导出为 7 种格式:`text`、`json`、`md`、`mermaid`、`html`、`dot`(Graphviz)、`plantuml`、`graphml`(Gephi/yEd)。
### 副作用与 LUW 分析
解析器检测 ABAP 源码中的事务模式:
| 什么 | 检测到 |
|------|----------|
| 数据库读/写 | SELECT、INSERT、UPDATE、DELETE、MODIFY |
| LUW 所有权 | COMMIT WORK、ROLLBACK WORK |
| 延迟执行 | IN UPDATE TASK、IN BACKGROUND TASK |
| 异步 | STARTING NEW TASK(aRFC)、SUBMIT VIA JOB |
| 外部调用 | RFC DESTINATION、HTTP 客户端、APC/WebSocket |
| 事务 | CALL TRANSACTION、LEAVE TO TRANSACTION |
| 转换 | CALL TRANSFORMATION |
LUW 分类:**safe** / **participant** / **owner** / **unsafe**。
### 健康报告
包含测试详情、ATC 发现和边界跨越的完整健康报告:
```
vsp health --package '$ZDEV' --details # text with all details
vsp health --package '$ZDEV' --report md # → _ZDEV.md
vsp health --package '$ZDEV' --report html # → _ZDEV.html
vsp health --package '$ZDEV' --report my.html # → my.html
```
测试在完整的包层级中发现嵌入式本地测试类——与 Eclipse 的 Ctrl+Shift+F10 相同。
### 更多
- `vsp graph co-change CLAS ZCL_FOO` 用于基于传输的共变分析
- `vsp graph where-used-config ZKEKEKE` 用于启发式 TVARVC 使用发现
- `.vsp.json` `transport_attribute` 用于每系统 CR 相关配置
- **[分析与重构指南](docs/analysis-refactoring-guide.md)** 了解这些命令的作用
- **[图形指南](docs/graph-guide.md)** 获取示例、数据源和当前限制
## 0x101 星辰!
## 新功能 — 分析与智能冲刺
完整版本历史记录请参考 [CHANGELOG.md](CHANGELOG.md)。
### 聚焦模式 — 一工具统治所有(推荐)
**推荐用于大多数环境。** 单个 `SAP(action, target, params)` 工具替代多达 147 个独立工具定义。令牌开销最小,功能最大。
```
SAP(action="read", target="CLAS ZCL_TRAVEL")
SAP(action="edit", target="CLAS ZCL_TRAVEL", params={"source": "..."})
SAP(action="create", target="DEVC", params={"name": "$ZOZIK", "description": "New pkg"})
SAP(action="help", target="debug")
```
| 指标 | 聚焦(100 个工具) | 专家(147 个工具) | 聚焦(1 个工具) |
|--------|-------------------:|-------------------:|----------------------:|
| MCP 架构令牌 | ~14,000 | ~40,000 | **~200** |
| 减少 | — | — | **99.5%** |
所有安全控制(`--read-only`、`--allowed-ops`、`--allowed-packages`)均按相同方式工作——通用工具通过相同处理程序 → ADT 客户端 → `checkSafety()` 链路由。
### 上下文压缩 — 内置 ABAP 理解
`GetSource` 自动附加**压缩依赖前言**——每个引用类、接口和 FM 的公共 API 签名。一次 MCP 调用 = 源码 + 完整周边上下文。
**工作原理:**
```
graph LR
A["GetSource
ZCL_TRAVEL"] --> B["10 regex patterns
scan source"] B --> C["TYPE REF TO
NEW · => · ~
INHERITING FROM
INTERFACES
CALL FUNCTION
CAST · RAISING"] C --> D["Fetch deps
5 parallel"] D --> E["Extract contract
PUBLIC SECTION only"] E --> F["Source +
Compressed Prologue"] ``` **压缩按对象类型:** | 什么 | 保留 | 剥离 | 典型压缩比 | |------|-------|--------|:-------------:| | **类** | `CLASS DEFINITION` + `PUBLIC SECTION` | 保护、私有、实现 | **7–30x** | | **接口** | 完整的 `INTERFACE...ENDINTERFACE` | — | 1x(已足够紧凑) | | **函数模块** | `FUNCTION` 行 + `*"` 签名块 | 函数体 | **5–15x** | **真实世界示例** — `ZCL_ABAPGIT_ADT_LINK`(abapGit 代码库): - 检测到 8 个依赖项 → 8 个已解析,0 个失败 - 依赖项包括:`ZIF_ABAPGIT_DEFINITIONS`(大型接口)、`ZCX_ABAPGIT_EXCEPTION`、`CL_WB_OBJECT`(14 个方法)、`IF_ADT_URI_MAPPER`(8 个方法)等 - 所有内容仅压缩为**公共签名**——不包含实现体,也不包含私有部分 ### 方法级手术 — 读取并编辑单个方法 为何拉取整个 1000 行类,而只需要一个 30 行方法? ``` # 仅阅读 FACTORIAL 方法 — 而非整个类 SAP(action="read", target="CLAS ZCL_CALCULATOR", params={"method": "FACTORIAL"}) # 仅编辑该方法 — vsp 处理其余部分 SAP(action="edit", target="CLAS ZCL_CALCULATOR", params={ "method": "FACTORIAL", "source": " METHOD factorial.\n ...\n ENDMETHOD." }) ``` **底层发生的情况:** ``` sequenceDiagram participant LLM as AI Agent participant VSP as vsp participant SAP as SAP System LLM->>VSP: SAP(edit, CLAS ZCL_FOO, method=BAR, source=...) VSP->>SAP: GetClassMethods() → find BAR boundaries VSP->>SAP: GetClassSource() → full class Note over VSP: Replace lines 42-58
with new METHOD block VSP->>SAP: SyntaxCheck(full reconstructed source) VSP->>SAP: Lock → UpdateSource → Unlock → Activate VSP->>LLM: ✓ Method BAR updated, class activated ``` AI 仅发送/接收方法块(约 30 行)。vsp 内部获取完整类,在正确行范围拼接新方法,验证后推回。**相比完整类往返,token 减少 95%**。 **上下文压缩也作用于方法级别**——读取单个方法时,依赖分析仅在该方法的代码上运行,因此前言仅包含与你正在处理的方法相关的类型和接口,而非整个类的依赖树。 | 操作 | 完整类令牌数 | 方法级令牌数 | 节省 | |-----------|:-------------------:|:---------------------:|:-------:| | 读取源码 | ~1,000 | ~50 | **20x** | | 读取 + 上下文 | ~1,600 | ~250 | **6x** | | 编辑往返 | ~2,000 | ~100 | **20x** | ### 原生 Go ABAP 词法分析器 — abaplint 的 Go 实现 [abaplint](https://github.com/abaplint/abaplint) 词法分析器已从 TypeScript 机械式移植到原生 Go(`pkg/abaplint`)。这是驱动 abaplint 的同一词法分析器——48 种令牌类型,6 种词法模式(普通、字符串、反引号、模板、注释、指令 pragma),带有完整的空白上下文编码。 **通过 oracle 基础的差异测试验证** 与真实的 TypeScript abaplint 对比: ``` === DIFFERENTIAL KPI === Files: 29/29 passed (100.0%) Tokens: 22,612 total Full match: 22,612 (100.0%) — str + type + row + col Str match: 22,612 (100.0%) Type match: 22,612 (100.0%) Pos match: 22,612 (100.0%) ``` 零依赖,零 FFI。纯 Go,约 3.5M 令牌/秒,准备就绪用于第 2 阶段的 lint 规则。 ### ABAP LSP — 实时诊断 `vsp lsp --stdio` 为 Claude Code(及其他编辑器)提供 **自动** 错误检测和 ABAP 文件的导航功能。无需显式工具调用——LSP 在每次保存时推送诊断,在文件打开时推送压缩的依赖上下文。 请参考 [LSP 设置](#abap-lsp-for-claude-code) 进行配置。 ### WASM 到 ABAP 编译器(研究阶段) 将 WebAssembly 二进制文件编译为本机 ABAP——高级原型,在选定语料库上已验证。三条路径: ``` .wasm binary → pkg/wasmcomp (Go) → ABAP source files ← AOT compiler .ts source → pkg/ts2abap (Go) → clean OO ABAP classes ← direct transpiler .wasm binary → zcl_wasm_compiler → ABAP (on SAP itself!) ← self-hosting, 785 lines ``` **在 SAP A4H 上的演示:** QuickJS(1,410 个函数)编译为 101K 行 ABAP。abaplint 解析器(26.5MB)编译为 396K 行。自托管编译器解析 WASM,生成 ABAP,并通过 `GENERATE SUBROUTINE POOL` 执行——全部在 SAP 内部完成。这是研究/原型工作,并非生产就绪的工具链。 | 什么 | 大小 | 状态 | |------|:----:|:------:| | QuickJS → ABAP | 101K 行 | 已编译 | | abaplint → ABAP | 396K 行 | 已编译 | | abaplint 词法分析器(TS→ABAP) | 495 行 | 在 SAP 上运行 | | 自托管编译器 | 785 行 | 在 SAP 上运行 | | 批量部署 | `vsp deploy *.clas.abap` | 40 个类,0 次失败 | ### 完整的 CLI 工具链 — 从终端操作 SAP 35+ 条命令。无 SAP GUI,无 Eclipse,无 IDE。多数可与标准 ADT 配合使用;`lint`/`parse`/`compile` 完全离线工作。 ``` # 软件包分析 vsp health --package '$ZDEV' # tests + ATC + boundaries + staleness vsp health --package '$ZDEV' --report html # full HTML report vsp slim '$ZDEV' --level methods # dead code detection vsp api-surface '$ZDEV' --include-subpackages # Clean Core API inventory vsp boundaries '$ZDEV' --format mermaid # boundary crossings (visual) vsp boundaries '$ZDEV' --report dot # Graphviz export vsp changelog '$ZDEV' --since 20260101 # transport history vsp changes '$ZDEV' --attribute SAPTEST # CR-level grouping # 图形与依赖关系 vsp graph CLAS ZCL_FOO --direction callers # who uses this class? vsp graph co-change CLAS ZCL_FOO # transport-based co-change vsp graph where-used-config ZKEKEKE # TVARVC readers (heuristic) # 源代码与编辑 vsp source CLAS ZCL_MY_CLASS # read source vsp source CLAS ZCL_MY_CLASS --method GET_DATA # read single method vsp context CLAS ZCL_FOO --depth 2 # source + dependency contracts vsp analyze ZCL_MY_CLASS # 13 lint rules (offline) # 表格与搜索 vsp query T000 --top 5 # query any table vsp search "ZCL_*" --type CLAS --max 50 # object search vsp grep "SELECT.*mara" --package '$TMP' # source code search # 测试与质量 vsp test --package '$ZDEV' # run unit tests vsp atc CLAS ZCL_MY_CLASS # ATC code check # 部署与工具 vsp deploy zcl_test.clas.abap '$TMP' # deploy file to SAP vsp export '$ZORK' '$ZLLM' -o packages.zip # export abapGit ZIP vsp install abapgit # install abapGit on SAP vsp install zadt-vsp # install ZADT_VSP handler # 离线工具 vsp lint --file myclass.clas.abap # offline ABAP linter vsp parse --stdin --format json < source.abap # ABAP parser vsp compile wasm program.wasm --class ZCL_DEMO # WASM→ABAP compiler ``` 请参考 **[CLI 指南](docs/cli-guide.md)** 获取完整参考和功能需求矩阵。 ### 其他亮点 - **Lua 脚本引擎**:`vsp lua` — 交互式 REPL + 脚本,支持 50+ 个 SAP 绑定。查询表、扫描代码、解析 ABAP、设置断点、记录执行、回放状态。参见 [示例脚本](examples/scripts/)。 - **YAML 工作流**:`vsp workflow run pipeline.yaml` — CI/CD 自动化,支持变量替换、步骤串联和错误处理。参见 [示例工作流](examples/workflows/)。 - **从 CLI 引导**:`vsp install abapgit` + `vsp install zadt-vsp` — 直接从命令行将依赖项部署到 SAP 系统。无需 SAP GUI。 ## 核心功能 | 功能 | 描述 | |---------|-------------| | **包健康** | `vsp health` — 测试、ATC、边界跨越、陈旧度整合在一个报告(文本/MD/HTML) | | **死代码检测** | `vsp slim` — 通过 WBCROSSGT 反向引用进行方法级死/内/活跃分类 | | **边界分析** | `vsp boundaries` — 方向边界跨越(UPWARD/SIBLING/DOWNWARD/EXTERNAL/CIRCULAR) | | **副作用检测** | 数据库读/写、COMMIT/ROLLBACK、UPDATE 任务、RFC、异步 — LUW 分类 | | **传输历史** | `vsp changelog` + `vsp changes` — 传输关联和 CR 级分组 | | **API 表面** | `vsp api-surface` — 清洁核心清单:你的代码使用了哪些标准 API? | | **图形导出** | 7 种格式:mermaid、HTML、DOT(Graphviz)、PlantUML、GraphML(Gephi)、JSON、MD | | **静态分析** | `vsp analyze` — 纯 Go 实现的 13 条 lint 规则,无外部依赖 | | **聚焦模式** | 1 个通用 SAP 工具,**约 200 个令牌**,相比 147 个工具的 ~40K 显著减少 | | **上下文压缩** | 自动压缩依赖契约 — 7–30 倍压缩,内置 ABAP 解析器 | | **方法级手术** | 读取/编辑单个方法 — 相比完整类往返节省 95% token | | **ABAP LSP** | 内置语言服务器 — 实时诊断、转到定义、上下文推送 | | **AI 调试器** | 断点、监听器、附加、单步、检视堆栈与变量 | | **RAP OData E2E** | 创建 CDS 视图、行为定义、服务定义、绑定 → 发布 OData 服务 | | **AI 根因分析** | 转储、跟踪、性能分析器 + 代码智能的根原因分析 | | **DSL 与工作流** | 流畅的 Go API + YAML 自动化,用于 CI/CD 流水线 | | **文件部署** | 绕过令牌限制 — 直接从文件系统部署大文件 | | **精准编辑** | `EditSource` 工具匹配 Claude 的编辑模式,实现精确变更 | ## 快速开始 ``` #Download binary from releases curl -LO https://github.com/oisee/vibing-steampunk/releases/latest/download/vsp-linux-amd64 chmod +x vsp-linux-amd64 #Or build from source git clone https://github.com/oisee/vibing-steampunk.git && cd vibing-steampunk make build ``` ### Windows 11 搭配 VS Code + Claude Code 扩展 #### 1. 获取最新的 vsp 发行版: 如果下载可执行文件遇到问题,请使用 `curl -o url` 或 `wget` 下载。将文件命名为 `vsp.exe`。 将文件放入本地文件夹并在 VS Code 中打开该文件夹。 将 vsp 文件夹添加到用户的 `PATH` 环境变量中。可以通过命令行或 Windows 注册表编辑器 `regedit` 完成。将 vsp 文件夹添加到 `KEY_CURRENT_USER\Environment\Path`。 重新启动 VS Code 以识别更新后的 `PATH`,然后继续后续步骤。 #### 2. 初始化配置文件: 在 VS Code 中打开终端,然后运行 `./vsp config init` 以创建配置模板文件: - `.env.example` - `.vsp.json.example` - `.mcp.json.example` #### 3. 调整配置文件: 请务必删除注释行。参考本 `README` 中的示例文件。 #### 4. 设置认证 **基础认证:** 在 `SU01` 中为你的用户设置密码以启用基础认证。生成初始密码,然后再次登录(不使用 SNC/SSO)并更改初始密码。现在可通过配置文件中的基础认证使用 vsp。在 vsp 中设置环境变量 `SAP_USER` 和 `SAP_PASSWORD`。 现在需要获取 SAP 主机名用于 `SAP_URL` 环境变量:登录任意基于 Web 的应用程序(例如 Fiori Launchpad),从浏览器获取 URL。**注意:`SAP_URL` 不是** SAP Logon 中的消息/组服务器! **或者使用 Cookie 认证:** 如果无法为用户设置密码,仍可使用 Cookie 认证访问 SAP 系统。 手动提取 Cookie 并保存为 `cookies.txt` 到 vsp 文件夹。使用 Cookie `SAP_SESSIONID_SYS_CLI` 和 `sap-usercontext`,针对之前确定的 URL(注意:使用 `https://` 前缀进行安全连接)。参考下方指南了解如何从浏览器手动提取 Cookie。 **模板 Cookie 文件:** ``` # Netscape HTTP Cookie 文件 # https://curl.haxx.se/rfc/cookie_spec.html https://your.domain.com FALSE / TRUE 0 SAP_SESSIONID_SYS_CLI YOUR_CONTENT https://your.domain.com FALSE / TRUE 0 sap-usercontext YOUR_CONTENT ``` 将主机名替换为 `SYS`(例如 DS1)和客户端编号替换为 `CLI`(例如 100)。 **对于 BTP/Cloud 系统:** 使用 Cookie `__VCAP_ID__` 和 `JSESSIONID`,域名设为 `https://xyz.ondemand.com`。这也适用于 BTP 试用账户。另请参考[本文](https://medium.com/@warren_eiserman/vibe-steam-punk-vsp-for-abap-cloud-mac-claude-2864d601978f)。 **从浏览器会话获取 Cookie:** 最简单的方法是使用 Edge,因为它允许从设置页面查看 Cookie 内容。打开任意 WebDynpro 或 Fiori Launchpad 交易。对于旧版环境(如 ECC),BRF+ 交易在浏览器中打开时也应适用。登录后按以下步骤操作: 在 Edge 中,转到 `设置 > 隐私、搜索和服务 > Cookie > 查看所有 Cookie 和网站数据`。搜索你的顶级域名。应有该系统的两个 Cookie(如上所述,`SAP_SESSIONID` 和 `sap-usercontext` 或 `VCAP_ID` 和 `JSESSIONID` 如果系统基于云)。将每个 Cookie 的内容值复制到本地文件并保存。 创建的 Cookie 是会话 Cookie。它们最终会因超时而过期,`cookies.txt` 中的值需要更新。通常 Claude 会提示是否需要更新。 #### 5. 测试连接: 在终端中运行命令:`./vsp -s dev search "zcl_*" --type CLAS --max 50`。 如果连接建立成功,将会弹出找到的物件列表。 ## CLI 编码代理 VSP 支持 **8 个 CLI 编码代理**——不仅仅是 Claude!完整设置指南和配置模板如下: | 代理 | 模型访问 | 可用性 | 配置 | |-------|--------------|--------------|--------| | **Gemini CLI** | Gemini 模型 | 免费层级可用;付费/API 支持也可用 | `.gemini/settings.json` | | **Claude Code** | Claude 模型 | 付费使用或订阅支持 | `.mcp.json` | | **GitHub Copilot** | 多模型(取决于计划) | 免费层级可用;付费计划解锁更多限制/模型 | `.copilot/mcp-config.json` | | **OpenAI Codex** | OpenAI 编码模型 / ChatGPT 关联访问 | 有限或计划依赖访问;API 使用也可用 | `codex.toml` | | **Qwen Code** |wen 模型 | 免费层级可用;BYOK/API 支持也可用 | `.qwen/settings.json` | | **OpenCode** | 多提供方 BYOK | 取决于你的提供方/账户 | `opencode.json` | | **Goose** | 多提供方 BYOK | 取决于你的提供方/账户 | `~/.config/goose/config.yaml` | | **Mistral Vibe** | Mistral API 或本地模型 | 本地/Ollama 路径可能免费;API 使用按提供方计费 | `.vibe/config.toml` | 可用性、定价和模型阵容变化迅速。使用前请查阅代理指南和官方产品文档,不要将限制或计划声明复制到下游文档。 **[完整设置指南(含配置示例)](docs/cli-agents/README.md)** | [Русский](docs/cli-agents/README_RU.md) | [Українська](docs/cli-agents/README_UA.md) | [Español](docs/cli-agents/README_ES.md) 关于新的图形分析功能,请参考 **[图形指南](docs/graph-guide.md)**。 ## CLI 模式 vsp 以两种模式运行: 1. **MCP 服务器模式**(默认)——通过模型上下文协议为 Claude 公开工具 2. **CLI 模式**——直接命令行操作,无需 MCP ### CLI 命令 ``` # 源操作 vsp -s a4h source CLAS ZCL_MY_CLASS # read source vsp -s a4h source read CLAS ZCL_MY_CLASS # same, explicit vsp -s a4h source write CLAS ZCL_FOO < file.abap # write from stdin vsp -s a4h source edit CLAS ZCL_FOO --old "X" --new "Y" # surgical edit vsp -s a4h source context CLAS ZCL_FOO # source + dependency contracts vsp -s a4h context CLAS ZCL_FOO # shortcut for above # 搜索 vsp -s a4h search "ZCL_*" vsp -s dev search "Z*ORDER*" --type CLAS --max 50 # 图形分析 vsp -s a4h graph CLAS ZCL_FOO # call graph vsp -s a4h graph co-change CLAS ZCL_FOO # transport-based co-change vsp -s a4h graph co-change PROG ZREPORT --format json vsp -s a4h graph where-used-config ZKEKEKE # TVARVC readers (heuristic) vsp -s a4h graph where-used-config ZKEKEKE --format mermaid > config.mmd # 测试与代码质量 vsp -s a4h test CLAS ZCL_MY_CLASS # run unit tests vsp -s a4h test --package '$TMP' # package-level tests vsp -s a4h atc CLAS ZCL_MY_CLASS # ATC code check # 部署 vsp -s a4h deploy zcl_test.clas.abap '$TMP' # deploy file to SAP vsp -s a4h export '$ZORK' '$ZLLM' -o packages.zip # export abapGit ZIP # 引导 SAP 系统(无需 SAP GUI) vsp -s a4h install abapgit # install abapGit vsp -s a4h install zadt-vsp # install ZADT_VSP handler vsp -s a4h install abapgit --edition full # full dev edition (576 objects) vsp -s a4h install list # show installable components # 传输管理 vsp -s a4h transport list # list transports vsp -s a4h transport get A4HK900094 # transport details # 系统管理 vsp systems # list configured systems vsp config init # create example configs # 启动 ABAP LSP 服务器(适用于 Claude Code / 编辑器) vsp lsp --stdio ``` 图形 MVP 亮点: - `vsp graph co-change ` 用于基于传输的共变分析
- `vsp graph where-used-config ` 用于启发式 TVARVC 使用分析
- `SAP(action="analyze", params={"type":"co_change", ...})` 用于 MCP 共变分析
- `SAP(action="analyze", params={"type":"impact", ...})` 用于反向依赖影响
- `SAP(action="analyze", params={"type":"where_used_config", ...})` 用于 MCP TVARVC 使用
### 系统配置文件(`.vsp.json`)
在 `.vsp.json` 中配置多个 SAP 系统:
```
{
"default": "dev",
"systems": {
"dev": {
"url": "http://dev.example.com:50000",
"user": "DEVELOPER",
"client": "001"
},
"a4h": {
"url": "http://a4h.local:50000",
"user": "ADMIN",
"client": "001",
"insecure": true
},
"prod": {
"url": "https://prod.example.com:44300",
"user": "READONLY",
"client": "100",
"read_only": true,
"cookie_file": "/path/to/cookies.txt"
}
}
}
```
**密码解析:**
- 通过环境变量设置:`VSP__PASSWORD`(例如 `VSP_DEV_PASSWORD`)
- 或使用 Cookie 认证:`cookie_file` 或 `cookie_string`
**配置位置**(按顺序搜索):
1. `.vsp.json`(当前目录)
2. `.vsp/systems.json`
3. `~/.vsp.json`
4. `~/.vsp/systems.json`
## 与 Claude 配合使用
### Claude 桌面
添加到 `~/.config/claude/claude_desktop_config.json`:
```
{
"mcpServers": {
"abap-adt": {
"command": "/path/to/vsp",
"env": {
"SAP_URL": "https://your-sap-host:44300",
"SAP_USER": "your-username",
"SAP_PASSWORD": "your-password"
}
}
}
}
```
### Claude Code
将 `.mcp.json` 添加到你的项目:
```
{
"mcpServers": {
"abap-adt": {
"command": "/path/to/vsp",
"env": {
"SAP_URL": "https://your-sap-host:44300",
"SAP_USER": "your-username",
"SAP_PASSWORD": "your-password"
}
}
}
}
```
### ABAP LSP(用于 Claude Code)
vsp 包含内置的 LSP 服务器,为 Claude Code 提供 **自动** 错误检测(编辑 ABAP 文件时无需显式工具调用)。
**添加到 Claude Code 设置**(`.claude/settings.json` 或全局设置):
```
{
"lsp": {
"abap": {
"command": "vsp",
"args": ["lsp", "--stdio"],
"extensionToLanguage": {
".abap": "abap",
".asddls": "abap",
".asbdef": "abap"
}
}
}
}
```
SAP 凭据从环境变量或 `.env` 文件解析——与 MCP 模式相同。
**支持的 LSP 功能:**
| 功能 | 方法 | 来源 |
|---------|--------|--------|
| 实时语法错误 | `textDocument/publishDiagnostics` | ADT SyntaxCheck |
| 转到定义 | `textDocument/definition` | ADT FindDefinition |
**支持的文件模式**(遵循 abapGit 命名约定):
| 扩展名 | 对象类型 |
|-----------|-------------|
| `.clas.abap` | 类(主源码) |
| `.clas.testclasses.abap` | 类测试包含 |
| `.clas.locals_def.abap` | 类局部定义 |
| `.prog.abap` | 程序 / 报告 |
| `.intf.abap` | 接口 |
| `.fugr.abap` | 函数组 |
| `.ddls.asddls` | CDS 视图 |
命名空间约定(`#dmo#cl_flight.clas.abap` → `/DMO/CL_FLIGHT`)自动处理。
### 可传输包配置
要与可传输包(非 `$` 前缀)配合使用,**必须** 显式启用传输支持:
```
{
"mcpServers": {
"abap-adt": {
"command": "/path/to/vsp",
"env": {
"SAP_URL": "https://your-sap-host:44300",
"SAP_USER": "your-username",
"SAP_PASSWORD": "your-password",
"SAP_CLIENT": "001",
"SAP_ALLOW_TRANSPORTABLE_EDITS": "true",
"SAP_ALLOWED_TRANSPORTS": "DEVK*,A4HK*",
"SAP_ALLOWED_PACKAGES": "ZPROD,$TMP,$*,Z*"
}
}
}
}
```
| 环境变量 | 用途 |
|-------------|---------|
| `SAP_ALLOW_TRANSPORTABLE_EDITS` | 启用编辑可传输对象 |
| `SAP_ENABLE_TRANSPORTS` | 启用完整传输管理(创建、发布) |
| `SAP_ALLOWED_TRANSPORTS` | 白名单传输模式(支持通配符) |
| `SAP_ALLOWED_PACKAGES` | 白名单包模式(支持通配符) |
**使用 CreatePackage 并带软件组件:**
```
CreatePackage(
name="ZPROD_005",
description="Sub-package",
parent="ZPROD",
transport="DEVK900123",
software_component="HOME"
)
```
未启用这些标志时,对可传输包的操作将被安全系统阻止。
## 工具模式
一个轴,三个值——`--mode` 或 `SAP_MODE`:
```
graph LR
F["focused
100 tools
~14K tokens"] --> E["expert
147 tools
~40K tokens"] E --> H["hyperfocused
1 tool
~200 tokens
recommended"] style H fill:#2d6a4f,color:#fff,stroke:#4ade80,stroke-width:2px style F fill:#264653,color:#fff style E fill:#264653,color:#fff ``` | 方面 | 聚焦 | 专家 | 聚焦(推荐) | |--------|:-:|:-:|:-:| | **工具** | 100 个核心工具 | 147 个完整工具 | 1 个通用 `SAP()` | | **架构令牌** | ~14K | ~40K | **~200** | | AI 调用方式 | `GetSource(type, name)` | 同上,+ 细粒度工具 | `SAP(action, target, params)` | | 文档 | 工具架构 | 工具架构 | `SAP(action="help")` | | 适用场景 | 传统环境 | 边缘情况、调试 | **大多数环境——任意模型,开销最小** | | 安全控制 | 全部适用 | 全部适用 | 全部适用(相同代码路径) | ``` vsp --mode hyperfocused # recommended — single SAP(action, target, params) tool vsp --mode focused # 100 curated tools (individual tool names) vsp --mode expert # all 147 tools individually ``` ## DSL 与自动化 ### YAML 工作流 ``` # ci-pipeline.yaml name: CI Pipeline vars: package: "$TMP" steps: - action: search query: "ZCL_*" types: [class] package: "{{ .package }}" save_as: classes - action: test objects: "{{ .classes }}" parallel: 4 - action: fail_if condition: tests_failed message: "Unit tests failed" ``` ``` vsp workflow run ci-pipeline.yaml --var package='$ZRAY' ``` ### Go 库 ``` // Fluent search objects, _ := dsl.Search(client). Query("ZCL_*").Classes().InPackage("$TMP").Execute(ctx) // Test orchestration summary, _ := dsl.Test(client). Objects(objects...).Parallel(4).Run(ctx) // Batch import from directory (abapGit-compatible) result, _ := dsl.Import(client). FromDirectory("./src/"). ToPackage("$ZRAY"). RAPOrder(). // DDLS → BDEF → Classes → SRVD Execute(ctx) // Export classes with all includes result, _ := dsl.Export(client). Classes("ZCL_TRAVEL", "ZCL_BOOKING"). ToDirectory("./backup/"). Execute(ctx) // RAP deployment pipeline pipeline := dsl.RAPPipeline(client, "./src/", "$ZRAY", "ZTRAVEL_SB") ``` 请参考 [docs/DSL.md](docs/DSL.md) 获取完整文档。 ## RAP OData 服务创建 自 v2.6.0 起,VSP 支持完整的 RAP OData E2E 开发。通过 AI 助手创建完整的 OData 服务: ### 逐步工作流 **1. 创建 CDS 视图(DDLS)** ``` WriteSource( object_type="DDLS", name="ZTRAVEL", package="$TMP", description="Travel Entity", source=` @EndUserText.label: 'Travel' @AccessControl.authorizationCheck: #NOT_REQUIRED define root view entity ZTRAVEL as select from ztravel_tab { key travel_id as TravelId, description as Description, start_date as StartDate, end_date as EndDate, status as Status } ` ) ``` **2. 创建行为定义(BDEF)** ``` WriteSource( object_type="BDEF", name="ZTRAVEL", package="$TMP", description="Travel Behavior", source=` managed implementation in class ZBP_TRAVEL unique; strict ( 2 ); define behavior for ZTRAVEL alias Travel persistent table ztravel_tab lock master authorization master ( instance ) { field ( readonly ) TravelId; field ( mandatory ) Description; create; update; delete; mapping for ztravel_tab { TravelId = travel_id; Description = description; StartDate = start_date; EndDate = end_date; Status = status; } } ` ) ``` **3. 创建服务定义(SRVD)**
**4. 创建服务绑定(SRVB)**
```
WriteSource(
object_type="SRVB",
name="ZTRAVEL_SB",
package="$TMP",
description="Travel OData V4 Binding",
service_definition="ZTRAVEL_SD",
binding_version="V4"
)
```
### 绑定选项
| 参数 | 值 | 描述 |
|-----------|--------|-------------|
| `binding_version` | `V2`、`V4` | OData 协议版本 |
| `binding_category` | `0`、`1` | `0`=Web API,`1`=UI |
### 针对可传输包
对所有 WriteSource 调用添加 `transport` 参数:
```
WriteSource(
object_type="DDLS",
name="ZTRAVEL",
package="ZPROD",
transport="DEVK900123",
...
)
```
### 相关文档
- [RAP OData 课程报告](reports/2025-12-08-003-rap-odata-service-lessons.md)
- DSL 流水线:`dsl.RAPPipeline(client, "./src/", "$PKG", "ZSRV_SB")`
## ExecuteABAP
通过单元测试包装器运行任意 ABAP 代码:
```
ExecuteABAP:
code: |
DATA(lv_msg) = |Hello from SAP at { sy-datum }|.
lv_result = lv_msg.
```
**风险等级:** `harmless`(只读)、`dangerous`(写)、`critical`(完全访问)
请参考 [ExecuteABAP 报告](reports/2025-12-05-004-execute-abap-implementation.md) 获取详细信息。
## AI 驱动的根原因分析
VSP 使 AI 助手能够自主调查生产问题:
```
User: "Investigate the ZERODIVIDE crash in production"
AI Workflow:
1. GetDumps → Find recent crashes by exception type
2. GetDump → Analyze stack trace and variable values
3. GetSource → Read code at crash location
4. GetCallGraph → Trace call hierarchy
5. GrepPackages → Find similar patterns
6. Analysis → Identify root cause
7. Propose Fix → Generate solution + test case
```
**示例输出:**
请参考 [AI 驱动的根原因分析工作流](reports/2025-12-05-013-ai-powered-rca-workflows.md) 获取完整流程。
## 工具参考
**聚焦模式工具(100 个):**
- **搜索:** SearchObject、GrepObjects、GrepPackages
- **读取:** GetSource、GetTable、GetTableContents、RunQuery、GetPackage、GetFunctionGroup、GetCDSDependencies
- **调试:** DebuggerListen、DebuggerAttach、DebuggerDetach、DebuggerStep、DebuggerGetStack、DebuggerGetVariables
- *注意:断点现在通过 WebSocket 管理(ZADT_VSP)*
- **写入:** WriteSource、EditSource、ImportFromFile、ExportToFile、MoveObject
- **开发:** SyntaxCheck、RunUnitTests、RunATCCheck、LockObject、UnlockObject
- **智能:** FindDefinition、FindReferences、GetContext
- **系统:** GetSystemInfo、GetInstalledComponents、GetCallGraph、GetObjectStructure、GetFeatures
- **诊断:** GetDumps、GetDump、ListTraces、GetTrace、GetSQLTraceState、ListSQLTraces
- **Git:** GitTypes、GitExport(需要 abapGit 在 SAP 中)
- **报告:** RunReport、GetVariants、GetTextElements、SetTextElements
- **安装:** InstallZADTVSP、InstallAbapGit、ListDependencies
请参考 [README_TOOLS.md](README_TOOLS.md) 获取完整工具文档(147 个工具)。
## 致谢
| 项目 | 作者 | 贡献 |
|-------|--------|--------------|
| [abap-adt-api](https://github.com/marcellourbani/abap-adt-api) | Marcello Urbani | TypeScript ADT 库,权威 API 参考 |
| [mcp-abap-adt](https://github.com/mario-andreschak/mcp-abap-adt) | Mario Andreschak | 第一个用于 ABAP ADT 的 MCP 服务器 |
**vsp** 是 Go 重写版,具备:
- 单一二进制文件,零依赖
- 147 个工具(相比原始的 13 个)
- 启动速度快约 50 倍
## 可选:WebSocket 处理器(ZADT_VSP)
vsp 可选择性地部署一个 WebSocket 处理器到 SAP,用于增强功能(如 RFC 调用):
```
# 1. 创建软件包
vsp CreatePackage --name '$ZADT_VSP' --description 'VSP WebSocket Handler'
# 2. 部署对象(嵌入在二进制文件中)
vsp WriteSource --object_type INTF --name ZIF_VSP_SERVICE --package '$ZADT_VSP' \
--source "$(cat embedded/abap/zif_vsp_service.intf.abap)"
vsp WriteSource --object_type CLAS --name ZCL_VSP_RFC_SERVICE --package '$ZADT_VSP' \
--source "$(cat embedded/abap/zcl_vsp_rfc_service.clas.abap)"
vsp WriteSource --object_type CLAS --name ZCL_VSP_APC_HANDLER --package '$ZADT_VSP' \
--source "$(cat embedded/abap/zcl_vsp_apc_handler.clas.abap)"
# 3. 在 SAPC 中手动创建 APC 应用程序并在 SICF 中激活
# 详细信息请参见 embedded/abap/README.md
```
**部署后,通过 WebSocket 连接调用 RFC:**
```
{"id":"1","domain":"rfc","action":"call","params":{"function":"BAPI_USER_GET_DETAIL","USERNAME":"TESTUSER"}}
```
请参考 [WebSocket 处理器报告](reports/2025-12-18-002-websocket-rfc-handler.md) 获取完整文档。
## 文档
| 文档 | 描述 |
|----------|-------------|
| [docs/architecture.md](docs/architecture.md) | 架构图(Mermaid) |
| [README_TOOLS.md](README_TOOLS.md) | 完整工具参考(94 个工具) |
| [MCP_USAGE.md](MCP_USAGE.md) | AI 代理使用指南 |
| [docs/DSL.md](docs/DSL.md) | DSL 与工作流文档 |
| [ARCHITECTURE.md](ARCHITECTURE.md) | 技术架构(详细) |
| [CLAUDE.md](CLAUDE.md) | AI 开发指南 |
| [embedded/abap/README.md](embedded/abap/README.md) | WebSocket 处理器部署 |
| [docs/cli-agents/](docs/cli-agents/README.md) | CLI 编码代理设置指南(8 个代理,4 种语言) |
| [Roadmap: Quick/Mid/Far Wins](reports/2026-01-02-005-roadmap-quick-mid-far-wins.md) | 优先功能路线图 |
| [Observations Since v2.12.5](reports/2025-12-22-observations-since-v2.12.5.md) | 近期变更与研究总结 |
## 开发
```
# 构建
make build # Current platform
make build-all # All 9 platforms
# 测试
go test ./... # Unit tests (821)
go test -tags=integration -v ./pkg/adt/ # Integration tests (34+)
```
## 项目状态
| 指标 | 值 |
|--------|-------|
| **工具** | 147(100 个聚焦,147 个专家) |
| **单元测试** | 821 |
| **平台** | 9(Linux、macOS、Windows × amd64/arm64/386) |
", 10) -- Entry point
-- Step 2: Prepare to capture multiple executions
local captures = {}
-- Step 3: Loop to capture test cases
for i = 1, 10 do
local event = listen(120) -- Wait for debuggee
if not event then break end
attach(event.id)
-- Capture input parameters at entry
local vars = getVariables()
local testCase = {
id = i,
inputs = extractInputs(vars), -- IV_*, IT_*, IS_*
timestamp = os.time()
}
-- Step to end to capture outputs
continue_()
local event2 = listen(5)
if event2 then
attach(event2.id)
testCase.outputs = extractOutputs(getVariables()) -- EV_*, ET_*, ES_*, RETURN
end
-- Save checkpoint for replay
saveCheckpoint("testcase_" .. i, testCase)
table.insert(captures, testCase)
detach()
end
-- Step 4: Export for AI processing
print(json.encode(captures))
```
### AI 处理流水线
捕获测试用例后,AI 可以:
1. **归一化与去重** — 分组相似输入,识别唯一场景
2. **解释模式** — “TestCase 3 测试当 IV_AMOUNT < 0 时的错误路径”
3. **生成单元测试** — 创建带有适当 Mock 的 ABAP 单元测试类
```
User: "Analyze captured test cases and generate unit tests"
AI Workflow:
1. Load checkpoints → listCheckpoints("testcase_*")
2. Analyze patterns → Cluster by input signatures
3. Identify edge cases → Empty tables, zero values, error conditions
4. Generate mock specs → Which FMs/DB tables need mocking
5. Create ABAP Unit → ZCL_TEST_ with test methods
6. Deploy tests → WriteSource to SAP system
```
### 当前可用(v2.14):
| 功能 | 状态 | 命令/函数 |
|---------|--------|------------------|
| 设置断点 | ✅ | `setBreakpoint(program, line)` |
| 监听调试器 | ✅ | `listen(timeout)` |
| 附加/分离 | ✅ | `attach(id)`, `detach()` |
| 单步执行 | ✅ | `stepOver()`, `stepInto()`, `continue_()` |
| 获取变量 | ✅ | `getVariables()` |
| 获取堆栈跟踪 | ✅ | `getStack()` |
| 保存检查点 | ✅ | `saveCheckpoint(name, data)` |
| 加载检查点 | ✅ | `getCheckpoint(name)` |
| 调用图分析 | ✅ | `getCallersOf()`, `getCalleesOf()` |
| 短转储分析 | ✅ | `getDumps()`, `getDump(id)` |
### 即将推出:
| 功能 | 阶段 | 描述 |
|---------|-------|-------------|
| 变量历史记录 | 5.2 | ✅ 跟踪执行期间的所有变量变更 |
| 强制重放(状态注入) | 5.5 | ✅ 将保存的状态注入到实时调试会话中 |
| 测试用例提取 | 6.1 | 自动提取输入/输出 |
| ABAP 测试生成器 | 6.3 | 生成 ABAP 单元测试类 |
| Mock 框架 | 6.4 | `ZCL_VSP_MOCK` 用于 DB/RFC Mock |
| 隔离沙箱 | 7.1 | 快速测试执行,依赖项 Mock |
| 时间旅行调试 | 8.1 | 向后导航执行 |
### 相关文档
| 文档 | 描述 |
|----------|-------------|
| [VISION.md](VISION.md) | 愿景:AI 作为资深开发者 |
| [ROADMAP.md](ROADMAP.md) | 详细实现计划 |
| [TAS & Scripting](reports/2025-12-21-001-tas-scripting-time-travel-vision.md) | TAS 风格调试的技术设计 |
| [Test Extraction](reports/2025-12-21-002-test-extraction-isolated-replay.md) | 沙箱与 Mock 架构 |
| [Force Replay](reports/2025-12-21-003-force-replay-state-injection.md) | 状态设计 |
| [**Implications Analysis**](reports/2025-12-21-004-test-extraction-implications.md) | 范式转变:考古学 → 观察 |
| [AI-Powered RCA](reports/2025-12-05-013-ai-powered-rca-workflows.md) | 根原因分析工作流 |
## 愿景与路线图
**目标:** TAS 风格调试、时间旅行、AI 驱动的根原因分析
| 阶段 | 目标 | 功能 |
|-------|--------|----------|
| 5 | Q1 2026 | Lua 脚本 ✅、变量历史记录、检查点、强制重放 |
| 6 | Q2 2026 | 测试用例提取、ABAP 测试生成器、Mock 框架 |
| 7 | Q3 2026 | 隔离沙箱(带 Mock 的快速测试执行) |
| 8 | Q4 2026 | 时间旅行调试、时序查询 |
| 9+ | 2027 | AI 建议断点、多智能体调试、自愈 |
**阅读更多:**
- [VISION.md](VISION.md) — AI 作为资深开发者的梦想
- [ROADMAP.md](ROADMAP.md) — 详细实现计划
- [TAS & Scripting Report](reports/2025-12-21-001-tas-scripting-time-travel-vision.md) — 完整技术设计
- [Test Extraction Report](reports/2025-12-21-002-test-extraction-isolated-replay.md) — 沙箱架构
## 许可证
MIT
## 贡献
欢迎贡献!请参考 [ARCHITECTURE.md](ARCHITECTURE.md) 和 [CLAUDE.md](CLAUDE.md) 获取指南。
ZCL_TRAVEL"] --> B["10 regex patterns
scan source"] B --> C["TYPE REF TO
NEW · => · ~
INHERITING FROM
INTERFACES
CALL FUNCTION
CAST · RAISING"] C --> D["Fetch deps
5 parallel"] D --> E["Extract contract
PUBLIC SECTION only"] E --> F["Source +
Compressed Prologue"] ``` **压缩按对象类型:** | 什么 | 保留 | 剥离 | 典型压缩比 | |------|-------|--------|:-------------:| | **类** | `CLASS DEFINITION` + `PUBLIC SECTION` | 保护、私有、实现 | **7–30x** | | **接口** | 完整的 `INTERFACE...ENDINTERFACE` | — | 1x(已足够紧凑) | | **函数模块** | `FUNCTION` 行 + `*"` 签名块 | 函数体 | **5–15x** | **真实世界示例** — `ZCL_ABAPGIT_ADT_LINK`(abapGit 代码库): - 检测到 8 个依赖项 → 8 个已解析,0 个失败 - 依赖项包括:`ZIF_ABAPGIT_DEFINITIONS`(大型接口)、`ZCX_ABAPGIT_EXCEPTION`、`CL_WB_OBJECT`(14 个方法)、`IF_ADT_URI_MAPPER`(8 个方法)等 - 所有内容仅压缩为**公共签名**——不包含实现体,也不包含私有部分 ### 方法级手术 — 读取并编辑单个方法 为何拉取整个 1000 行类,而只需要一个 30 行方法? ``` # 仅阅读 FACTORIAL 方法 — 而非整个类 SAP(action="read", target="CLAS ZCL_CALCULATOR", params={"method": "FACTORIAL"}) # 仅编辑该方法 — vsp 处理其余部分 SAP(action="edit", target="CLAS ZCL_CALCULATOR", params={ "method": "FACTORIAL", "source": " METHOD factorial.\n ...\n ENDMETHOD." }) ``` **底层发生的情况:** ``` sequenceDiagram participant LLM as AI Agent participant VSP as vsp participant SAP as SAP System LLM->>VSP: SAP(edit, CLAS ZCL_FOO, method=BAR, source=...) VSP->>SAP: GetClassMethods() → find BAR boundaries VSP->>SAP: GetClassSource() → full class Note over VSP: Replace lines 42-58
with new METHOD block VSP->>SAP: SyntaxCheck(full reconstructed source) VSP->>SAP: Lock → UpdateSource → Unlock → Activate VSP->>LLM: ✓ Method BAR updated, class activated ``` AI 仅发送/接收方法块(约 30 行)。vsp 内部获取完整类,在正确行范围拼接新方法,验证后推回。**相比完整类往返,token 减少 95%**。 **上下文压缩也作用于方法级别**——读取单个方法时,依赖分析仅在该方法的代码上运行,因此前言仅包含与你正在处理的方法相关的类型和接口,而非整个类的依赖树。 | 操作 | 完整类令牌数 | 方法级令牌数 | 节省 | |-----------|:-------------------:|:---------------------:|:-------:| | 读取源码 | ~1,000 | ~50 | **20x** | | 读取 + 上下文 | ~1,600 | ~250 | **6x** | | 编辑往返 | ~2,000 | ~100 | **20x** | ### 原生 Go ABAP 词法分析器 — abaplint 的 Go 实现 [abaplint](https://github.com/abaplint/abaplint) 词法分析器已从 TypeScript 机械式移植到原生 Go(`pkg/abaplint`)。这是驱动 abaplint 的同一词法分析器——48 种令牌类型,6 种词法模式(普通、字符串、反引号、模板、注释、指令 pragma),带有完整的空白上下文编码。 **通过 oracle 基础的差异测试验证** 与真实的 TypeScript abaplint 对比: ``` === DIFFERENTIAL KPI === Files: 29/29 passed (100.0%) Tokens: 22,612 total Full match: 22,612 (100.0%) — str + type + row + col Str match: 22,612 (100.0%) Type match: 22,612 (100.0%) Pos match: 22,612 (100.0%) ``` 零依赖,零 FFI。纯 Go,约 3.5M 令牌/秒,准备就绪用于第 2 阶段的 lint 规则。 ### ABAP LSP — 实时诊断 `vsp lsp --stdio` 为 Claude Code(及其他编辑器)提供 **自动** 错误检测和 ABAP 文件的导航功能。无需显式工具调用——LSP 在每次保存时推送诊断,在文件打开时推送压缩的依赖上下文。 请参考 [LSP 设置](#abap-lsp-for-claude-code) 进行配置。 ### WASM 到 ABAP 编译器(研究阶段) 将 WebAssembly 二进制文件编译为本机 ABAP——高级原型,在选定语料库上已验证。三条路径: ``` .wasm binary → pkg/wasmcomp (Go) → ABAP source files ← AOT compiler .ts source → pkg/ts2abap (Go) → clean OO ABAP classes ← direct transpiler .wasm binary → zcl_wasm_compiler → ABAP (on SAP itself!) ← self-hosting, 785 lines ``` **在 SAP A4H 上的演示:** QuickJS(1,410 个函数)编译为 101K 行 ABAP。abaplint 解析器(26.5MB)编译为 396K 行。自托管编译器解析 WASM,生成 ABAP,并通过 `GENERATE SUBROUTINE POOL` 执行——全部在 SAP 内部完成。这是研究/原型工作,并非生产就绪的工具链。 | 什么 | 大小 | 状态 | |------|:----:|:------:| | QuickJS → ABAP | 101K 行 | 已编译 | | abaplint → ABAP | 396K 行 | 已编译 | | abaplint 词法分析器(TS→ABAP) | 495 行 | 在 SAP 上运行 | | 自托管编译器 | 785 行 | 在 SAP 上运行 | | 批量部署 | `vsp deploy *.clas.abap` | 40 个类,0 次失败 | ### 完整的 CLI 工具链 — 从终端操作 SAP 35+ 条命令。无 SAP GUI,无 Eclipse,无 IDE。多数可与标准 ADT 配合使用;`lint`/`parse`/`compile` 完全离线工作。 ``` # 软件包分析 vsp health --package '$ZDEV' # tests + ATC + boundaries + staleness vsp health --package '$ZDEV' --report html # full HTML report vsp slim '$ZDEV' --level methods # dead code detection vsp api-surface '$ZDEV' --include-subpackages # Clean Core API inventory vsp boundaries '$ZDEV' --format mermaid # boundary crossings (visual) vsp boundaries '$ZDEV' --report dot # Graphviz export vsp changelog '$ZDEV' --since 20260101 # transport history vsp changes '$ZDEV' --attribute SAPTEST # CR-level grouping # 图形与依赖关系 vsp graph CLAS ZCL_FOO --direction callers # who uses this class? vsp graph co-change CLAS ZCL_FOO # transport-based co-change vsp graph where-used-config ZKEKEKE # TVARVC readers (heuristic) # 源代码与编辑 vsp source CLAS ZCL_MY_CLASS # read source vsp source CLAS ZCL_MY_CLASS --method GET_DATA # read single method vsp context CLAS ZCL_FOO --depth 2 # source + dependency contracts vsp analyze ZCL_MY_CLASS # 13 lint rules (offline) # 表格与搜索 vsp query T000 --top 5 # query any table vsp search "ZCL_*" --type CLAS --max 50 # object search vsp grep "SELECT.*mara" --package '$TMP' # source code search # 测试与质量 vsp test --package '$ZDEV' # run unit tests vsp atc CLAS ZCL_MY_CLASS # ATC code check # 部署与工具 vsp deploy zcl_test.clas.abap '$TMP' # deploy file to SAP vsp export '$ZORK' '$ZLLM' -o packages.zip # export abapGit ZIP vsp install abapgit # install abapGit on SAP vsp install zadt-vsp # install ZADT_VSP handler # 离线工具 vsp lint --file myclass.clas.abap # offline ABAP linter vsp parse --stdin --format json < source.abap # ABAP parser vsp compile wasm program.wasm --class ZCL_DEMO # WASM→ABAP compiler ``` 请参考 **[CLI 指南](docs/cli-guide.md)** 获取完整参考和功能需求矩阵。 ### 其他亮点 - **Lua 脚本引擎**:`vsp lua` — 交互式 REPL + 脚本,支持 50+ 个 SAP 绑定。查询表、扫描代码、解析 ABAP、设置断点、记录执行、回放状态。参见 [示例脚本](examples/scripts/)。 - **YAML 工作流**:`vsp workflow run pipeline.yaml` — CI/CD 自动化,支持变量替换、步骤串联和错误处理。参见 [示例工作流](examples/workflows/)。 - **从 CLI 引导**:`vsp install abapgit` + `vsp install zadt-vsp` — 直接从命令行将依赖项部署到 SAP 系统。无需 SAP GUI。 ## 核心功能 | 功能 | 描述 | |---------|-------------| | **包健康** | `vsp health` — 测试、ATC、边界跨越、陈旧度整合在一个报告(文本/MD/HTML) | | **死代码检测** | `vsp slim` — 通过 WBCROSSGT 反向引用进行方法级死/内/活跃分类 | | **边界分析** | `vsp boundaries` — 方向边界跨越(UPWARD/SIBLING/DOWNWARD/EXTERNAL/CIRCULAR) | | **副作用检测** | 数据库读/写、COMMIT/ROLLBACK、UPDATE 任务、RFC、异步 — LUW 分类 | | **传输历史** | `vsp changelog` + `vsp changes` — 传输关联和 CR 级分组 | | **API 表面** | `vsp api-surface` — 清洁核心清单:你的代码使用了哪些标准 API? | | **图形导出** | 7 种格式:mermaid、HTML、DOT(Graphviz)、PlantUML、GraphML(Gephi)、JSON、MD | | **静态分析** | `vsp analyze` — 纯 Go 实现的 13 条 lint 规则,无外部依赖 | | **聚焦模式** | 1 个通用 SAP 工具,**约 200 个令牌**,相比 147 个工具的 ~40K 显著减少 | | **上下文压缩** | 自动压缩依赖契约 — 7–30 倍压缩,内置 ABAP 解析器 | | **方法级手术** | 读取/编辑单个方法 — 相比完整类往返节省 95% token | | **ABAP LSP** | 内置语言服务器 — 实时诊断、转到定义、上下文推送 | | **AI 调试器** | 断点、监听器、附加、单步、检视堆栈与变量 | | **RAP OData E2E** | 创建 CDS 视图、行为定义、服务定义、绑定 → 发布 OData 服务 | | **AI 根因分析** | 转储、跟踪、性能分析器 + 代码智能的根原因分析 | | **DSL 与工作流** | 流畅的 Go API + YAML 自动化,用于 CI/CD 流水线 | | **文件部署** | 绕过令牌限制 — 直接从文件系统部署大文件 | | **精准编辑** | `EditSource` 工具匹配 Claude 的编辑模式,实现精确变更 | ## 快速开始 ``` #Download binary from releases curl -LO https://github.com/oisee/vibing-steampunk/releases/latest/download/vsp-linux-amd64 chmod +x vsp-linux-amd64 #Or build from source git clone https://github.com/oisee/vibing-steampunk.git && cd vibing-steampunk make build ``` ### Windows 11 搭配 VS Code + Claude Code 扩展 #### 1. 获取最新的 vsp 发行版: 如果下载可执行文件遇到问题,请使用 `curl -o url` 或 `wget` 下载。将文件命名为 `vsp.exe`。 将文件放入本地文件夹并在 VS Code 中打开该文件夹。 将 vsp 文件夹添加到用户的 `PATH` 环境变量中。可以通过命令行或 Windows 注册表编辑器 `regedit` 完成。将 vsp 文件夹添加到 `KEY_CURRENT_USER\Environment\Path`。 重新启动 VS Code 以识别更新后的 `PATH`,然后继续后续步骤。 #### 2. 初始化配置文件: 在 VS Code 中打开终端,然后运行 `./vsp config init` 以创建配置模板文件: - `.env.example` - `.vsp.json.example` - `.mcp.json.example` #### 3. 调整配置文件: 请务必删除注释行。参考本 `README` 中的示例文件。 #### 4. 设置认证 **基础认证:** 在 `SU01` 中为你的用户设置密码以启用基础认证。生成初始密码,然后再次登录(不使用 SNC/SSO)并更改初始密码。现在可通过配置文件中的基础认证使用 vsp。在 vsp 中设置环境变量 `SAP_USER` 和 `SAP_PASSWORD`。 现在需要获取 SAP 主机名用于 `SAP_URL` 环境变量:登录任意基于 Web 的应用程序(例如 Fiori Launchpad),从浏览器获取 URL。**注意:`SAP_URL` 不是** SAP Logon 中的消息/组服务器! **或者使用 Cookie 认证:** 如果无法为用户设置密码,仍可使用 Cookie 认证访问 SAP 系统。 手动提取 Cookie 并保存为 `cookies.txt` 到 vsp 文件夹。使用 Cookie `SAP_SESSIONID_SYS_CLI` 和 `sap-usercontext`,针对之前确定的 URL(注意:使用 `https://` 前缀进行安全连接)。参考下方指南了解如何从浏览器手动提取 Cookie。 **模板 Cookie 文件:** ``` # Netscape HTTP Cookie 文件 # https://curl.haxx.se/rfc/cookie_spec.html https://your.domain.com FALSE / TRUE 0 SAP_SESSIONID_SYS_CLI YOUR_CONTENT https://your.domain.com FALSE / TRUE 0 sap-usercontext YOUR_CONTENT ``` 将主机名替换为 `SYS`(例如 DS1)和客户端编号替换为 `CLI`(例如 100)。 **对于 BTP/Cloud 系统:** 使用 Cookie `__VCAP_ID__` 和 `JSESSIONID`,域名设为 `https://xyz.ondemand.com`。这也适用于 BTP 试用账户。另请参考[本文](https://medium.com/@warren_eiserman/vibe-steam-punk-vsp-for-abap-cloud-mac-claude-2864d601978f)。 **从浏览器会话获取 Cookie:** 最简单的方法是使用 Edge,因为它允许从设置页面查看 Cookie 内容。打开任意 WebDynpro 或 Fiori Launchpad 交易。对于旧版环境(如 ECC),BRF+ 交易在浏览器中打开时也应适用。登录后按以下步骤操作: 在 Edge 中,转到 `设置 > 隐私、搜索和服务 > Cookie > 查看所有 Cookie 和网站数据`。搜索你的顶级域名。应有该系统的两个 Cookie(如上所述,`SAP_SESSIONID` 和 `sap-usercontext` 或 `VCAP_ID` 和 `JSESSIONID` 如果系统基于云)。将每个 Cookie 的内容值复制到本地文件并保存。 创建的 Cookie 是会话 Cookie。它们最终会因超时而过期,`cookies.txt` 中的值需要更新。通常 Claude 会提示是否需要更新。 #### 5. 测试连接: 在终端中运行命令:`./vsp -s dev search "zcl_*" --type CLAS --max 50`。 如果连接建立成功,将会弹出找到的物件列表。 ## CLI 编码代理 VSP 支持 **8 个 CLI 编码代理**——不仅仅是 Claude!完整设置指南和配置模板如下: | 代理 | 模型访问 | 可用性 | 配置 | |-------|--------------|--------------|--------| | **Gemini CLI** | Gemini 模型 | 免费层级可用;付费/API 支持也可用 | `.gemini/settings.json` | | **Claude Code** | Claude 模型 | 付费使用或订阅支持 | `.mcp.json` | | **GitHub Copilot** | 多模型(取决于计划) | 免费层级可用;付费计划解锁更多限制/模型 | `.copilot/mcp-config.json` | | **OpenAI Codex** | OpenAI 编码模型 / ChatGPT 关联访问 | 有限或计划依赖访问;API 使用也可用 | `codex.toml` | | **Qwen Code** |wen 模型 | 免费层级可用;BYOK/API 支持也可用 | `.qwen/settings.json` | | **OpenCode** | 多提供方 BYOK | 取决于你的提供方/账户 | `opencode.json` | | **Goose** | 多提供方 BYOK | 取决于你的提供方/账户 | `~/.config/goose/config.yaml` | | **Mistral Vibe** | Mistral API 或本地模型 | 本地/Ollama 路径可能免费;API 使用按提供方计费 | `.vibe/config.toml` | 可用性、定价和模型阵容变化迅速。使用前请查阅代理指南和官方产品文档,不要将限制或计划声明复制到下游文档。 **[完整设置指南(含配置示例)](docs/cli-agents/README.md)** | [Русский](docs/cli-agents/README_RU.md) | [Українська](docs/cli-agents/README_UA.md) | [Español](docs/cli-agents/README_ES.md) 关于新的图形分析功能,请参考 **[图形指南](docs/graph-guide.md)**。 ## CLI 模式 vsp 以两种模式运行: 1. **MCP 服务器模式**(默认)——通过模型上下文协议为 Claude 公开工具 2. **CLI 模式**——直接命令行操作,无需 MCP ### CLI 命令 ``` # 源操作 vsp -s a4h source CLAS ZCL_MY_CLASS # read source vsp -s a4h source read CLAS ZCL_MY_CLASS # same, explicit vsp -s a4h source write CLAS ZCL_FOO < file.abap # write from stdin vsp -s a4h source edit CLAS ZCL_FOO --old "X" --new "Y" # surgical edit vsp -s a4h source context CLAS ZCL_FOO # source + dependency contracts vsp -s a4h context CLAS ZCL_FOO # shortcut for above # 搜索 vsp -s a4h search "ZCL_*" vsp -s dev search "Z*ORDER*" --type CLAS --max 50 # 图形分析 vsp -s a4h graph CLAS ZCL_FOO # call graph vsp -s a4h graph co-change CLAS ZCL_FOO # transport-based co-change vsp -s a4h graph co-change PROG ZREPORT --format json vsp -s a4h graph where-used-config ZKEKEKE # TVARVC readers (heuristic) vsp -s a4h graph where-used-config ZKEKEKE --format mermaid > config.mmd # 测试与代码质量 vsp -s a4h test CLAS ZCL_MY_CLASS # run unit tests vsp -s a4h test --package '$TMP' # package-level tests vsp -s a4h atc CLAS ZCL_MY_CLASS # ATC code check # 部署 vsp -s a4h deploy zcl_test.clas.abap '$TMP' # deploy file to SAP vsp -s a4h export '$ZORK' '$ZLLM' -o packages.zip # export abapGit ZIP # 引导 SAP 系统(无需 SAP GUI) vsp -s a4h install abapgit # install abapGit vsp -s a4h install zadt-vsp # install ZADT_VSP handler vsp -s a4h install abapgit --edition full # full dev edition (576 objects) vsp -s a4h install list # show installable components # 传输管理 vsp -s a4h transport list # list transports vsp -s a4h transport get A4HK900094 # transport details # 系统管理 vsp systems # list configured systems vsp config init # create example configs # 启动 ABAP LSP 服务器(适用于 Claude Code / 编辑器) vsp lsp --stdio ``` 图形 MVP 亮点: - `vsp graph co-change
MCP 服务器配置
### CLI 标志 ``` vsp --url https://host:44300 --user admin --password secret vsp --url https://host:44300 --cookie-file cookies.txt vsp --mode expert # Enable all 147 tools vsp --mode hyperfocused # Single SAP tool (~200 tokens instead of ~40K) ``` ### 环境变量 ``` export SAP_URL=https://host:44300 export SAP_USER=developer export SAP_PASSWORD=secret export SAP_CLIENT=001 ``` ### .env 文件 ``` # .env(从当前目录自动加载) SAP_URL=https://host:44300 SAP_USER=developer SAP_PASSWORD=secret ``` | 标志 | 环境变量 | 描述 | |------|--------------|-------------| | `--url` | `SAP_URL` | SAP 系统 URL | | `--user` | `SAP_USER` | 用户名 | | `--password` | `SAP_PASSWORD` | 密码 | | `--client` | `SAP_CLIENT` | 客户端(默认:001) | | `--mode` | `SAP_MODE` | `hyperfocused`(推荐)、`focused` 或 `expert` | | `--cookie-file` | `SAP_COOKIE_FILE` | Netscape Cookie 文件 | | `--insecure` | `SAP_INSECURE` | 跳过 TLS 验证 | | `--terminal-id` | `SAP_TERMINAL_ID` | SAP GUI 终端 ID,用于跨工具调试 | | `--allow-transportable-edits` | `SAP_ALLOW_TRANSPORTABLE_EDITS` | 启用可传输对象的编辑 | | `--allowed-transports` | `SAP_ALLOWED_TRANSPORTS` | 白名单传输(支持通配符:`A4HK*`) | | `--allowed-packages` | `SAP_ALLOWED_PACKAGES` | 白名单包(支持通配符:`Z*,$TMP`) |100 tools
~14K tokens"] --> E["expert
147 tools
~40K tokens"] E --> H["hyperfocused
1 tool
~200 tokens
recommended"] style H fill:#2d6a4f,color:#fff,stroke:#4ade80,stroke-width:2px style F fill:#264653,color:#fff style E fill:#264653,color:#fff ``` | 方面 | 聚焦 | 专家 | 聚焦(推荐) | |--------|:-:|:-:|:-:| | **工具** | 100 个核心工具 | 147 个完整工具 | 1 个通用 `SAP()` | | **架构令牌** | ~14K | ~40K | **~200** | | AI 调用方式 | `GetSource(type, name)` | 同上,+ 细粒度工具 | `SAP(action, target, params)` | | 文档 | 工具架构 | 工具架构 | `SAP(action="help")` | | 适用场景 | 传统环境 | 边缘情况、调试 | **大多数环境——任意模型,开销最小** | | 安全控制 | 全部适用 | 全部适用 | 全部适用(相同代码路径) | ``` vsp --mode hyperfocused # recommended — single SAP(action, target, params) tool vsp --mode focused # 100 curated tools (individual tool names) vsp --mode expert # all 147 tools individually ``` ## DSL 与自动化 ### YAML 工作流 ``` # ci-pipeline.yaml name: CI Pipeline vars: package: "$TMP" steps: - action: search query: "ZCL_*" types: [class] package: "{{ .package }}" save_as: classes - action: test objects: "{{ .classes }}" parallel: 4 - action: fail_if condition: tests_failed message: "Unit tests failed" ``` ``` vsp workflow run ci-pipeline.yaml --var package='$ZRAY' ``` ### Go 库 ``` // Fluent search objects, _ := dsl.Search(client). Query("ZCL_*").Classes().InPackage("$TMP").Execute(ctx) // Test orchestration summary, _ := dsl.Test(client). Objects(objects...).Parallel(4).Run(ctx) // Batch import from directory (abapGit-compatible) result, _ := dsl.Import(client). FromDirectory("./src/"). ToPackage("$ZRAY"). RAPOrder(). // DDLS → BDEF → Classes → SRVD Execute(ctx) // Export classes with all includes result, _ := dsl.Export(client). Classes("ZCL_TRAVEL", "ZCL_BOOKING"). ToDirectory("./backup/"). Execute(ctx) // RAP deployment pipeline pipeline := dsl.RAPPipeline(client, "./src/", "$ZRAY", "ZTRAVEL_SB") ``` 请参考 [docs/DSL.md](docs/DSL.md) 获取完整文档。 ## RAP OData 服务创建 自 v2.6.0 起,VSP 支持完整的 RAP OData E2E 开发。通过 AI 助手创建完整的 OData 服务: ### 逐步工作流 **1. 创建 CDS 视图(DDLS)** ``` WriteSource( object_type="DDLS", name="ZTRAVEL", package="$TMP", description="Travel Entity", source=` @EndUserText.label: 'Travel' @AccessControl.authorizationCheck: #NOT_REQUIRED define root view entity ZTRAVEL as select from ztravel_tab { key travel_id as TravelId, description as Description, start_date as StartDate, end_date as EndDate, status as Status } ` ) ``` **2. 创建行为定义(BDEF)** ``` WriteSource( object_type="BDEF", name="ZTRAVEL", package="$TMP", description="Travel Behavior", source=` managed implementation in class ZBP_TRAVEL unique; strict ( 2 ); define behavior for ZTRAVEL alias Travel persistent table ztravel_tab lock master authorization master ( instance ) { field ( readonly ) TravelId; field ( mandatory ) Description; create; update; delete; mapping for ztravel_tab { TravelId = travel_id; Description = description; StartDate = start_date; EndDate = end_date; Status = status; } } ` ) ``` **3. 创建服务定义(SRVD)**
能力矩阵
| 能力 | ADT (Eclipse) | abap-adt-api (TS) | **vsp** | |------------|:-------------:|:-----------------:|:-------:| | 程序、类、接口 | Y | Y | **Y** | | 函数、函数组 | Y | Y | **Y** | | 表、结构 | Y | Y | **Y** | | CDS 视图 | Y | Y | **Y** | | 语法检查、激活 | Y | Y | **Y** | | 单元测试 | Y | Y | **Y** | | CRUD 操作 | Y | Y | **Y** | | 查找定义/引用 | Y | Y | **Y** | | 代码补全 | Y | Y | **Y** | | ATC 检查 | Y | Y | **Y** | | 调用图 | Y | Y | **Y** | | 系统信息 | Y | Y | **Y** | | 精准编辑(Edit pattern) | - | - | **Y** | | 文件部署 | - | - | **Y** | | ExecuteABAP | - | - | **Y** | | RAP OData(DDLS/SRVD/SRVB) | Y | - | **Y** | | OData 服务发布 | Y | - | **Y** | | abapGit 导出 | Y | - | **Y**(WebSocket) | | 调试 | Y | Y | N |SQL 查询说明
使用 **ABAP SQL 语法**,而非标准 SQL: | 特性 | 状态 | |---------|--------| | `ORDER BY col ASCENDING` | 可用 | | `ORDER BY col DESCENDING` | 可用 | | `ORDER BY col ASC/DESC` | **失败** — 请使用 ASCENDING/DESCENDING | | `LIMIT n` | **失败** — 请使用 `max_rows` 参数 |架构
``` vibing-steampunk/ ├── cmd/vsp/main.go # CLI (cobra/viper) ├── pkg/adt/ │ ├── client.go # ADT client + read ops │ ├── crud.go # CRUD operations │ ├── devtools.go # Syntax check, activate, tests │ ├── codeintel.go # Definition, refs, completion │ ├── workflows.go # High-level workflows │ └── http.go # HTTP transport (CSRF, auth) ├── internal/mcp/server.go # MCP tool handlers (147 tools) ├── internal/lsp/ # ABAP LSP server (diagnostics, go-to-def) └── pkg/dsl/ # DSL & workflow engine ```路线图
### 已完成(v2.15.0) - [x] DSL & 工作流引擎 - [x] CDS 依赖分析(`GetCDSDependencies`) - [x] ATC 代码质量检查(`RunATCCheck`) - [x] ExecuteABAP(通过单元测试进行代码注入) - [x] 系统信息与组件(`GetSystemInfo`、`GetInstalledComponents`) - [x] 调用图与对象结构(`GetCallGraph`、`ObjectStructure`) - [x] 小转储 / 运行时错误 — `GetDumps`、`GetDump`(RABAX) - [x] ABAP 性能分析 / 跟踪 — `ListTraces`、`GetTrace`(ATRA) - [x] SQL 跟踪 — `GetSQLTraceState`、`ListSQLTraces`(ST05) - [x] **RAP OData E2E** — DDLS、SRVD、SRVB 创建 + 发布(v2.6.0) - [x] **外部断点** — 行、异常、语句、消息(v2.7.0) - [x] **调试会话** — 监听器、附加、分离、单步、堆栈、变量(v2.8.0) - [x] **工具组禁用** — `--disabled-groups 5THD`(v2.10.0) - [x] **UI5/BSP 读取** — `UI5ListApps`、`UI5GetApp`、`UI5GetFileContent`(v2.10.1) - [x] **功能检测** — `GetFeatures` 工具 + 系统能力探测(v2.12.4) - [x] **WriteSource SRVB** — 通过统一 API 创建服务绑定(v2.12.4) - [x] **调用图 & RCA** — GetCallersOf、GetCalleesOf、TraceExecution(v2.13.0) - [x] **Lua 脚本** — REPL、40+ 绑定、调试会话管理(v2.14.0) - [x] **WebSocket 调试** — ZADT_VSP 处理器、TPDAPI 集成(v2.15.0) - [x] **强制重放** — 变量历史、状态注入(v2.15.0) ### 搁置(需要进一步工作) - [ ] **AMDP 调试器** — 实验性:会话已建立,断点触发中([报告](reports/2025-12-22-001-amdp-debugging-investigation.md)) - [ ] **UI5/BSP 写入** — ADT 文件存储为只读,需要自定义插件通过 `/UI5/CL_REPOSITORY_LOAD` - [x] **abapGit 导出** — WebSocket 集成完成(v2.16.0)— GitTypes、GitExport 工具([报告](reports/2025-12-23-002-abapgit-websocket-integration-complete.md)) - [ ] **abapGit 导入** — 需要 `ZCL_ABAPGIT_OBJECTS=>deserialize` 与虚拟存储库 ### 已完成(v2.36.0) - [x] API 发布状态(ARS)— `GetAPIReleaseState` 工具用于 Clean Core 合规性检查 - [x] gCTS 集成 — 10 个工具用于 gCTS 仓库管理 - [x] i18n 工具 — 7 个工具用于翻译管理,支持按请求语言覆盖 - [x] 浏览器 SSO — `--browser-auth` 用于 Kerberos/SAML/Keycloak 认证 - [x] HTTP 流式传输传输 — `--transport http` 用于非 stdio 部署 - [x] mcp-go v0.47.0 — 最新 MCP SDK ### 计划中 - [ ] 消息服务器日志 - [ ] 后台作业管理 ### 未来考虑 - [ ] **AMDP 会话持久化**(启用完整 HANA 调试) - [ ] **图形引擎与边界分析** — 初步实现位于 `pkg/graph/`(边界分析、动态调用检测、11 个测试);SQL/ADT 适配器待完成 - [ ] **测试智能**(基于变更的智能测试执行) - [ ] **标准 API 表面刮削器** **研究报告:** - [AMDP 会话架构](reports/2025-12-05-019-amdp-session-architecture.md) — 会话绑定分析与解决方案 - [原生 ADT 功能](reports/2025-12-05-005-native-adt-features-deep-dive.md) — 全面 ADT 能力分析 - [ADT 调试器 API](reports/2025-12-05-012-adt-debugger-api-deep-dive.md) — 外部调试 REST API - [AI 驱动的根原因分析](reports/2025-12-05-013-ai-powered-rca-workflows.md) — 借助代码智能的根原因分析愿景 ## Lua 脚本(v2.14 新功能) 使用 Lua 脚本自动化调试工作流: ``` # 交互式 REPL vsp lua # 运行脚本 vsp lua examples/scripts/debug-session.lua # 执行内联 vsp lua -e 'print(json.encode(searchObject("ZCL_*", 10)))' ``` **示例:设置断点并调试** ``` -- Set breakpoint local bpId = setBreakpoint("ZTEST_PROGRAM", 42) print("Breakpoint: " .. bpId) -- Wait for debuggee local event = listen(60) if event then attach(event.id) print("Stack:") for i, frame in ipairs(getStack()) do print(" " .. frame.program .. ":" .. frame.line) end stepOver() detach() end ``` **可用函数:** - **搜索:** `searchObject`、`grepObjects` - **源码:** `getSource`、`writeSource`、`editSource` - **调试:** `setBreakpoint`、`listen`、`attach`、`detach`、`stepOver`、`stepInto`、`stepReturn`、`continue_`、`getStack`、`getVariables` - **检查点:** `saveCheckpoint`、`getCheckpoint`、`listCheckpoints`、`injectCheckpoint` - **诊断:** `getDumps`、`getDump`、`runUnitTests`、`syntaxCheck` - **调用图:** `getCallGraph`、`getCallersOf`、`getCalleesOf` - **实用工具:** `print`、`sleep`、`json.encode`、`json.decode` 请参考 `examples/scripts/` 获取更多示例。 ## RCA、重放与测试提取 ### 愿景:AI 驱动的调试流水线 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 1. SET BREAKPOINT → 2. RUN PROGRAM → 3. CAPTURE CONTEXT │ │ setBreakpoint() (trigger via saveCheckpoint() │ │ on FM/method unit test/RFC) for each hit │ ├─────────────────────────────────────────────────────────────────────────────┤ │ 4. EXTRACT TEST CASES → 5. AI NORMALIZE → 6. GENERATE UNIT TESTS │ │ inputs + outputs deduplicate, ABAP Unit classes │ │ from checkpoints explain patterns with mocks │ └─────────────────────────────────────────────────────────────────────────────┘ ``` ### 示例:捕获 FM 执行以生成测试 ``` -- Step 1: Set breakpoint on function module entry local bpId = setBreakpoint("SAPL标签:ABAP, ADT, AI工具, AI辅助开发, API表面分析, EVTX分析, Graphviz, MCP, PlantUML, SEO关键词, SOC Prime, Steampunk, Vibe编码, WebSocket, 云安全监控, 代码分析, 传输分析, 依赖分析, 凭证管理, 包健康检查, 包分析, 变更历史, 可视化报告, 开发工具, 方向性依赖, 日志审计, 桥接, 死代码检测, 边界分析, 静态分析, 靶机