arc-1 0.6.9 → 0.7.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.
Files changed (157) hide show
  1. package/README.md +12 -9
  2. package/bin/arc1-cli.js +10 -0
  3. package/bin/arc1.js +1 -1
  4. package/dist/adt/abapgit.d.ts +39 -0
  5. package/dist/adt/abapgit.d.ts.map +1 -0
  6. package/dist/adt/abapgit.js +333 -0
  7. package/dist/adt/abapgit.js.map +1 -0
  8. package/dist/adt/cds-impact.d.ts +35 -0
  9. package/dist/adt/cds-impact.d.ts.map +1 -1
  10. package/dist/adt/cds-impact.js +71 -0
  11. package/dist/adt/cds-impact.js.map +1 -1
  12. package/dist/adt/client.d.ts +4 -1
  13. package/dist/adt/client.d.ts.map +1 -1
  14. package/dist/adt/client.js +18 -5
  15. package/dist/adt/client.js.map +1 -1
  16. package/dist/adt/config.d.ts +1 -0
  17. package/dist/adt/config.d.ts.map +1 -1
  18. package/dist/adt/config.js +1 -0
  19. package/dist/adt/config.js.map +1 -1
  20. package/dist/adt/crud.d.ts.map +1 -1
  21. package/dist/adt/crud.js +74 -8
  22. package/dist/adt/crud.js.map +1 -1
  23. package/dist/adt/devtools.d.ts +39 -3
  24. package/dist/adt/devtools.d.ts.map +1 -1
  25. package/dist/adt/devtools.js +237 -25
  26. package/dist/adt/devtools.js.map +1 -1
  27. package/dist/adt/diagnostics.d.ts +69 -7
  28. package/dist/adt/diagnostics.d.ts.map +1 -1
  29. package/dist/adt/diagnostics.js +694 -36
  30. package/dist/adt/diagnostics.js.map +1 -1
  31. package/dist/adt/errors.d.ts +36 -2
  32. package/dist/adt/errors.d.ts.map +1 -1
  33. package/dist/adt/errors.js +111 -11
  34. package/dist/adt/errors.js.map +1 -1
  35. package/dist/adt/features.d.ts.map +1 -1
  36. package/dist/adt/features.js +3 -0
  37. package/dist/adt/features.js.map +1 -1
  38. package/dist/adt/gcts.d.ts +68 -0
  39. package/dist/adt/gcts.d.ts.map +1 -0
  40. package/dist/adt/gcts.js +239 -0
  41. package/dist/adt/gcts.js.map +1 -0
  42. package/dist/adt/http.d.ts.map +1 -1
  43. package/dist/adt/http.js +86 -1
  44. package/dist/adt/http.js.map +1 -1
  45. package/dist/adt/rap-handlers.d.ts +165 -0
  46. package/dist/adt/rap-handlers.d.ts.map +1 -0
  47. package/dist/adt/rap-handlers.js +835 -0
  48. package/dist/adt/rap-handlers.js.map +1 -0
  49. package/dist/adt/rap-preflight.d.ts +43 -0
  50. package/dist/adt/rap-preflight.d.ts.map +1 -0
  51. package/dist/adt/rap-preflight.js +405 -0
  52. package/dist/adt/rap-preflight.js.map +1 -0
  53. package/dist/adt/safety.d.ts +60 -33
  54. package/dist/adt/safety.d.ts.map +1 -1
  55. package/dist/adt/safety.js +204 -113
  56. package/dist/adt/safety.js.map +1 -1
  57. package/dist/adt/transport.d.ts +1 -1
  58. package/dist/adt/transport.d.ts.map +1 -1
  59. package/dist/adt/transport.js +6 -3
  60. package/dist/adt/transport.js.map +1 -1
  61. package/dist/adt/types.d.ts +225 -0
  62. package/dist/adt/types.d.ts.map +1 -1
  63. package/dist/adt/xml-parser.d.ts +15 -1
  64. package/dist/adt/xml-parser.d.ts.map +1 -1
  65. package/dist/adt/xml-parser.js +28 -15
  66. package/dist/adt/xml-parser.js.map +1 -1
  67. package/dist/authz/policy.d.ts +53 -0
  68. package/dist/authz/policy.d.ts.map +1 -0
  69. package/dist/authz/policy.js +199 -0
  70. package/dist/authz/policy.js.map +1 -0
  71. package/dist/cli-args.d.ts +14 -0
  72. package/dist/cli-args.d.ts.map +1 -0
  73. package/dist/cli-args.js +62 -0
  74. package/dist/cli-args.js.map +1 -0
  75. package/dist/cli.d.ts +13 -7
  76. package/dist/cli.d.ts.map +1 -1
  77. package/dist/cli.js +252 -55
  78. package/dist/cli.js.map +1 -1
  79. package/dist/extract-sap-cookies.d.ts +24 -0
  80. package/dist/extract-sap-cookies.d.ts.map +1 -0
  81. package/dist/extract-sap-cookies.js +317 -0
  82. package/dist/extract-sap-cookies.js.map +1 -0
  83. package/dist/handlers/hyperfocused.d.ts +4 -3
  84. package/dist/handlers/hyperfocused.d.ts.map +1 -1
  85. package/dist/handlers/hyperfocused.js +25 -16
  86. package/dist/handlers/hyperfocused.js.map +1 -1
  87. package/dist/handlers/intent.d.ts +4 -12
  88. package/dist/handlers/intent.d.ts.map +1 -1
  89. package/dist/handlers/intent.js +1448 -89
  90. package/dist/handlers/intent.js.map +1 -1
  91. package/dist/handlers/schemas.d.ts +83 -11
  92. package/dist/handlers/schemas.d.ts.map +1 -1
  93. package/dist/handlers/schemas.js +115 -4
  94. package/dist/handlers/schemas.js.map +1 -1
  95. package/dist/handlers/tools.d.ts +4 -3
  96. package/dist/handlers/tools.d.ts.map +1 -1
  97. package/dist/handlers/tools.js +342 -143
  98. package/dist/handlers/tools.js.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.js +7 -6
  101. package/dist/index.js.map +1 -1
  102. package/dist/probe/catalog.d.ts +30 -0
  103. package/dist/probe/catalog.d.ts.map +1 -0
  104. package/dist/probe/catalog.js +196 -0
  105. package/dist/probe/catalog.js.map +1 -0
  106. package/dist/probe/fixtures.d.ts +54 -0
  107. package/dist/probe/fixtures.d.ts.map +1 -0
  108. package/dist/probe/fixtures.js +94 -0
  109. package/dist/probe/fixtures.js.map +1 -0
  110. package/dist/probe/format.d.ts +10 -0
  111. package/dist/probe/format.d.ts.map +1 -0
  112. package/dist/probe/format.js +114 -0
  113. package/dist/probe/format.js.map +1 -0
  114. package/dist/probe/quality.d.ts +13 -0
  115. package/dist/probe/quality.d.ts.map +1 -0
  116. package/dist/probe/quality.js +50 -0
  117. package/dist/probe/quality.js.map +1 -0
  118. package/dist/probe/runner.d.ts +48 -0
  119. package/dist/probe/runner.d.ts.map +1 -0
  120. package/dist/probe/runner.js +211 -0
  121. package/dist/probe/runner.js.map +1 -0
  122. package/dist/probe/types.d.ts +159 -0
  123. package/dist/probe/types.d.ts.map +1 -0
  124. package/dist/probe/types.js +11 -0
  125. package/dist/probe/types.js.map +1 -0
  126. package/dist/server/audit.d.ts +26 -3
  127. package/dist/server/audit.d.ts.map +1 -1
  128. package/dist/server/audit.js +12 -1
  129. package/dist/server/audit.js.map +1 -1
  130. package/dist/server/config.d.ts +34 -19
  131. package/dist/server/config.d.ts.map +1 -1
  132. package/dist/server/config.js +327 -187
  133. package/dist/server/config.js.map +1 -1
  134. package/dist/server/deny-actions.d.ts +31 -0
  135. package/dist/server/deny-actions.d.ts.map +1 -0
  136. package/dist/server/deny-actions.js +156 -0
  137. package/dist/server/deny-actions.js.map +1 -0
  138. package/dist/server/effective-policy-log.d.ts +27 -0
  139. package/dist/server/effective-policy-log.d.ts.map +1 -0
  140. package/dist/server/effective-policy-log.js +103 -0
  141. package/dist/server/effective-policy-log.js.map +1 -0
  142. package/dist/server/http.d.ts.map +1 -1
  143. package/dist/server/http.js +15 -16
  144. package/dist/server/http.js.map +1 -1
  145. package/dist/server/server.d.ts +38 -4
  146. package/dist/server/server.d.ts.map +1 -1
  147. package/dist/server/server.js +234 -31
  148. package/dist/server/server.js.map +1 -1
  149. package/dist/server/types.d.ts +31 -13
  150. package/dist/server/types.d.ts.map +1 -1
  151. package/dist/server/types.js +11 -10
  152. package/dist/server/types.js.map +1 -1
  153. package/dist/server/xsuaa.d.ts +1 -2
  154. package/dist/server/xsuaa.d.ts.map +1 -1
  155. package/dist/server/xsuaa.js +13 -14
  156. package/dist/server/xsuaa.js.map +1 -1
  157. package/package.json +9 -3
