arc-1 0.6.8 → 0.6.10

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 (113) hide show
  1. package/README.md +21 -15
  2. package/dist/adt/abapgit.d.ts +39 -0
  3. package/dist/adt/abapgit.d.ts.map +1 -0
  4. package/dist/adt/abapgit.js +333 -0
  5. package/dist/adt/abapgit.js.map +1 -0
  6. package/dist/adt/cds-impact.d.ts +25 -0
  7. package/dist/adt/cds-impact.d.ts.map +1 -0
  8. package/dist/adt/cds-impact.js +91 -0
  9. package/dist/adt/cds-impact.js.map +1 -0
  10. package/dist/adt/client.d.ts +15 -1
  11. package/dist/adt/client.d.ts.map +1 -1
  12. package/dist/adt/client.js +84 -1
  13. package/dist/adt/client.js.map +1 -1
  14. package/dist/adt/codeintel.d.ts +8 -0
  15. package/dist/adt/codeintel.d.ts.map +1 -1
  16. package/dist/adt/codeintel.js +33 -0
  17. package/dist/adt/codeintel.js.map +1 -1
  18. package/dist/adt/config.d.ts +3 -0
  19. package/dist/adt/config.d.ts.map +1 -1
  20. package/dist/adt/config.js +1 -0
  21. package/dist/adt/config.js.map +1 -1
  22. package/dist/adt/cookies.d.ts +5 -0
  23. package/dist/adt/cookies.d.ts.map +1 -1
  24. package/dist/adt/cookies.js +14 -0
  25. package/dist/adt/cookies.js.map +1 -1
  26. package/dist/adt/crud.d.ts.map +1 -1
  27. package/dist/adt/crud.js +49 -3
  28. package/dist/adt/crud.js.map +1 -1
  29. package/dist/adt/devtools.d.ts +11 -0
  30. package/dist/adt/devtools.d.ts.map +1 -1
  31. package/dist/adt/devtools.js +33 -0
  32. package/dist/adt/devtools.js.map +1 -1
  33. package/dist/adt/errors.d.ts +22 -1
  34. package/dist/adt/errors.d.ts.map +1 -1
  35. package/dist/adt/errors.js +71 -2
  36. package/dist/adt/errors.js.map +1 -1
  37. package/dist/adt/features.d.ts.map +1 -1
  38. package/dist/adt/features.js +3 -0
  39. package/dist/adt/features.js.map +1 -1
  40. package/dist/adt/gcts.d.ts +68 -0
  41. package/dist/adt/gcts.d.ts.map +1 -0
  42. package/dist/adt/gcts.js +239 -0
  43. package/dist/adt/gcts.js.map +1 -0
  44. package/dist/adt/http.d.ts +2 -0
  45. package/dist/adt/http.d.ts.map +1 -1
  46. package/dist/adt/http.js +33 -1
  47. package/dist/adt/http.js.map +1 -1
  48. package/dist/adt/safety.d.ts +3 -0
  49. package/dist/adt/safety.d.ts.map +1 -1
  50. package/dist/adt/safety.js +9 -0
  51. package/dist/adt/safety.js.map +1 -1
  52. package/dist/adt/transport.d.ts +26 -0
  53. package/dist/adt/transport.d.ts.map +1 -1
  54. package/dist/adt/transport.js +64 -1
  55. package/dist/adt/transport.js.map +1 -1
  56. package/dist/adt/types.d.ts +226 -0
  57. package/dist/adt/types.d.ts.map +1 -1
  58. package/dist/adt/xml-parser.d.ts +21 -1
  59. package/dist/adt/xml-parser.d.ts.map +1 -1
  60. package/dist/adt/xml-parser.js +175 -0
  61. package/dist/adt/xml-parser.js.map +1 -1
  62. package/dist/cli.js +5 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/handlers/intent.d.ts.map +1 -1
  65. package/dist/handlers/intent.js +439 -10
  66. package/dist/handlers/intent.js.map +1 -1
  67. package/dist/handlers/schemas.d.ts +104 -38
  68. package/dist/handlers/schemas.d.ts.map +1 -1
  69. package/dist/handlers/schemas.js +98 -22
  70. package/dist/handlers/schemas.js.map +1 -1
  71. package/dist/handlers/tools.d.ts +4 -3
  72. package/dist/handlers/tools.d.ts.map +1 -1
  73. package/dist/handlers/tools.js +195 -46
  74. package/dist/handlers/tools.js.map +1 -1
  75. package/dist/probe/catalog.d.ts +30 -0
  76. package/dist/probe/catalog.d.ts.map +1 -0
  77. package/dist/probe/catalog.js +196 -0
  78. package/dist/probe/catalog.js.map +1 -0
  79. package/dist/probe/fixtures.d.ts +54 -0
  80. package/dist/probe/fixtures.d.ts.map +1 -0
  81. package/dist/probe/fixtures.js +94 -0
  82. package/dist/probe/fixtures.js.map +1 -0
  83. package/dist/probe/format.d.ts +10 -0
  84. package/dist/probe/format.d.ts.map +1 -0
  85. package/dist/probe/format.js +114 -0
  86. package/dist/probe/format.js.map +1 -0
  87. package/dist/probe/quality.d.ts +13 -0
  88. package/dist/probe/quality.d.ts.map +1 -0
  89. package/dist/probe/quality.js +50 -0
  90. package/dist/probe/quality.js.map +1 -0
  91. package/dist/probe/runner.d.ts +48 -0
  92. package/dist/probe/runner.d.ts.map +1 -0
  93. package/dist/probe/runner.js +211 -0
  94. package/dist/probe/runner.js.map +1 -0
  95. package/dist/probe/types.d.ts +159 -0
  96. package/dist/probe/types.d.ts.map +1 -0
  97. package/dist/probe/types.js +11 -0
  98. package/dist/probe/types.js.map +1 -0
  99. package/dist/server/audit.d.ts.map +1 -1
  100. package/dist/server/audit.js +12 -1
  101. package/dist/server/audit.js.map +1 -1
  102. package/dist/server/config.d.ts.map +1 -1
  103. package/dist/server/config.js +33 -2
  104. package/dist/server/config.js.map +1 -1
  105. package/dist/server/server.d.ts +8 -2
  106. package/dist/server/server.d.ts.map +1 -1
  107. package/dist/server/server.js +66 -8
  108. package/dist/server/server.js.map +1 -1
  109. package/dist/server/types.d.ts +7 -1
  110. package/dist/server/types.d.ts.map +1 -1
  111. package/dist/server/types.js +4 -0
  112. package/dist/server/types.js.map +1 -1
  113. package/package.json +7 -2
