abapify — SAP 的 ADT CLI 与 SDK
abapify 是一个 TypeScript monorepo,用于与 SAP ABAP Development
Tools (ADT) 通信。
它提供了一个 CLI(adt)、一个用于编程使用的类型化 SDK、一个将 ADT 暴露给 AI 助手的 MCP 服务器,
以及一系列用于常见工作流的 CLI 插件(ATC、abapGit、gCTS、单元测试、diff、export)。
它存在的原因:SAP ADT 是一个功能丰富的 REST 接口,但没有
第一方的 CLI 或 npm SDK。abapify 为你提供了一个——类型化、
可脚本化、CI 友好,且无需离开 JS 生态系统。
快速开始
CLI
# Install
npm i -g @abapify/adt-cli
# or, run it one-shot
npx @abapify/adt-cli --help
# Configure a connection
adt login --url https://your-sap-system.example.com
# Do things
adt search "Z*" --type class
adt get class ZCL_MY_CLASS
adt atc run --package ZMYPKG --output sarif
adt export push ./src # deploy local source to SAP
adt abapgit push # serialize & push via abapGit
请参阅 CLI 参考, 了解所有命令和标志。
SDK
npm i @abapify/adt-client @abapify/adt-auth
import { createAdtClient } from '@abapify/adt-client';
import { basicAuth } from '@abapify/adt-auth';
const client = createAdtClient({
baseUrl: 'https://your-sap-system.example.com',
auth: basicAuth({ user: 'DEVELOPER', password: process.env.SAP_PASSWORD! }),
});
const classes = await client.repository.nodeContents({
parent_type: 'DEVC/K',
parent_name: 'ZMYPKG',
});
MCP 服务器(用于 AI 助手)
# stdio transport
npx @abapify/adt-mcp
# or HTTP transport
docker run --rm -p 3000:3000 ghcr.io/abapify/adt-mcp:latest
每个 CLI 命令都有一个对应的 MCP 工具 — 参见 MCP 文档。
文档
完整文档位于 adt-cli.netlify.app:
- 入门指南 — 安装、认证、初始命令
- CLI 参考 — 所有命令和标志
- SDK 指南 — 从 TypeScript 进行编程使用
- MCP 服务器 — 向 AI 助手暴露 ADT
- 插件 — abapGit、gCTS、编写你自己的
- 架构 — 各部分如何协同工作
来源:
- 公开文档 —
website/docs/,渲染到上述站点。 - 维护者文档 —
docs/,未渲染(设计笔记、规划、历史)。
软件包
所有已发布的软件包均发布到 npmjs.org 下的 @abapify/*;内部/仅限开发使用的软件包不会发布。
以下已发布的条目包含 npm 徽章;第一列链接到此 monorepo 中的源代码。
CLI 和插件(面向用户)
| 包 | npm | 描述 |
|---|---|---|
| adt-cli | adt 命令行界面 | |
| adt-mcp | MCP 服务器 — 向 AI 助手暴露 ADT 工具 | |
| adt-atc | ATC 插件 — 运行 ABAP Test Cockpit,输出 SARIF / GL CQ | |
| adt-aunit | ABAP 单元测试插件,用于 CI 的 JUnit XML 输出 | |
| adt-diff | Diff 插件 — 比较本地序列化文件与 SAP | |
| adt-export | Export 插件 — 将本地源代码部署到 SAP | |
| adt-plugin-abapgit | abapGit 序列化格式插件 | |
| adt-plugin-gcts | gCTS (git-enabled CTS) 插件 | |
| adt-plugin-gcts-cli | adt gcts 命令封装,基于 gCTS REST | |
| adt-tui | 基于 Ink 的终端 UI 原语 | |
| adt-pilot | abapify Pilot — 用于 ABAP 代码审查的 Mastra AI 智能体 | |
| adt-server | 支持目标地址的 ADT 边车服务,用于 MCP 和安全 REST 访问 |
SDK 与核心库
| 包 | npm | 描述 |
|---|---|---|
| adt-client | 用于 ADT REST API 的契约驱动 HTTP 客户端 | |
| adt-contracts | 类型化的 ADT REST API 契约定义 | |
| adt-schemas | 从 XSD 生成的 SAP ADT XML 模式 | |
| adk | ABAP 开发工具包 — 对象构建与序列化 | |
| adt-auth | 认证:Basic、SLC、OAuth、浏览器 SSO | |
| adt-config | adt.config.ts / .json 的配置加载器 | |
| adt-locks | ADT 对象的锁定/解锁服务 | |
| adt-plugin | 插件接口契约 | |
| adt-rfc | 基于 SOAP-over-HTTP 的 RFC 传输(/sap/bc/soap/rfc) | |
| adt-lint | 共享的 ABAP lint 和源码整形工具 | |
| adt-proxy | 支持 JSON↔XML 转换的 ADT 代理服务器 | |
| adt-server-client | 为 @abapify/adt-server 生成的客户端 |
身份验证适配器
| 包 | npm | 描述 |
|---|---|---|
| browser-auth | 共享浏览器 SSO 逻辑 | |
| adt-playwright | Playwright SSO 适配器 | |
| adt-puppeteer | Puppeteer SSO 适配器 |
基础库
| 包 | npm | 描述 |
|---|---|---|
| abap-ast | ABAP 源代码的类型化 AST 和美化打印器 | |
| acds | ABAP CDS 解析器 — 分词器 + AST | |
| adt-codegen | 基于钩子的代码生成工具包 | |
| asjson-parser | ABAP asJSON 规范格式解析器 | |
| logger | 共享日志记录器接口 | |
| openai-codegen | OpenAPI → ABAP 客户端代码生成器 | |
| speci | 箭头函数 REST 契约规范 | |
| ts-xsd | XSD 解析器、构建器、TypeScript 类型推断 | |
| aclass | ABAP OO 源代码解析器 — CLASS / INTERFACE 声明 |
仅限开发
这些包是工作区内部的,不会发布到 npm。
| 包 | npm | 描述 |
|---|---|---|
| adt-fixtures | — | 用于跨 monorepo 测试的 SAP ADT XML 测试数据 |
架构
adt-cli (Commander.js CLI, plugin loader)
│
├── adt-client (HTTP client, auth interceptor)
│ ├── adt-contracts (speci endpoint definitions)
│ └── adt-schemas (XSD-derived TypeScript types)
│
├── adk (ABAP object construction: parse ADT XML → domain objects)
│
├── adt-locks (lock/unlock service shared with adk, adt-export)
│
├── adt-auth (session management: basic / SLC / OAuth / browser SSO)
│ ├── adt-playwright (Playwright browser adapter)
│ └── adt-puppeteer (Puppeteer browser adapter)
│
└── plugins (opt-in command extensions)
├── adt-atc (ATC runs → SARIF / GitLab Code Quality)
├── adt-aunit (ABAP Unit → JUnit XML)
├── adt-diff (local vs SAP diff)
├── adt-export (file system → SAP deploy)
├── adt-plugin-abapgit (abapGit format serialization)
└── adt-plugin-gcts-cli (gCTS command wrapper)
类型流: SAP XSD 定义 → ts-xsd 生成 schema 字面量
→ adt-schemas 导出它们 → adt-contracts 将它们封装在 speci
端点描述符中 → adt-client 在调用点执行并具备完整的类型推断。
这意味着 CLI、SDK 和 MCP 工具都
共享相同的类型契约——只需修复一次 schema,所有调用方都会
获取该更新。
本地开发
要求:Bun(不是 npm、pnpm 或 yarn——该仓库
使用 bun workspaces 和 workspace:* 协议)。
git clone https://github.com/abapify/adt-cli.git
cd adt-cli
bun install
# Common tasks (all nx-driven)
bunx nx build # build every package
bunx nx test # run every test
bunx nx typecheck # type-check every package
bunx nx lint # lint + auto-fix
bunx nx run adt-cli:test # single-package
仓库布局
adt-cli/
├── packages/ # Every @abapify/* package lives here
├── samples/ # Example consumer projects
├── tools/ # Internal Nx plugins (nx-tsdown, nx-vitest, nx-npm-trust, …)
├── docs/ # Maintainer docs (not rendered on the site)
├── website/ # Docusaurus site (→ adt-cli.netlify.app)
├── openspec/ # Specs + proposals for in-flight changes
└── tmp/ # Scratch — gitignored
发布流程
npm 端使用 OIDC 可信发布 —— 任何地方都不存在 NPM_TOKEN 密钥。tools/nx-npm-trust 是注册可信发布者的内部插件(请参阅其
README 了解设置 / 引导
流程)。要发布版本,维护者在
GitHub Actions 上触发 Release 工作流;它根据约定式提交计算下一个版本,
打标签、推送,并触发 publish.yml,后者通过 OIDC 发布所有
30 个包。
贡献
git checkout -b feat/my-change
# make changes
bunx nx affected -t build test typecheck lint
git push origin feat/my-change
# open a pull request against main
AI 编码代理使用的约定记录在 AGENTS.md。各包的 AGENTS.md 文件通过包特定的不变量扩展这些规则。