package/README.md CHANGED
@@ -14,12 +14,13 @@ Built for organizations that need AI-assisted SAP development with guardrails. I
14
14
 
15
15
  ### Security & Admin Controls
16
16
 
17
- - **Safe by default** — read-only, no free SQL, no table preview, no transports out of the box. Use `--profile developer` or explicit flags to enable capabilities
18
- - **Operation allowlists/denylists** — control exactly which operation types (read, write, search, query, activate, transport) are permitted
17
+ - **Safe by default** — read-only, no free SQL, no table preview, no transport writes, no Git writes. Enable each capability with explicit `SAP_ALLOW_*` flags
18
+ - **Action deny list** — block specific tool actions with `SAP_DENY_ACTIONS` (for example `SAPWrite.delete`), without exposing low-level operation codes to admins
19
19
  - **Package restrictions** — limit AI write operations (create, update, delete) to specific packages with wildcards (`--allowed-packages "Z*,$TMP"`). Read operations are not restricted by package — use SAP's native authorization for read-level access control
20
- - **Data access control** — enable table data preview (`--block-data=false`) or free-form SQL (`--block-free-sql=false`)
21
- - **Transport safety** — require transport assignments, restrict to specific transports, or make transports read-only. Update/delete operations auto-use the lock correction number when no explicit transport is provided
22
- - **Safety profiles** — preconfigured roles: `viewer`, `viewer-data`, `viewer-sql`, `developer`, `developer-data`, `developer-sql`
20
+ - **Data access control** — enable table data preview (`--allow-data-preview=true`) or free-form SQL (`--allow-free-sql=true`) only when needed
21
+ - **Transport safety** — transport reads are available for review, while transport mutations require both `--allow-writes` and `--allow-transport-writes`. Update/delete operations auto-use the lock correction number when no explicit transport is provided
22
+ - **Git workflow safety** — Git operations are disabled by default. Enable explicitly with `--allow-git-writes` / `SAP_ALLOW_GIT_WRITES=true`
23
+ - **API-key profiles** — multi-key HTTP deployments can assign `viewer`, `viewer-data`, `viewer-sql`, `developer`, `developer-data`, `developer-sql`, or `admin` per key
23
24
  - **Writes restricted to `$TMP` when enabled** — only local/throwaway objects; writing to transportable packages requires explicit `--allowed-packages`
