abap-mcp 0.2.0 → 0.3.0

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.
@@ -10,6 +10,7 @@ import { basename, extname, join } from "node:path";
10
10
  import { ABAP_VERSIONS, MAX_FILES, runAbaplint } from "./abap/engine.js";
11
11
  import { outlineAbap } from "./abap/outline.js";
12
12
  import { checkCloudReadiness, SCOPE_NOTE } from "./abap/readiness.js";
13
+ import { lookupReleased, RELEASED_API_SNAPSHOT, suggestSuccessor } from "./abap/released.js";
13
14
  import { explainRule, listRules } from "./abap/rules.js";
14
15
  import { scaffoldRapBo } from "./abap/scaffold.js";
15
16
  const ABAP_FILE_RE = /\.(clas\.abap|clas\.locals_imp\.abap|clas\.locals_def\.abap|clas\.testclasses\.abap|prog\.abap|intf\.abap|fugr\.abap|ddls\.asddls|bdef\.asbdef|srvd\.srvdsrv|ddlx\.asddlx)$/;
@@ -104,9 +105,13 @@ export function mergeReadiness(reports, baseline) {
104
105
  const categories = new Map();
105
106
  let blockers = 0;
106
107
  const broken = [];
108
+ const releasedApiFindings = [];
109
+ let snapshotDate = "";
107
110
  for (const r of reports) {
108
111
  blockers += r.cloudBlockerCount;
109
112
  broken.push(...r.brokenAtBaseline);
113
+ releasedApiFindings.push(...r.releasedApiFindings);
114
+ snapshotDate = r.releasedApiSnapshotDate;
110
115
  for (const c of r.categories) {
111
116
  const cur = categories.get(c.category);
112
117
  if (cur === undefined)
@@ -131,6 +136,8 @@ export function mergeReadiness(reports, baseline) {
131
136
  cloudBlockerCount: blockers,
132
137
  categories: [...categories.values()].sort((a, b) => b.count - a.count),
133
138
  brokenAtBaseline: broken,
139
+ releasedApiFindings,
140
+ releasedApiSnapshotDate: snapshotDate,
134
141
  baselineVersion: baseline,
135
142
  scopeNote: SCOPE_NOTE,
136
143
  };
@@ -155,6 +162,11 @@ export function cmdReadiness(argv, io) {
155
162
  io.out(` ${c.category.padEnd(18)} ${String(c.count).padStart(4)} ${c.label}`);
156
163
  if (merged.brokenAtBaseline.length > 0)
157
164
  io.out(`${merged.brokenAtBaseline.length} finding(s) broken at ${baseline} regardless (fix first; not migration work)`);
165
+ if (merged.releasedApiFindings.length > 0) {
166
+ io.out(`${merged.releasedApiFindings.length} released-API note(s) (snapshot ${merged.releasedApiSnapshotDate}; informational, not scored):`);
167
+ for (const f of merged.releasedApiFindings)
168
+ io.out(` ${f.file}:${f.line} [${f.state}] ${f.object}${f.successor !== undefined ? ` → ${f.successor}` : ""}`);
169
+ }
158
170
  io.out(`Note: ${merged.scopeNote}`);
159
171
  }
160
172
  const failBelow = flags.get("fail-below");
@@ -257,6 +269,29 @@ export function cmdExplain(argv, io) {
257
269
  io.out(`${d.key} — ${d.title}\n${d.shortDescription}\n${d.extendedInformation}\nDocs: ${d.docsUrl}`);
258
270
  return 0;
259
271
  }
272
+ export function cmdReleased(argv, io) {
273
+ const { flags, rest } = parseFlags(argv);
274
+ if (rest.length === 0) {
275
+ io.err("Usage: abap-mcp released <object-name…> [--type TABL|CDS_STOB|FUNC|…] [--json]");
276
+ return 2;
277
+ }
278
+ const type = typeof flags.get("type") === "string" ? flags.get("type") : undefined;
279
+ const results = rest.map((name) => {
280
+ const hit = lookupReleased(name, type);
281
+ const successor = suggestSuccessor(name);
282
+ return { ...hit, successor };
283
+ });
284
+ if (flags.has("json")) {
285
+ io.out(JSON.stringify({ snapshotDate: RELEASED_API_SNAPSHOT.snapshotDate, source: RELEASED_API_SNAPSHOT.source, results }, null, 2));
286
+ return 0;
287
+ }
288
+ io.out(`Released-API status (SAP Cloudification snapshot ${RELEASED_API_SNAPSHOT.snapshotDate}):`);
289
+ for (const r of results) {
290
+ const tail = r.successor !== undefined ? ` → use ${r.successor}` : "";
291
+ io.out(` ${r.name.padEnd(34)} ${r.state.padEnd(13)} ${(r.objectType ?? "").padEnd(9)}${tail}`);
292
+ }
293
+ return 0;
294
+ }
260
295
  export function cmdRules(argv, io) {
261
296
  const { flags } = parseFlags(argv);
262
297
  const q = flags.get("query");
@@ -275,6 +310,7 @@ Usage:
275
310
  abap-mcp readiness [paths…] ABAP Cloud readiness diff [--baseline v758] [--fail-below N] [--json]
276
311
  abap-mcp scaffold … generate a RAP managed BO (--entity --table --key [--fields n:type,…] [--no-draft] [--provided-key] [--out DIR])
277
312
  abap-mcp outline [paths…] classes/methods/forms structure [--json]
313
+ abap-mcp released <names…> released-API status from the bundled SAP snapshot [--type TABL|FUNC|…] [--json]
278
314
  abap-mcp explain <rule> explain an abaplint rule
279
315
  abap-mcp rules list rules [--query q] [--tag Security]
280
316
 
@@ -293,6 +329,8 @@ export function runCli(argv, io) {
293
329
  return cmdScaffold(rest, io);
294
330
  case "outline":
295
331
  return cmdOutline(rest, io);
332
+ case "released":
333
+ return cmdReleased(rest, io);
296
334
  case "explain":
297
335
  return cmdExplain(rest, io);
298
336
  case "rules":