# @mcp-abap-adt/adt-strategies 中文文档

规范地址：https://npmcn.com/package/%40mcp-abap-adt/adt-strategies/

版本：0\.18\.0
npm 元数据更新时间：2026-11-01T18:54:50.577Z
中文译文更新时间：2026-11-01T20:45:48.795Z
软件包许可：LGPL-3\.0-only

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40mcp-abap-adt/adt-strategies
原文对照：https://npmcn.com/package/%40mcp-abap-adt/adt-strategies/?lang=original
项目主页：https://github.com/fr0ster/mcp-abap-adt-clients#readme
源码仓库：https://github.com/fr0ster/mcp-abap-adt-clients

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：310 kB，65 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- 运行依赖：3 个
- 首次发布：2026-09-12T15:07:18.657Z
- 最新版本发布：2026-11-01T18:54:50.430Z
- 已发布版本数：21（近 12 个月 21 个）

## 中文简介

@mcp-abap-adt/ ADT -clients的默认结果和失败策略，源自记录的ADT答案

## 安装

```sh
npm install @mcp-abap-adt/adt-strategies
```

也可以使用：`pnpm add @mcp-abap-adt/adt-strategies`、`yarn add @mcp-abap-adt/adt-strategies`、`bun add @mcp-abap-adt/adt-strategies`

## README

# @mcp-abap-adt / adt-strategies

