@mcp-abap-adt/adt-strategies

中文文档
0.18.0发布于 2026/11/02LGPL-3.0-onlyTypeScriptCommonJS

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

中文使用文档
文档目录7 节
  1. 为什么这是一个单独的包
  2. 为什么不能是一个规则
  3. 里面有什么?
  4. 为什么一项战略会这么说
  5. 整个表面
  6. 违约是如何合理的
  7. 执照

@mcp-abap-adt / adt-strategies

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

的阅读和结论 @mcp-abap-adt/adt-clients: 一个ADT的答案变成了什么,以及它是否是一个失败-来自记录 ADT的答案。

为什么这是一个单独的包

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

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

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

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 });
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/ (answers/ 和 debugger/)在此存储库的adt-clients目录下:

“没有”到达,形状
激活没有发生200<chkl:messages> 与 <msg type="E">
对象从未被检查过200chkrun:status="notProcessed"
检查发现一个错误200<chkrun:checkMessage type="E">
删除被拒绝了200del:isDeleted="false"
该对象不能被删除200del: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 -在这个包裹中发货,并保存在广告客户在 文档/使用/ ERRATA.md.

整个表面

出口它是什么?
analyseActivation<chkl:messages> ——一个 <msg type="E"> 是判决, activationExecuted="false" 不是
analyseCheck<chkrun:checkRunReports> -首先是状态,然后是消息
analyseDeletiondel:isDeleted 和 del:isDeletable 在一个 200, 每一个 del:message,每个都有其严重性,T100键从其长文本链接中读取
analyseValidation姓名受理:二家答一身,三家答一身份
analyseUnitTestaunit:runResult -对失败的方法发出警告
analyseException<exc:exception>无论它到达哪里
analysePublication服务绑定的发布任务: <SEVERITY> 在一个 200
analysePublicationLock在发布或取消发布之前,服务绑定的LOCK 403 (编辑器持有绑定)没有失败,锁返回时没有句柄;每一次拒绝 analyseException. 打电话的人想要 403 阻止他们通过 analyseException 而不是
analyseDebuggeeEndABAP调试步骤或终止; 500 AdiFailed 子类型 debuggeeEnded 或者 terminateDebuggee 被调试进程是否按要求结束,没有失败-结果是命名子类型的文档;每一次拒绝 analyseException
analyseDebuggerFreedterminateDebugger:一个 500 担任 text/plain 或者使用空体,没有ADT异常文档,调试器释放自己的会话,没有失败;其他一切(a) 500 与异常文档(或充当其他任何东西,其他状态,连接失败,不是字符串的主体)一样 analyseException
analyseCdsTestDoublesCDS测试——双重检查
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, transportObjectEntriesgetRequest: list; created/createdTask; searchConfigurations; objectsITransportTree, ICreatedTransport, ITransportSearchConfiguration[], ITransportObjectEntry[]
objectVersions任何版本类型: versionsIObjectVersion[]
unitTestRunIdAdtExecutor.getClassTestRunner: run运行id,从标题ADT放入
featureToggleRuntimeState, featureToggleCheckStategetFeatureToggle: runtimeState, checkState两个州
utilSearchHits, utilNamedItems, utilNodeContents, utilInactiveObjects, utilActivationRunId, utilWhereUsedReferencesgetUtils: search, types, node, inactive, activation, whereUsed解析形状; readSearchHits, readNamedItems, readNodeStructure, extractRunId 下面是纯函数吗
abapGitRepos, abapGitErrorLog, abapGitExternalRepoAdtAbapGitClient: repos, errorLog, externalRepoIAbapGitRepo[] (与 repositoryId, pullLink, logLink)、日志条目、分支
atcSystemCheckVariant, atcWorklistId, atcStartedRun, atcWaitingRun, atcRunStatusgetAtc: checkVariant, worklist, startedRun, waitingRun, runStatus变体,工作列表id,运行
profilerTraceEntries, profilerHitList, profilerStatements, profilerDbAccesses, compareRecordedAtgetProfiler: list, hitlist, statements, dbAccesses跟踪条目和三个视图;按记录的时间排序
traceSchedulingTypes, traceSchedulingRequests, traceSchedulingProfilerId执行者: types, requests, scheduled目录,请求,侧写员的身份
feedDescriptors, feedVariants, feedEntries, feedSystemMessages, feedGatewayErrors, feedGatewayErrorDetailgetFeeds原子饲料,收到

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

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 共发布 21 个版本,首次发布于 2026/09/12;过去 12 个月发布了 21 个版本。

版本发布日期距今
0.18.0latest2026/11/021 天前
0.17.02026/10/313 天前
0.16.02026/10/304 天前
0.15.02026/10/2112 天前
0.14.02026/10/2112 天前
0.13.02026/10/1815 天前

关于 @mcp-abap-adt/adt-strategies 的常见问题

@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 和提交记录判断。