24
25
 
25
26
  ### Authentication
@@ -42,7 +43,7 @@ Deploy ARC-1 as a Cloud Foundry app on SAP BTP with full platform integration:
42
43
 
43
44
  ### Token Efficiency
44
45
 
45
- - **11 intent-based tools** (~5K schema tokens) instead of 200+ individual tools — keeps the LLM's context window small
46
+ - **12 intent-based tools** (~5K schema tokens) instead of 200+ individual tools — keeps the LLM's context window small
46
47
  - **Method-level read/edit** — read or update a single class method, not the whole source (up to 20x fewer tokens)
47
48
  - **Context compression** — `SAPContext` returns public API contracts of all dependencies in one call (7-30x compression)
48
49
 
@@ -66,7 +67,7 @@ See **[docs/caching.md](docs/caching.md)** for full documentation.
66
67
 
67
68
  ### Tools Refined for Real-World Usage
68
69
 
69
- The 11 tools are designed from real LLM interaction feedback:
70
+ The 12 tools are designed from real LLM interaction feedback:
70
71
 
71
72
  | Tool | What it does |
72
73
  |------|-------------|
@@ -77,6 +78,7 @@ The 11 tools are designed from real LLM interaction feedback:
77
78
  | **SAPNavigate** | Go-to-definition, find references, code completion |
78
79
  | **SAPQuery** | Execute ABAP SQL with table-not-found suggestions |
79
80
  | **SAPTransport** | CTS transport management (list/create/release/delete/reassign), transport requirement checks, and reverse lookup history (`action="history"`) |
81
+ | **SAPGit** | Git-based ABAP workflows across gCTS and abapGit (list/clone/pull/push/commit/branch/unlink) with backend auto-selection and safety gating (`--allow-git-writes`) |
80
82
  | **SAPContext** | Compressed dependency context (`action="deps"`), reverse dependency lookup (`action="usages"`), and CDS upstream/downstream impact analysis (`action="impact"` for DDLS) |
81
83
  | **SAPLint** | Local ABAP lint (system-aware presets, auto-fix, pre-write validation) + ADT PrettyPrint (server-side formatting) |
82
84
  | **SAPDiagnose** | Syntax check, ABAP Unit tests, ATC code quality, short dumps, profiler traces |
@@ -88,10 +90,11 @@ Tool definitions automatically adapt to the target system (BTP vs on-premise), r
88
90
 
89
91
  ARC-1 probes the SAP system at startup and adapts its behavior:
90
92
 
91
- - Detects HANA, abapGit, RAP/CDS, AMDP, UI5, and transport availability
93
+ - Detects HANA, gCTS, abapGit, RAP/CDS, AMDP, UI5, and transport availability
92
94
  - Auto-detects BTP vs on-premise systems
93
95
  - Maps SAP_BASIS release to the correct ABAP language version
94
96
  - Each feature can be forced on/off or left on auto-detect
97
+ - In shared-credential mode (technical user), runs a startup auth preflight once and blocks SAP tool calls with a clear error on 401/403 to avoid repeated failed logins and potential user lockout
95
98
 
96
99
  ## Quick Start
97
100
 