> **自从adt-clients 36.0.0** 下面每个电话都打给32个成员之一 采取 `options.headers` （`create`， `update`， `updateMetadata`， `delete`， `checkDeletion`， `check`， `activate` 其他的列在 [请求自己的标头](https://github.com/fr0ster/mcp-abap-adt-clients#a-requests-own-headers))传递请求自己的 `Accept` / `Content-Type` 对。 在这些样本中 `headers` 代表那一对，an `IAdtHeaders` （`{ accept, contentType }`);成员准确地发送它。

的阅读和结论 [`@mcp-abap-adt/adt-clients`](https://www.npmjs.com/package/@mcp-abap-adt/adt-clients)： 一个ADT的答案变成了什么，以及它是否是一个失败-来自记录 ADT的答案。

## 为什么这是一个单独的包

`adt-clients` 解释 **没有什么**． 每个成员提出一个ADT请求 响应SAP发送的文档，除非您使用 阅读;它不评判任何东西，除非你通过 `analyse` 有了电话。这是 深思熟虑：你想要文件的哪一部分，以及答案是否为 失败，取决于你接触的对象类型和你在做什么 适合你的图书馆可能不适合别人。

这给那些还没有意见的人留下了很大的空白。这个包裹装满了 它有一个观点，作为一个整体陈述，建立在证据而不是品味的基础上。 自 `adt-clients` 23.0.0它持有 **每一个** 阅读和裁决，图书馆 用于单独应用：传输树，搜索命中，版本提要， 单元测试运行id， abapGit存储库，ATC和分析器形状， 包删除和发布判决。 [迁移- 23. - md](https://npmcn.com/package/%40mcp-abap-adt/adt-clients/docs/usage/MIGRATION-23.md) 将每个旧行为映射到替代它的策略。

**两个轴，两个力矩。** 一、 _结果_ 当你建立一个 实现-结果集中每个成员一个槽 `adt-clients` 出口 对于它(`transportDocuments`， `utilDocuments`,……)。一个 _错误_ 给出了策略 随着每一次呼唤，as `options.analyse`：

```typescript
import { transportDocuments } from '@mcp-abap-adt/adt-clients';
import {
  analyseDeletion,
  transportSearchConfigurations,
  transportTree,
} from '@mcp-abap-adt/adt-strategies';

const requests = client.getRequest({
  ...transportDocuments,
  list: transportTree,
  searchConfigurations: transportSearchConfigurations,
});

await client.getPackage().delete({ packageName: 'ZPKG' }, { headers, analyse: analyseDeletion });
```

```typescript
import { analyseActivation, asItCame } from '@mcp-abap-adt/adt-strategies';

const answer = await client
  .getClass()
  .activate({ className: 'ZCL_X' }, { headers, analyse: analyseActivation });

if (!answer.ok) {
  for (const message of answer.getError().messages) {
    console.error(`[${message.type}] ${message.text}`);
  }
}
```

## 为什么不能是一个规则

ADT没有单一的说不的方式。从录音中 [`corpus/adt/`](https://npmcn.com/package/%40mcp-abap-adt/adt-clients/corpus/adt) （`answers/` 和 `debugger/`)在此存储库的adt-clients目录下：

| “没有” | 到达, | 形状 |
| --- | --- | --- |
| 激活没有发生 | 200 | `<chkl:messages>` 与 `<msg type="E">` |
| 对象从未被检查过 | 200 | `chkrun:status="notProcessed"` |
| 检查发现一个错误 | 200 | `<chkrun:checkMessage type="E">` |
| 删除被拒绝了 | 200 | `del:isDeleted="false"` |
| 该对象不能被删除 | 200 | `del:isDeletable="false"` |
| 取名称（DDL，功能组） | **200** | `<SEVERITY>ERROR</SEVERITY>` |
| 取名称（类、域、表） | **400** | `<exc:exception>` |
| 锁定，缺席，未锁定写 | 403 / 404 / 423 | `<exc:exception>` |

一起读最后三行。问一个端点家庭的问题， 根据对象类型有两种回答方式。一项与地位密切相关的规则 沉默地错过第一个，并报告一个已取的名字为空闲。

## 里面有什么？

**误差轴。** 每个文档表单都有一个策略 `analyseActivation`， `analyseCheck`， `analyseDeletion`， `analyseValidation`， `analyseUnitTest`， `analyseException`， `analysePublication`， `analyseCdsTestDoubles` - - - - - - `analyseAny`，它在根元素上进行分派 当表格事先不知道，并且为一个问题构建了五个： `analyseMessageClassMessage(msgno)`， `analyseObjectProperties`， `analyseUnitTestStart`， `analysePublicationLock`， `analyseDebuggeeEnd`， `analyseDebuggerFreed` 和 `analyseUnsupportedStatus(statuses, what)`.

每个人回答一个。 `IAdtMessageFailure`：合同的 `IAdtError` 加上每 文档中的消息，已规范化。SAP以三种方式表达了其严重性，并进行了传播 一个T100键正好在其中一个表单中；读数会使来电者变平 匹配 `type === 'E'` 不需要知道他们用的是哪艘航母。

### 为什么一项战略会这么说

其中有几个问题的存在是因为SAP解决了一些问题，而不是它的意思 一个 `403` 要忽略的服务绑定的LOCK （`analysePublicationLock`)，内心的拒绝 `200` （`analysePublication`， `analyseActivation`， `analyseDeletion`）. 为什么 `analysePublicationLock` Exists是in [ERRATA.md](https://npmcn.com/package/%40mcp-abap-adt/adt-strategies/ERRATA.md) -在这个包裹中发货，并保存在广告客户在 [文档/使用/ ERRATA.md](https://github.com/fr0ster/mcp-abap-adt-clients/blob/main/packages/adt-clients/docs/usage/ERRATA.md).

### 整个表面

| 出口 | 它是什么？ |
| --- | --- |
| `analyseActivation` | `<chkl:messages>` ——一个 `<msg type="E">` 是判决， `activationExecuted="false"` 不是 |
| `analyseCheck` | `<chkrun:checkRunReports>` -首先是状态，然后是消息 |
| `analyseDeletion` | `del:isDeleted` 和 `del:isDeletable` 在一个 `200`, **每一个** `del:message`，每个都有其严重性，T100键从其长文本链接中读取 |
| `analyseValidation` | 姓名受理：二家答一身，三家答一身份 |
| `analyseUnitTest` | `aunit:runResult` -对失败的方法发出警告 |
| `analyseException` | `<exc:exception>`无论它到达哪里 |
| `analysePublication` | 服务绑定的发布任务： `<SEVERITY>` 在一个 `200` |
| `analysePublicationLock` | 在发布或取消发布之前，服务绑定的LOCK `403` （编辑器持有绑定）没有失败，锁返回时没有句柄；每一次拒绝 `analyseException`． 打电话的人想要 `403` 阻止他们通过 `analyseException` 而不是 |
| `analyseDebuggeeEnd` | ABAP调试步骤或终止； `500 AdiFailed` 子类型 `debuggeeEnded` 或者 `terminateDebuggee` 被调试进程是否按要求结束，没有失败-结果是命名子类型的文档；每一次拒绝 `analyseException` |
| `analyseDebuggerFreed` | `terminateDebugger`:一个 `500` 担任 `text/plain` 或者使用空体，没有ADT异常文档，调试器释放自己的会话，没有失败；其他一切(a) `500` 与异常文档（或充当其他任何东西，其他状态，连接失败，不是字符串的主体）一样 `analyseException` |
| `analyseCdsTestDoubles` | CDS测试——双重检查 |
| `analyseMessageClassMessage(msgno)` | 类回答不是存在的消息：没有消息的类文档和根本不是消息类文档（空，不是XML，是另一个文档）的回答将被拒绝 `ADT_OBJECT_NOT_FOUND` （从0.14.0第二个也是） |
| `analyseObjectProperties` | 一个 `200` 从 `getUtils().getObjectProperties` 被描述的对象不是一个否定的答案吗 `opr:objectProperties` 文档控股 `opr:object` （空的，不是XML，是另一个文档，如登录页面）被拒绝 `ADT_OBJECT_NOT_FOUND` (因为0.15.0) |
| `analyseUnitTestStart` | 已启动的运行，其答案不包含运行id |
| `analyseUnsupportedStatus(statuses, what)` | 重命名一个 `404`/`405`/`501`……为 `UNSUPPORTED_OPERATION` -一个没有资源的系统，与拒绝分开 |
| `analyseAny` | 在事先不知道表单的情况下，对根元素进行分派 |
| `readActivationRefusal`， `readCheckRunRefusal`， `readDeletionRefusal`， `readValidationRefusal`， `readUnitTestRefusal`， `readExceptionRefusal`， `readPublicationRefusal`， `readCdsTestDoublesRefusal`， `readMessageClassMessageAbsence`， `readObjectPropertiesAbsence`， `readAdtRefusal` | 下面的读数-纯函数在一个文件上，回答 `AdtRefusal` 或者 `null` |
| `readExceptionSubType` | 子类型为 `exc:exception` 名称(`com.sap.adt.communicationFramework.subType`),或 `undefined` |
| `isIndeterminateWalkAnswer` | 表示无法读取空节点结构：空包和不存在的包回答相同 |
| `AdtMessage`， `AdtRefusal`， `IAdtMessageFailure` | 这些产生的形状 |

**结果轴** -每一个 `IResultStrategy` 对于an的一个槽 `adt-clients` 结果集:

| 出口 | 它填充槽 | 答案 |
| --- | --- | --- |
| `asItCame`， `rawOf` | 任何 | 答案不变； `answer.data` 作为文本 |
| `transportTree`， `transportCreated`， `transportSearchConfigurations`， `transportObjectEntries` | `getRequest`： `list`； `created`/`createdTask`； `searchConfigurations`； `objects` | `ITransportTree`， `ICreatedTransport`， `ITransportSearchConfiguration[]`， `ITransportObjectEntry[]` |
| `objectVersions` | 任何版本类型： `versions` | `IObjectVersion[]` |
| `unitTestRunId` | `AdtExecutor.getClassTestRunner`： `run` | 运行id，从标题ADT放入 |
| `featureToggleRuntimeState`， `featureToggleCheckState` | `getFeatureToggle`： `runtimeState`， `checkState` | 两个州 |
| `utilSearchHits`， `utilNamedItems`， `utilNodeContents`， `utilInactiveObjects`， `utilActivationRunId`， `utilWhereUsedReferences` | `getUtils`： `search`， `types`， `node`， `inactive`， `activation`， `whereUsed` | 解析形状； `readSearchHits`， `readNamedItems`， `readNodeStructure`， `extractRunId` 下面是纯函数吗 |
| `abapGitRepos`， `abapGitErrorLog`， `abapGitExternalRepo` | `AdtAbapGitClient`： `repos`， `errorLog`， `externalRepo` | `IAbapGitRepo[]` (与 `repositoryId`， `pullLink`， `logLink`)、日志条目、分支 |
| `atcSystemCheckVariant`， `atcWorklistId`， `atcStartedRun`， `atcWaitingRun`， `atcRunStatus` | `getAtc`： `checkVariant`， `worklist`， `startedRun`， `waitingRun`， `runStatus` | 变体，工作列表id，运行 |
| `profilerTraceEntries`， `profilerHitList`， `profilerStatements`， `profilerDbAccesses`， `compareRecordedAt` | `getProfiler`： `list`， `hitlist`， `statements`， `dbAccesses` | 跟踪条目和三个视图；按记录的时间排序 |
| `traceSchedulingTypes`， `traceSchedulingRequests`， `traceSchedulingProfilerId` | 执行者: `types`， `requests`， `scheduled` | 目录，请求，侧写员的身份 |
| `feedDescriptors`， `feedVariants`， `feedEntries`， `feedSystemMessages`， `feedGatewayErrors`， `feedGatewayErrorDetail` | `getFeeds` | 原子饲料，收到 |

**从答案中读出的代码是an `IAdtAnsweredObject`** (因为0.16.0)。这个 从答案中获取类型代码的读数 `readSearchHits` / `utilSearchHits`， `readNodeStructure` / `utilNodeContents`， `utilInactiveObjects`， `utilWhereUsedReferences` 还有跟踪读数程序 的ADT类型表查找一次 `@mcp-abap-adt/interfaces-adt` (每一种变体：答案不说明是哪一种 释放发送它)和回答 `{ type: AdtTypeCode }` 对于一个代码，一个表保存， `{ unknownType: string }` -文本与ADT发送的完全一样-对于任何其他。 `answeredObject(text)` 对于读取代码本身的消费者来说，这是查找吗？

```typescript
import { answeredObject } from '@mcp-abap-adt/adt-strategies';

const object = answeredObject('CLAS/OC');
if (object.type !== undefined) {
  // a code of the tables: act on it
} else {
  console.warn(`not a code the library serves: ${object.unknownType}`);
}
```

**在表单已知的地方使用命名策略。** `analyseAny` 答案 `null` 对于一个它不能识别的文件 `null` 这里的意思是“不失败”——所以 一个没有人写过阅读材料的表格被认为是成功的。

**A阅读答案 `null` 两种不同的东西**：非文本的文件 拒绝，和一份文件的形式不是它写的。一个需要的来电者 区分调用特定的读取而不是调度程序。

**所有的结果读数都不是默认值。** `adt-clients` 回答了 文档;塑造它是消费者的决定-哪些领域，什么目的- 这些都是按名称提供给想要图书馆形状的消费者 用来强加大多数读数都回答了一个它们不能回答的文件的空形状 阅读-判断文件是 `analyse`老师的工作，而不是阅读。两个扔的时候 文档没有 `tm:root`： `transportTree` 和 `transportCreated`,因为 空树或空请求将报告不存在的内容。 `adt-clients` 让读取异常以自身的形式出现。

## 违约是如何合理的

每一种策略都要根据它所依据的记录答案进行测试 **和** 必须把它同记录在案的成功区分开来。这种配对就是 要点：在大多数这些端点上，拒绝和成功共享一个状态，所以 如果读数同时指向两个方向，那么它看起来是正确的，但什么也没有识别出来。

没有SAP系统。语料库是固定装置。

表的一行在第一次写的时候是错的——一个表被列出来了 在验证下，语料库在第一次运行时拒绝了它：一个表回答 `400` 对于例外文档，则不是 `<SEVERITY>ERROR</SEVERITY>`． 这就是 此包的参数在一行中。

## 执照

lgpl - 3.0。

## 常见问题

### @mcp-abap-adt/adt-strategies 是什么？

@mcp-abap-adt/ ADT -clients的默认结果和失败策略，源自记录的ADT答案

### 如何安装 @mcp-abap-adt/adt-strategies？

在项目目录运行 npm install @mcp-abap-adt/adt-strategies，或使用 pnpm add / yarn add / bun add。

### @mcp-abap-adt/adt-strategies 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @mcp-abap-adt/adt-strategies 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @mcp-abap-adt/adt-strategies 可以商用吗？

@mcp-abap-adt/adt-strategies 使用 LGPL-3\.0-only 许可。弱 Copyleft：作为库被调用时通常不要求开源你自己的代码，但修改库本身需以 LGPL 开源；前端打包合并后的适用边界存在不同理解。以上为概括，不构成法律意见，请以许可原文为准。

### @mcp-abap-adt/adt-strategies 还在维护吗？

最新版本 0\.18\.0 发布于 2026/11/02（1 天前）；至今共发布 21 个版本，其中过去 12 个月发布了 21 个；首次发布于 2026/09/12。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