package/README.md CHANGED
@@ -6,7 +6,7 @@ ARC-1 connects AI assistants (Claude, GitHub Copilot, Copilot Studio, and any MC
6
6
 
7
7
 
8
8
 
9
- **[Full Documentation](https://marianfoo.github.io/arc-1/)** | **[Setup Guide](https://marianfoo.github.io/arc-1/setup-guide/)** | **[Tool Reference](https://marianfoo.github.io/arc-1/tools/)**
9
+ **[Full Documentation](https://marianfoo.github.io/arc-1/)** | **[Quickstart](https://marianfoo.github.io/arc-1/quickstart/)** | **[Tool Reference](https://marianfoo.github.io/arc-1/tools/)**
10
10
 
11
11
  ## Why ARC-1?
12
12
 
@@ -19,6 +19,7 @@ Built for organizations that need AI-assisted SAP development with guardrails. I
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
20
  - **Data access control** — enable table data preview (`--block-data=false`) or free-form SQL (`--block-free-sql=false`)
21
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
+ - **Git workflow safety** — Git operations are disabled by default. Enable explicitly with `--enable-git` / `SAP_ENABLE_GIT=true`
22
23
  - **Safety profiles** — preconfigured roles: `viewer`, `viewer-data`, `viewer-sql`, `developer`, `developer-data`, `developer-sql`
23
24
  - **Writes restricted to `$TMP` when enabled** — only local/throwaway objects; writing to transportable packages requires explicit `--allowed-packages`
24
25
 
@@ -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
 
@@ -50,7 +51,7 @@ Deploy ARC-1 as a Cloud Foundry app on SAP BTP with full platform integration:
50
51
 
51
52
  - **Automatic source caching** — every SAP object read is cached in memory (stdio) or SQLite (http-streamable). Repeated reads return instantly without calling SAP.
52
53
  - **Dependency graph caching** — `SAPContext` dep resolution keyed by source hash; unchanged objects skip all ADT calls on subsequent runs.
53
- - **Pre-warmer** — start with `ARC1_CACHE_WARMUP=true` to pre-index all custom objects at startup, enabling reverse dependency lookup (`SAPContext(action="usages")`).
54
+ - **Pre-warmer** — start with `ARC1_CACHE_WARMUP=true` to pre-index all custom objects at startup, enabling reverse dependency lookup (`SAPContext(action="usages")`) and fast CDS impact workflows (`SAPContext(action="impact", type="DDLS")`).
54
55
  - **Write invalidation** — when `SAPWrite` modifies an object, its cache entry is automatically dropped; next read fetches fresh source.
55
56
 
56
57
  See **[docs/caching.md](docs/caching.md)** for full documentation.
@@ -66,19 +67,20 @@ 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
  |------|-------------|
73
- | **SAPRead** | Read ABAP source, table data, CDS views, metadata extensions (DDLX), service bindings (SRVB), message classes, BOR objects, deployed UI5/Fiori apps (BSP, BSP_DEPLOY). Structured format for classes returns metadata + decomposed includes as JSON |
74
+ | **SAPRead** | Read ABAP source, table data, CDS views, metadata extensions (DDLX), service bindings (SRVB), message classes, BOR objects, deployed UI5/Fiori apps (BSP, BSP_DEPLOY), plus on-prem metadata reads for authorization fields (`AUTH`), feature toggles (`FTG2`), and enhancement implementations (`ENHO`). Structured format for classes returns metadata + decomposed includes as JSON |
74
75
  | **SAPSearch** | Object search + full-text source code search across the system |
75
76
  | **SAPWrite** | Create/update/delete ABAP source and DDIC metadata with automatic lock/unlock (PROG, CLAS, INTF, FUNC, INCL, DDLS, DDLX, BDEF, SRVD, DOMA, DTEL). Batch creation for multi-object workflows (e.g., RAP stack or domain+data element in one call) |
76
77
  | **SAPActivate** | Activate ABAP objects — single or batch (essential for RAP stacks). Publish/unpublish OData service bindings (SRVB) |
77
78
  | **SAPNavigate** | Go-to-definition, find references, code completion |
78
79
  | **SAPQuery** | Execute ABAP SQL with table-not-found suggestions |
79
- | **SAPTransport** | CTS transport management (list, create, release) |
80
- | **SAPContext** | Compressed dependency context one call replaces N SAPRead calls |
81
- | **SAPLint** | Local ABAP lint (system-aware presets, auto-fix, pre-write validation) |
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 (`--enable-git`) |
82
+ | **SAPContext** | Compressed dependency context (`action="deps"`), reverse dependency lookup (`action="usages"`), and CDS upstream/downstream impact analysis (`action="impact"` for DDLS) |
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 |
83
85
  | **SAPManage** | Feature probing — detect what the system supports before acting |
84
86
 
@@ -88,7 +90,7 @@ 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
@@ -99,7 +101,9 @@ ARC-1 probes the SAP system at startup and adapts its behavior:
99
101
  npx arc-1@latest --url https://your-sap-host:44300 --user YOUR_USER
100
102
  ```
101
103
 
102
- For Docker, BTP deployment, client configuration (Claude Desktop, Claude Code, VS Code, Copilot Studio), and all authentication methods, see the **[Setup Guide](https://marianfoo.github.io/arc-1/setup-guide/)**.
104
+ - **Trying it out on your laptop?** [Quickstart](https://marianfoo.github.io/arc-1/quickstart/)
105
+ - **Full local dev setup (Docker, cookie extractor, client configs)?** → [Local Development](https://marianfoo.github.io/arc-1/local-development/)
106
+ - **Deploying for a team / BTP?** → [Deployment](https://marianfoo.github.io/arc-1/deployment/)
103
107
 
104
108
  ## Documentation
105
109
 
@@ -107,12 +111,14 @@ Full documentation is available at **[marianfoo.github.io/arc-1](https://marianf
107
111
 
108
112
  | Guide | Description |
109
113
  |-------|-------------|
110
- | [Setup Guide](https://marianfoo.github.io/arc-1/setup-guide/) | Deployment options, auth methods, client configuration |
111
- | [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all 11 tools |
114
+ | [Quickstart](https://marianfoo.github.io/arc-1/quickstart/) | 5-minute npx + Claude Desktop setup |
115
+ | [Local Development](https://marianfoo.github.io/arc-1/local-development/) | Full local dev all install methods, MCP client configs, SSO cookie extractor |
116
+ | [Deployment](https://marianfoo.github.io/arc-1/deployment/) | Multi-user deployment — Docker, BTP Cloud Foundry, BTP ABAP |
117
+ | [Configuration](https://marianfoo.github.io/arc-1/configuration-reference/) | Every flag and env var, one table |
118
+ | [Updating](https://marianfoo.github.io/arc-1/updating/) | Update procedures per install method |
119
+ | [Enterprise Auth](https://marianfoo.github.io/arc-1/enterprise-auth/) | Layer A / Layer B auth internals, coexistence matrix |
120
+ | [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all 12 tools |
112
121
  | [Architecture](https://marianfoo.github.io/arc-1/architecture/) | System architecture with diagrams |
113
- | [Docker Guide](https://marianfoo.github.io/arc-1/docker/) | Docker deployment reference |
114
- | [Enterprise Auth](https://marianfoo.github.io/arc-1/enterprise-auth/) | All authentication methods |
115
- | [BTP Deployment](https://marianfoo.github.io/arc-1/phase4-btp-deployment/) | Cloud Foundry deployment on SAP BTP |
116
122
  | [AI Usage Patterns](https://marianfoo.github.io/arc-1/mcp-usage/) | Agent workflow patterns and best practices |
117
123
 
118
124
  ## Development
@@ -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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"}
@@ -0,0 +1,25 @@
1
+ import type { WhereUsedResult } from './codeintel.js';
2
+ export interface CdsImpactDownstream {
3
+ projectionViews: WhereUsedResult[];
4
+ bdefs: WhereUsedResult[];
5
+ serviceDefinitions: WhereUsedResult[];
6
+ serviceBindings: WhereUsedResult[];
7
+ accessControls: WhereUsedResult[];
8
+ metadataExtensions: WhereUsedResult[];
9
+ abapConsumers: WhereUsedResult[];
10
+ tables: WhereUsedResult[];
11
+ documentation: WhereUsedResult[];
12
+ other: WhereUsedResult[];
13
+ summary: {
14
+ total: number;
15
+ direct: number;
16
+ indirect: number;
17
+ byBucket: Record<string, number>;
18
+ };
19
+ }
20
+ interface ClassifyOptions {
21
+ includeIndirect?: boolean;
22
+ }
23
+ export declare function classifyCdsImpact(results: WhereUsedResult[], options?: ClassifyOptions): CdsImpactDownstream;
24
+ export {};
25
+ //# sourceMappingURL=cds-impact.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,91 @@
1
+ const BUCKETS = [
2
+ 'projectionViews',
3
+ 'bdefs',
4
+ 'serviceDefinitions',
5
+ 'serviceBindings',
6
+ 'accessControls',
7
+ 'metadataExtensions',
8
+ 'abapConsumers',
9
+ 'tables',
10
+ 'documentation',
11
+ 'other',
12
+ ];
13
+ export function classifyCdsImpact(results, options) {
14
+ const includeIndirect = options?.includeIndirect === true;
15
+ const grouped = {
16
+ projectionViews: [],
17
+ bdefs: [],
18
+ serviceDefinitions: [],
19
+ serviceBindings: [],
20
+ accessControls: [],
21
+ metadataExtensions: [],
22
+ abapConsumers: [],
23
+ tables: [],
24
+ documentation: [],
25
+ other: [],
26
+ };
27
+ let direct = 0;
28
+ let indirect = 0;
29
+ for (const result of results) {
30
+ // Skip package/group container nodes from the usageReferences tree.
31
+ if (result.isResult === false && result.canHaveChildren === true && result.type.split('/')[0] === 'DEVC') {
32
+ continue;
33
+ }
34
+ const isDirect = result.usageInformation?.direct !== false;
35
+ if (!includeIndirect && !isDirect) {
36
+ continue;
37
+ }
38
+ if (isDirect) {
39
+ direct += 1;
40
+ }
41
+ else {
42
+ indirect += 1;
43
+ }
44
+ const bucket = bucketForType(result.type);
45
+ grouped[bucket].push(result);
46
+ }
47
+ const byBucket = {};
48
+ let total = 0;
49
+ for (const bucket of BUCKETS) {
50
+ byBucket[bucket] = grouped[bucket].length;
51
+ total += grouped[bucket].length;
52
+ }
53
+ return {
54
+ ...grouped,
55
+ summary: {
56
+ total,
57
+ direct,
58
+ indirect,
59
+ byBucket,
60
+ },
61
+ };
62
+ }
63
+ function bucketForType(type) {
64
+ const mainType = type.split('/')[0]?.toUpperCase() ?? '';
65
+ switch (mainType) {
66
+ case 'DDLS':
67
+ return 'projectionViews';
68
+ case 'BDEF':
69
+ return 'bdefs';
70
+ case 'SRVD':
71
+ return 'serviceDefinitions';
72
+ case 'SRVB':
73
+ return 'serviceBindings';
74
+ case 'DCLS':
75
+ return 'accessControls';
76
+ case 'DDLX':
77
+ return 'metadataExtensions';
78
+ case 'CLAS':
79
+ case 'INTF':
80
+ case 'PROG':
81
+ case 'FUGR':
82
+ return 'abapConsumers';
83
+ case 'TABL':
84
+ return 'tables';
85
+ case 'SKTD':
86
+ return 'documentation';
87
+ default:
88
+ return 'other';
89
+ }
90
+ }
91
+ //# sourceMappingURL=cds-impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cds-impact.js","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"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"}