@@ -115,7 +118,7 @@ Full documentation is available at **[marianfoo.github.io/arc-1](https://marianf
115
118
  | [Configuration](https://marianfoo.github.io/arc-1/configuration-reference/) | Every flag and env var, one table |
116
119
  | [Updating](https://marianfoo.github.io/arc-1/updating/) | Update procedures per install method |
117
120
  | [Enterprise Auth](https://marianfoo.github.io/arc-1/enterprise-auth/) | Layer A / Layer B auth internals, coexistence matrix |
118
- | [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all 11 tools |
121
+ | [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all 12 tools |
119
122
  | [Architecture](https://marianfoo.github.io/arc-1/architecture/) | System architecture with diagrams |
120
123
  | [AI Usage Patterns](https://marianfoo.github.io/arc-1/mcp-usage/) | Agent workflow patterns and best practices |
121
124
 
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+
3
+ // ARC-1 CLI — direct tool invocation entry point
4
+ // Delegates to compiled TypeScript (dist/cli.js).
5
+ //
6
+ // This bin is separate from `arc1` because the MCP server entry (`bin/arc1.js` → dist/index.js)
7
+ // must own stdin/stdout cleanly for the JSON-RPC stream. `arc1-cli` is for command-line use
8
+ // (read, activate, syntax, call, extract-cookies, …) and exits after a single invocation.
9
+
10
+ import('../dist/cli.js');
package/bin/arc1.js CHANGED
@@ -9,4 +9,4 @@
9
9
  // that could interfere with the JSON-RPC stream.
10
10
  // (Learned from fr0ster/mcp-abap-adt bin/mcp-abap-adt.js)
11
11
 
12
- import('../dist/index.js');
12
+ import('../dist/cli.js');
@@ -0,0 +1,39 @@
1
+ /**
2
+ * abapGit ADT bridge client helpers.
3
+ *
4
+ * Bridge endpoints live under /sap/bc/adt/abapgit/* and use XML payloads.
5
+ */
6
+ import type { AdtHttpClient } from './http.js';
7
+ import { type SafetyConfig } from './safety.js';
8
+ import type { AbapGitExternalInfo, AbapGitObject, AbapGitRepo, AbapGitStaging } from './types.js';
9
+ export declare function parseAbapGitRepos(xml: string): AbapGitRepo[];
10
+ export declare function parseAbapGitExternalInfo(xml: string): AbapGitExternalInfo;
11
+ export declare function parseAbapGitObjects(xml: string): AbapGitObject[];
12
+ export declare function listRepos(http: AdtHttpClient, safety: SafetyConfig): Promise<AbapGitRepo[]>;
13
+ export declare function getExternalInfo(http: AdtHttpClient, safety: SafetyConfig, url: string, user?: string, password?: string): Promise<AbapGitExternalInfo>;
14
+ export declare function createRepo(http: AdtHttpClient, safety: SafetyConfig, params: {
15
+ package: string;
16
+ url: string;
17
+ branchName?: string;
18
+ transportRequest?: string;
19
+ user?: string;
20
+ password?: string;
21
+ }): Promise<AbapGitRepo[]>;
22
+ export declare function pullRepo(http: AdtHttpClient, safety: SafetyConfig, repoId: string, params?: {
23
+ package?: string;
24
+ url?: string;
25
+ branchName?: string;
26
+ transportRequest?: string;
27
+ user?: string;
28
+ password?: string;
29
+ }): Promise<AbapGitObject[]>;
30
+ export declare function unlinkRepo(http: AdtHttpClient, safety: SafetyConfig, repoId: string): Promise<void>;
31
+ export declare function stageRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo): Promise<AbapGitStaging>;
32
+ export declare function pushRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo, staging: AbapGitStaging): Promise<void>;
33
+ export declare function checkRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo): Promise<{
34
+ ok: boolean;
35
+ message: string | null;
36
+ }>;
37
+ export declare function switchBranch(http: AdtHttpClient, safety: SafetyConfig, repoId: string, branch: string, create?: boolean): Promise<void>;
38
+ export declare function createBranch(http: AdtHttpClient, safety: SafetyConfig, repoId: string, branch: string): Promise<void>;
39
+ //# sourceMappingURL=abapgit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abapgit.d.ts","sourceRoot":"","sources":["../../src/adt/abapgit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * abapGit ADT bridge client helpers.
3
+ *
4
+ * Bridge endpoints live under /sap/bc/adt/abapgit/* and use XML payloads.
5
+ */
6
+ import { AdtApiError, classifyAbapgitError } from './errors.js';
7
+ import { checkGit, checkOperation, checkPackage, OperationType } from './safety.js';
8
+ import { escapeXmlAttr, findDeepNodes, parseXml } from './xml-parser.js';
9
+ const ABAPGIT_BASE = '/sap/bc/adt/abapgit';
10
+ const REPOS_V2 = 'application/abapgit.adt.repos.v2+xml';
11
+ const REPO_V3 = 'application/abapgit.adt.repo.v3+xml';
12
+ const REPO_STAGE_V1 = 'application/abapgit.adt.repo.stage.v1+xml';
13
+ const EXTERNAL_INFO_REQUEST_V2 = 'application/abapgit.adt.repo.info.ext.request.v2+xml';
14
+ const EXTERNAL_INFO_RESPONSE_V2 = 'application/abapgit.adt.repo.info.ext.response.v2+xml';
15
+ function boolish(value) {
16
+ if (value === true || value === false)
17
+ return value;
18
+ const norm = String(value ?? '')
19
+ .trim()
20
+ .toLowerCase();
21
+ if (!norm)
22
+ return undefined;
23
+ if (norm === 'true' || norm === 'x' || norm === '1')
24
+ return true;
25
+ if (norm === 'false' || norm === '0')
26
+ return false;
27
+ return undefined;
28
+ }
29
+ function field(node, ...keys) {
30
+ for (const key of keys) {
31
+ const attr = node[`@_${key}`];
32
+ if (attr !== undefined && attr !== null && String(attr).trim() !== '')
33
+ return String(attr);
34
+ const direct = node[key];
35
+ if (typeof direct === 'string' && direct.trim() !== '')
36
+ return direct;
37
+ if (typeof direct === 'object' && direct !== null) {
38
+ const text = direct['#text'];
39
+ if (typeof text === 'string' && text.trim() !== '')
40
+ return text;
41
+ }
42
+ }
43
+ return undefined;
44
+ }
45
+ function encodePassword(password) {
46
+ return Buffer.from(password, 'utf-8').toString('base64');
47
+ }
48
+ function authHeaders(user, password) {
49
+ if (!user || !password)
50
+ return {};
51
+ return {
52
+ Username: user,
53
+ Password: encodePassword(password),
54
+ };
55
+ }
56
+ function absolutizeLink(href) {
57
+ if (/^https?:\/\//i.test(href)) {
58
+ const u = new URL(href);
59
+ return `${u.pathname}${u.search}`;
60
+ }
61
+ if (href.startsWith('/'))
62
+ return href;
63
+ return `${ABAPGIT_BASE}/${href}`;
64
+ }
65
+ function findRepoLink(repo, type) {
66
+ const relNeedle = type.replace('_link', '');
67
+ const link = repo.links.find((candidate) => {
68
+ const rel = candidate.rel.toLowerCase();
69
+ const href = candidate.href.toLowerCase();
70
+ const candidateType = (candidate.type ?? '').toLowerCase();
71
+ if (candidateType === type)
72
+ return true;
73
+ if (rel.endsWith(`/${relNeedle}`) || rel.includes(`/${relNeedle}/`))
74
+ return true;
75
+ if (relNeedle === 'check') {
76
+ if (rel.endsWith('/checks') || rel.includes('/checks/'))
77
+ return true;
78
+ if (href.endsWith('/checks') || href.includes('/checks/'))
79
+ return true;
80
+ }
81
+ return href.endsWith(`/${relNeedle}`) || href.includes(`/${relNeedle}/`);
82
+ });
83
+ if (!link) {
84
+ throw new Error(`abapGit repository ${repo.key} does not expose a ${type} HATEOAS link.`);
85
+ }
86
+ return {
87
+ ...link,
88
+ href: absolutizeLink(link.href),
89
+ };
90
+ }
91
+ function parseAbapGitLinks(node) {
92
+ const links = findDeepNodes(node, 'link');
93
+ return links
94
+ .map((link) => ({
95
+ rel: field(link, 'rel') ?? '',
96
+ href: field(link, 'href') ?? '',
97
+ type: field(link, 'type'),
98
+ title: field(link, 'title'),
99
+ }))
100
+ .filter((link) => Boolean(link.rel) && Boolean(link.href));
101
+ }
102
+ export function parseAbapGitRepos(xml) {
103
+ const parsed = parseXml(xml);
104
+ const repositories = findDeepNodes(parsed, 'repository');
105
+ return repositories
106
+ .map((repo) => {
107
+ const links = parseAbapGitLinks(repo);
108
+ const writeProtected = boolish(field(repo, 'writeProtected', 'write_protected'));
109
+ return {
110
+ key: field(repo, 'key', 'repoKey', 'id') ?? '',
111
+ package: field(repo, 'package', 'packageName') ?? '',
112
+ url: field(repo, 'url') ?? '',
113
+ branchName: field(repo, 'branchName', 'branch_name', 'branch') ?? '',
114
+ selectedBranch: field(repo, 'selectedBranch', 'selected_branch'),
115
+ deserializedBy: field(repo, 'deserializedBy', 'deserialized_by'),
116
+ ...(writeProtected !== undefined ? { writeProtected } : {}),
117
+ createdBy: field(repo, 'createdBy', 'created_by'),
118
+ createdAt: field(repo, 'createdAt', 'created_at'),
119
+ dotAbapGit: field(repo, 'dotAbapGit', 'dot_abapgit'),
120
+ links,
121
+ };
122
+ })
123
+ .filter((repo) => repo.key && repo.package && repo.url);
124
+ }
125
+ export function parseAbapGitExternalInfo(xml) {
126
+ const parsed = parseXml(xml);
127
+ const infoNode = findDeepNodes(parsed, 'externalRepoInfo')[0] ?? parsed;
128
+ const branches = findDeepNodes(infoNode, 'branch').map((branch) => {
129
+ const name = field(branch, 'name', 'branchName', 'displayName') ?? '';
130
+ return {
131
+ name,
132
+ isHead: boolish(field(branch, 'head', 'isHead')),
133
+ sha1: field(branch, 'sha1', 'hash'),
134
+ };
135
+ });
136
+ const userNode = findDeepNodes(infoNode, 'user')[0];
137
+ const user = userNode
138
+ ? {
139
+ name: field(userNode, 'name', 'user'),
140
+ email: field(userNode, 'email', 'mail'),
141
+ }
142
+ : undefined;
143
+ return {
144
+ accessMode: field(infoNode, 'accessMode', 'access_mode'),
145
+ defaultBranch: field(infoNode, 'defaultBranch', 'default_branch'),
146
+ selectedBranch: field(infoNode, 'selectedBranch', 'selected_branch'),
147
+ branches: branches.filter((branch) => branch.name),
148
+ ...(user ? { user } : {}),
149
+ };
150
+ }
151
+ export function parseAbapGitObjects(xml) {
152
+ const parsed = parseXml(xml);
153
+ const objectNodes = findDeepNodes(parsed, 'object');
154
+ return objectNodes.map((node) => ({
155
+ type: field(node, 'type'),
156
+ name: field(node, 'name'),
157
+ package: field(node, 'package', 'packageName'),
158
+ path: field(node, 'path'),
159
+ state: field(node, 'state'),
160
+ operation: field(node, 'operation'),
161
+ }));
162
+ }
163
+ async function requestAbapGit(path, run) {
164
+ try {
165
+ return await run();
166
+ }
167
+ catch (err) {
168
+ if (err instanceof AdtApiError) {
169
+ const parsed = classifyAbapgitError(err.responseBody ?? '');
170
+ if (parsed.message || parsed.namespace) {
171
+ const detail = [parsed.namespace ? `[${parsed.namespace}]` : undefined, parsed.message]
172
+ .filter(Boolean)
173
+ .join(' ');
174
+ throw new AdtApiError(detail, err.statusCode, err.path || path, err.responseBody);
175
+ }
176
+ }
177
+ throw err;
178
+ }
179
+ }
180
+ function buildRepoPayloadXml(params) {
181
+ return `<?xml version="1.0" encoding="UTF-8"?>
182
+ <abapgitrepo:repository xmlns:abapgitrepo="http://www.sap.com/adt/abapgit/repository">
183
+ <abapgitrepo:package>${escapeXmlAttr(params.package)}</abapgitrepo:package>
184
+ <abapgitrepo:url>${escapeXmlAttr(params.url)}</abapgitrepo:url>
185
+ ${params.branchName ? `<abapgitrepo:branchName>${escapeXmlAttr(params.branchName)}</abapgitrepo:branchName>` : ''}
186
+ ${params.transportRequest ? `<abapgitrepo:transportRequest>${escapeXmlAttr(params.transportRequest)}</abapgitrepo:transportRequest>` : ''}
187
+ ${params.user ? `<abapgitrepo:remoteUser>${escapeXmlAttr(params.user)}</abapgitrepo:remoteUser>` : ''}
188
+ ${params.password ? `<abapgitrepo:remotePassword>${escapeXmlAttr(params.password)}</abapgitrepo:remotePassword>` : ''}
189
+ </abapgitrepo:repository>`;
190
+ }
191
+ function buildExternalInfoRequestXml(url, user, password) {
192
+ return `<?xml version="1.0" encoding="UTF-8"?>
193
+ <abapgitexternalrepo:externalRepoInfoRequest xmlns:abapgitexternalrepo="http://www.sap.com/adt/abapgit/externalRepo">
194
+ <abapgitexternalrepo:url>${escapeXmlAttr(url)}</abapgitexternalrepo:url>
195
+ ${user ? `<abapgitexternalrepo:remoteUser>${escapeXmlAttr(user)}</abapgitexternalrepo:remoteUser>` : ''}
196
+ ${password ? `<abapgitexternalrepo:remotePassword>${escapeXmlAttr(password)}</abapgitexternalrepo:remotePassword>` : ''}
197
+ </abapgitexternalrepo:externalRepoInfoRequest>`;
198
+ }
199
+ function buildStagingPayloadXml(staging) {
200
+ const objects = (staging.objects ?? [])
201
+ .map((object) => {
202
+ const attrs = [
203
+ object.type ? `type="${escapeXmlAttr(object.type)}"` : '',
204
+ object.name ? `name="${escapeXmlAttr(object.name)}"` : '',
205
+ object.package ? `package="${escapeXmlAttr(object.package)}"` : '',
206
+ object.path ? `path="${escapeXmlAttr(object.path)}"` : '',
207
+ object.state ? `state="${escapeXmlAttr(object.state)}"` : '',
208
+ object.operation ? `operation="${escapeXmlAttr(object.operation)}"` : '',
209
+ ]
210
+ .filter(Boolean)
211
+ .join(' ');
212
+ return ` <abapgitrepo:object ${attrs}/>`;
213
+ })
214
+ .join('\n');
215
+ return `<?xml version="1.0" encoding="UTF-8"?>
216
+ <abapgitrepo:objects xmlns:abapgitrepo="http://www.sap.com/adt/abapgit/repository">
217
+ ${objects}
218
+ </abapgitrepo:objects>`;
219
+ }
220
+ export async function listRepos(http, safety) {
221
+ checkOperation(safety, OperationType.Read, 'AbapGitListRepos');
222
+ const path = `${ABAPGIT_BASE}/repos`;
223
+ const resp = await requestAbapGit(path, () => http.get(path, { Accept: REPOS_V2 }));
224
+ return parseAbapGitRepos(resp.body);
225
+ }
226
+ export async function getExternalInfo(http, safety, url, user, password) {
227
+ checkOperation(safety, OperationType.Read, 'AbapGitExternalInfo');
228
+ const path = `${ABAPGIT_BASE}/externalrepoinfo`;
229
+ const body = buildExternalInfoRequestXml(url, user, password);
230
+ const resp = await requestAbapGit(path, () => http.post(path, body, EXTERNAL_INFO_REQUEST_V2, {
231
+ Accept: EXTERNAL_INFO_RESPONSE_V2,
232
+ ...authHeaders(user, password),
233
+ }));
234
+ return parseAbapGitExternalInfo(resp.body);
235
+ }
236
+ export async function createRepo(http, safety, params) {
237
+ checkOperation(safety, OperationType.Create, 'AbapGitCreateRepo');
238
+ checkGit(safety, 'clone');
239
+ checkPackage(safety, params.package);
240
+ const path = `${ABAPGIT_BASE}/repos`;
241
+ const body = buildRepoPayloadXml(params);
242
+ const resp = await requestAbapGit(path, () => http.post(path, body, REPO_V3, {
243
+ Accept: REPO_V3,
244
+ ...authHeaders(params.user, params.password),
245
+ }));
246
+ return parseAbapGitRepos(resp.body);
247
+ }
248
+ export async function pullRepo(http, safety, repoId, params = {}) {
249
+ checkOperation(safety, OperationType.Update, 'AbapGitPullRepo');
250
+ checkGit(safety, 'pull');
251
+ const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}/pull`;
252
+ const body = buildRepoPayloadXml({
253
+ package: params.package ?? '$TMP',
254
+ url: params.url ?? '',
255
+ branchName: params.branchName,
256
+ transportRequest: params.transportRequest,
257
+ user: params.user,
258
+ password: params.password,
259
+ });
260
+ const resp = await requestAbapGit(path, () => http.post(path, body, REPO_V3, {
261
+ Accept: REPO_STAGE_V1,
262
+ ...authHeaders(params.user, params.password),
263
+ }));
264
+ return parseAbapGitObjects(resp.body);
265
+ }
266
+ export async function unlinkRepo(http, safety, repoId) {
267
+ checkOperation(safety, OperationType.Delete, 'AbapGitUnlinkRepo');
268
+ checkGit(safety, 'unlink');
269
+ const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}`;
270
+ await requestAbapGit(path, () => http.delete(path, { Accept: REPO_V3 }));
271
+ }
272
+ export async function stageRepo(http, safety, repo) {
273
+ checkOperation(safety, OperationType.Update, 'AbapGitStageRepo');
274
+ checkGit(safety, 'stage');
275
+ const link = findRepoLink(repo, 'stage_link');
276
+ const resp = await requestAbapGit(link.href, () => http.get(link.href, {
277
+ Accept: REPO_STAGE_V1,
278
+ 'Content-Type': REPO_STAGE_V1,
279
+ }));
280
+ const objects = parseAbapGitObjects(resp.body).map((object) => object);
281
+ return {
282
+ repoKey: repo.key,
283
+ branchName: repo.branchName,
284
+ objects,
285
+ };
286
+ }
287
+ export async function pushRepo(http, safety, repo, staging) {
288
+ checkOperation(safety, OperationType.Update, 'AbapGitPushRepo');
289
+ checkGit(safety, 'push');
290
+ const link = findRepoLink(repo, 'push_link');
291
+ const body = buildStagingPayloadXml(staging);
292
+ await requestAbapGit(link.href, () => http.post(link.href, body, REPO_STAGE_V1, {
293
+ Accept: REPO_STAGE_V1,
294
+ }));
295
+ }
296
+ export async function checkRepo(http, safety, repo) {
297
+ checkOperation(safety, OperationType.Read, 'AbapGitCheckRepo');
298
+ const link = findRepoLink(repo, 'check_link');
299
+ // Live trial returns 5xx with `<namespace id="org.abapgit.adt"/>` + message like
300
+ // "HTTP error 421" when the remote Git registry is unreachable. That's diagnostic
301
+ // info the LLM should see — normalise to {ok:false,message} rather than throwing.
302
+ let resp;
303
+ try {
304
+ resp = await http.post(link.href, '', undefined, { Accept: REPO_V3 });
305
+ }
306
+ catch (err) {
307
+ if (err instanceof AdtApiError) {
308
+ const parsed = classifyAbapgitError(err.responseBody ?? '');
309
+ if (parsed.namespace === 'org.abapgit.adt') {
310
+ return { ok: false, message: parsed.message ?? AdtApiError.extractCleanMessage(err.responseBody ?? '') };
311
+ }
312
+ }
313
+ throw err;
314
+ }
315
+ if (!resp.body || resp.body.trim().length === 0) {
316
+ return { ok: true, message: null };
317
+ }
318
+ const parsed = classifyAbapgitError(resp.body);
319
+ return {
320
+ ok: false,
321
+ message: parsed.message ?? AdtApiError.extractCleanMessage(resp.body),
322
+ };
323
+ }
324
+ export async function switchBranch(http, safety, repoId, branch, create = false) {
325
+ checkOperation(safety, OperationType.Update, 'AbapGitSwitchBranch');
326
+ checkGit(safety, create ? 'create_branch' : 'switch_branch');
327
+ const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}/branches/${encodeURIComponent(branch)}?create=${create ? 'true' : 'false'}`;
328
+ await requestAbapGit(path, () => http.post(path, '', undefined, { Accept: REPO_V3 }));
329
+ }
330
+ export async function createBranch(http, safety, repoId, branch) {
331
+ await switchBranch(http, safety, repoId, branch, true);
332
+ }
333
+ //# sourceMappingURL=abapgit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abapgit.js","sourceRoot":"","sources":["../../src/adt/abapgit.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,44 @@ export interface CdsImpactDownstream {
17
17
  byBucket: Record<string, number>;
18
18
  };
19
19
  }
20
+ export interface SiblingExtensionCandidate {
21
+ name: string;
22
+ packageName: string;
23
+ metadataExtensions: number;
24
+ }
25
+ export interface SiblingExtensionFindingInput {
26
+ targetName: string;
27
+ targetPackageName?: string;
28
+ stem: string;
29
+ targetMetadataExtensions: number;
30
+ siblings: SiblingExtensionCandidate[];
31
+ }
32
+ export interface SiblingExtensionFinding {
33
+ code: 'SIBLING_METADATA_EXTENSION_MISMATCH';
34
+ targetName: string;
35
+ targetPackageName?: string;
36
+ stem: string;
37
+ siblingsWithMetadataExtensions: SiblingExtensionCandidate[];
38
+ message: string;
39
+ }
20
40
  interface ClassifyOptions {
21
41
  includeIndirect?: boolean;
22
42
  }
23
43
  export declare function classifyCdsImpact(results: WhereUsedResult[], options?: ClassifyOptions): CdsImpactDownstream;
44
+ /**
45
+ * Derive a conservative sibling stem from a DDLS object name.
46
+ * Example: ZI_SALESDATA3 -> ZI_SALESDATA
47
+ */
48
+ export declare function deriveSiblingStem(name: string): string;
49
+ /**
50
+ * Conservative sibling matcher: same stem, not the same object, and only
51
+ * empty-or-numeric suffixes after the stem.
52
+ */
53
+ export declare function isSiblingNameMatch(targetName: string, candidateName: string, stem: string): boolean;
54
+ /**
55
+ * Build a sibling-extension consistency finding when the target has no DDLX
56
+ * consumers but one or more siblings do.
57
+ */
58
+ export declare function buildSiblingExtensionFinding(input: SiblingExtensionFindingInput): SiblingExtensionFinding | null;
24
59
  export {};
25
60
  //# sourceMappingURL=cds-impact.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cds-impact.d.ts","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,UAAU,eAAe;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAwD5G"}
1
+ {"version":3,"file":"cds-impact.d.ts","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB,EAAE,MAAM,CAAC;IACjC,QAAQ,EAAE,yBAAyB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qCAAqC,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B,EAAE,yBAAyB,EAAE,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAwD5G;AAgCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAiBnG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,4BAA4B,GAAG,uBAAuB,GAAG,IAAI,CA+BhH"}
@@ -88,4 +88,75 @@ function bucketForType(type) {
88
88
  return 'other';
89
89
  }
90
90
  }
91
+ /**
92
+ * Derive a conservative sibling stem from a DDLS object name.
93
+ * Example: ZI_SALESDATA3 -> ZI_SALESDATA
94
+ */
95
+ export function deriveSiblingStem(name) {
96
+ const normalized = normalizeName(name);
97
+ if (!normalized)
98
+ return '';
99
+ const withoutNumericSuffix = normalized.replace(/\d+$/, '');
100
+ return withoutNumericSuffix || normalized;
101
+ }
102
+ /**
103
+ * Conservative sibling matcher: same stem, not the same object, and only
104
+ * empty-or-numeric suffixes after the stem.
105
+ */
106
+ export function isSiblingNameMatch(targetName, candidateName, stem) {
107
+ const target = normalizeName(targetName);
108
+ const candidate = normalizeName(candidateName);
109
+ const normalizedStem = deriveSiblingStem(stem);
110
+ if (!target || !candidate || !normalizedStem)
111
+ return false;
112
+ if (target === candidate)
113
+ return false;
114
+ if (!target.startsWith(normalizedStem) || !candidate.startsWith(normalizedStem))
115
+ return false;
116
+ const targetSuffix = target.slice(normalizedStem.length);
117
+ const candidateSuffix = candidate.slice(normalizedStem.length);
118
+ if (!isNumericVariantSuffix(targetSuffix) || !isNumericVariantSuffix(candidateSuffix)) {
119
+ return false;
120
+ }
121
+ return targetSuffix !== candidateSuffix;
122
+ }
123
+ /**
124
+ * Build a sibling-extension consistency finding when the target has no DDLX
125
+ * consumers but one or more siblings do.
126
+ */
127
+ export function buildSiblingExtensionFinding(input) {
128
+ if (input.targetMetadataExtensions > 0)
129
+ return null;
130
+ const siblingsWithMetadataExtensions = input.siblings
131
+ .filter((sibling) => sibling.metadataExtensions > 0)
132
+ .sort((left, right) => {
133
+ if (right.metadataExtensions !== left.metadataExtensions) {
134
+ return right.metadataExtensions - left.metadataExtensions;
135
+ }
136
+ return left.name.localeCompare(right.name);
137
+ });
138
+ if (siblingsWithMetadataExtensions.length === 0)
139
+ return null;
140
+ const siblingSummary = siblingsWithMetadataExtensions
141
+ .map((sibling) => `${sibling.name} (${sibling.metadataExtensions})`)
142
+ .join(', ');
143
+ const packageHint = input.targetPackageName ? ` in package ${input.targetPackageName}` : '';
144
+ const message = `Possible sibling metadata-extension inconsistency${packageHint}: ` +
145
+ `${input.targetName} has 0 DDLX consumers while sibling DDLS for stem "${input.stem}" have DDLX consumers ` +
146
+ `(${siblingSummary}).`;
147
+ return {
148
+ code: 'SIBLING_METADATA_EXTENSION_MISMATCH',
149
+ targetName: input.targetName,
150
+ targetPackageName: input.targetPackageName,
151
+ stem: input.stem,
152
+ siblingsWithMetadataExtensions,
153
+ message,
154
+ };
155
+ }
156
+ function normalizeName(value) {
157
+ return String(value).trim().toUpperCase();
158
+ }
159
+ function isNumericVariantSuffix(value) {
160
+ return value.length === 0 || /^\d+$/.test(value);
161
+ }
91
162
  //# sourceMappingURL=cds-impact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cds-impact.js","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cds-impact.js","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"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"}