{"_id":"@arc-mcp/adt-ls","_rev":"3-a24ffb23dcf73cd7e443952b404d2d27","name":"@arc-mcp/adt-ls","dist-tags":{"latest":"0.7.0"},"versions":{"0.5.0":{"name":"@arc-mcp/adt-ls","version":"0.5.0","keywords":["sap","abap","adt","adt-ls","sdk"],"author":{"name":"marianfoo"},"license":"Apache-2.0","_id":"@arc-mcp/adt-ls@0.5.0","maintainers":[{"name":"marianfoo","email":"marianbsp@gmail.com"}],"homepage":"https://github.com/arc-mcp/adt-ls#readme","bugs":{"url":"https://github.com/arc-mcp/adt-ls/issues"},"dist":{"shasum":"28584e0262f237a5fe7400e651c3f484919cf7f8","tarball":"https://registry.npmjs.org/@arc-mcp/adt-ls/-/adt-ls-0.5.0.tgz","fileCount":6,"integrity":"sha512-YlYiOtCmWLFWttTlzXk9xn/ZLAFKuzkDUCAWYiQv0+yuqQDm2hBNwDoInNkNgjismbP3zp0/ER+/DB80EX11/g==","signatures":[{"sig":"MEYCIQCbjI6kF1XIIe/qqecsZVmbwAPOQaYCItetlz78SwWTEAIhAP9fJqhaPlc0vlGJ4cikS7Og7TKM81jN5JCYILYrCFSD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":320235},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","prepack":"tsup","docs:api":"typedoc","docs:html":"typedoc --options typedoc.html.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run lint && npm run typecheck"},"_npmUser":{"name":"marianfoo","email":"marianbsp@gmail.com"},"repository":{"url":"git+https://github.com/arc-mcp/adt-ls.git","type":"git"},"_npmVersion":"10.9.4","description":"Generic TypeScript SDK over SAP's headless adt-ls (adt-lsc, from the sapse.adt-vscode extension).","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"vscode-jsonrpc":"^8.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.9","typedoc":"^0.28.19","typescript":"^5.6.3","@types/node":"^22.9.0","@biomejs/biome":"^1.9.4","typedoc-plugin-markdown":"^4.12.0"},"_npmOperationalInternal":{"tmp":"tmp/adt-ls_0.5.0_1781726720965_0.6478156615286232","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@arc-mcp/adt-ls","version":"0.6.1","keywords":["sap","abap","adt","adt-ls","sdk"],"author":{"name":"marianfoo"},"license":"Apache-2.0","_id":"@arc-mcp/adt-ls@0.6.1","maintainers":[{"name":"marianfoo","email":"marianbsp@gmail.com"}],"homepage":"https://github.com/arc-mcp/adt-ls#readme","bugs":{"url":"https://github.com/arc-mcp/adt-ls/issues"},"dist":{"shasum":"1cf584258d703d41f40f6c7484410ea08060a9c7","tarball":"https://registry.npmjs.org/@arc-mcp/adt-ls/-/adt-ls-0.6.1.tgz","fileCount":6,"integrity":"sha512-e76/kC1SL0u3QTKNID7IlfA4aRq1hY9Li4sUDIJBCSs/cmtsRRBpj4FiAo/3O3qOZkcyuJo2GfTRbeLekBXRmw==","signatures":[{"sig":"MEQCIDEPczCouaD4qZmWbalY5svxXyTxQplch3KKPUZZJm6SAiAPIcTvZMSL32S0JtPjVdE6C5B8cFPaKH3nFDSJuiLLKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC8OiAT3nf4b3N9TbpKTQSeHCxOmxa6qx7rC7MPK7WvUwIhANhL2U0kYhtmNXDuKJl26c7w10t98ZXSh91Bcg4bz9op","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arc-mcp%2fadt-ls@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":360949},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"062d66791c4f149b703e7030ff14a399f1e96675","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","prepack":"tsup","docs:api":"typedoc","docs:html":"typedoc --options typedoc.html.json","typecheck":"tsc --noEmit","test:watch":"vitest","inspect:adt-ls":"node scripts/inspect-adt-ls.mjs","prepublishOnly":"npm run lint && npm run typecheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1f63830-a762-40b7-bef9-bd112e3ae19e"}},"repository":{"url":"git+https://github.com/arc-mcp/adt-ls.git","type":"git"},"_npmVersion":"11.19.0","description":"Generic TypeScript SDK over SAP's headless adt-ls (adt-lsc, from the sapse.adt-vscode extension).","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"vscode-jsonrpc":"^8.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.9","typedoc":"^0.28.19","typescript":"^5.6.3","@types/node":"^22.9.0","@biomejs/biome":"^1.9.4","typedoc-plugin-markdown":"^4.12.0"},"_npmOperationalInternal":{"tmp":"tmp/adt-ls_0.6.1_1790198139060_0.25601724250975777","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@arc-mcp/adt-ls@0.7.0","bugs":{"url":"https://github.com/arc-mcp/adt-ls/issues"},"dist":{"shasum":"ecaf7022e576a6c04529c66c1b327e7b9571db12","tarball":"https://registry.npmjs.org/@arc-mcp/adt-ls/-/adt-ls-0.7.0.tgz","fileCount":6,"integrity":"sha512-Syeym1+WXF0X2lWuBcvmKgna8jLjrvdRUEUcaekb+zLLRtS0CxC/mZKzJiAHR6yMioYebfkEFAHY5BtXC/rfgQ==","signatures":[{"sig":"MEYCIQCv0OrD7T/TKrDKx4M3JbFfxt3lEir/J7ePsKxc3HZkagIhAJMlrpejkv23MmogWAIy2vyFlQKEGP8EqMvmk0BwLZuJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEXMGqBOMWI7HhgpuaqsIltZ52mQDPzNOwrvR4i9LvBoAiEAiZdwUXtRTez0pnmSboVTVanYXdcgXyGS+6RGS84c+ek="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arc-mcp%2fadt-ls@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":382368},"main":"./dist/index.js","name":"@arc-mcp/adt-ls","type":"module","types":"./dist/index.d.ts","author":{"name":"marianfoo"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"917031238b8e018149b7da6436da5594adfab5a0","license":"Apache-2.0","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","prepack":"tsup","docs:api":"typedoc","docs:html":"typedoc --options typedoc.html.json","typecheck":"tsc --noEmit","test:watch":"vitest","inspect:adt-ls":"node scripts/inspect-adt-ls.mjs","prepublishOnly":"npm run lint && npm run typecheck"},"version":"0.7.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"a1f63830-a762-40b7-bef9-bd112e3ae19e"}},"homepage":"https://github.com/arc-mcp/adt-ls#readme","keywords":["sap","abap","adt","adt-ls","sdk"],"repository":{"url":"git+https://github.com/arc-mcp/adt-ls.git","type":"git"},"_npmVersion":"11.19.0","description":"Generic TypeScript SDK over SAP's headless adt-ls (adt-lsc, from the sapse.adt-vscode extension).","directories":{},"maintainers":[{"name":"marianfoo","email":"marianbsp@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"vscode-jsonrpc":"^8.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.9","typedoc":"^0.28.19","typescript":"^5.6.3","@types/node":"^22.9.0","@biomejs/biome":"^1.9.4","typedoc-plugin-markdown":"^4.12.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adt-ls_0.7.0_1790892825933_0.4733438396329974"}}},"time":{"created":"2026-06-17T20:05:20.811Z","modified":"2026-10-01T22:13:46.364Z","0.5.0":"2026-06-17T20:05:21.125Z","0.6.1":"2026-09-23T21:15:39.172Z","0.7.0":"2026-10-01T22:13:46.030Z"},"bugs":{"url":"https://github.com/arc-mcp/adt-ls/issues"},"author":{"name":"marianfoo"},"license":"Apache-2.0","homepage":"https://github.com/arc-mcp/adt-ls#readme","keywords":["sap","abap","adt","adt-ls","sdk"],"repository":{"url":"git+https://github.com/arc-mcp/adt-ls.git","type":"git"},"description":"Generic TypeScript SDK over SAP's headless adt-ls (adt-lsc, from the sapse.adt-vscode extension).","maintainers":[{"name":"marianfoo","email":"marianbsp@gmail.com"}],"readme":"# @arc-mcp/adt-ls\n\n[![npm](https://img.shields.io/npm/v/@arc-mcp/adt-ls.svg)](https://www.npmjs.com/package/@arc-mcp/adt-ls)\n[![license: Apache-2.0](https://img.shields.io/npm/l/@arc-mcp/adt-ls.svg)](LICENSE)\n\n> Generic, reusable TypeScript SDK over SAP's headless **adt-ls** — the `adt-lsc`\n> language server shipped inside the official `sapse.adt-vscode` extension. It hides\n> the painful setup (discovery, JVM, named-pipe + LSP handshake, reentrance logon,\n> TLS/truststore, session resilience) so that *driving adt-ls is a few lines of code*.\n\n**Status: published on npm; current runtime compatibility verified on macOS arm64.** The full SAP authoring\nlifecycle (search → create → update → read → activate → run-tests → delete), plus code\nintelligence, quality gates, ABAP formatting, transport, and OData service info, all run\nend-to-end through `createAdtLs()` against a real S/4HANA system (adt-ls\n`1.1.2.202608131517`). Runs under **Node ≥ 20 and Bun** (both verified live).\n\n## Install\n\n```bash\nnpm install @arc-mcp/adt-ls\n```\n\nYou **bring adt-ls** (SAP Developer License — not redistributable): install the\n`sapse.adt-vscode` extension (VS Code / Cursor) and the library auto-discovers it, or\nvendor the per-platform VSIX for CI. **New here → [docs/setup.md](https://github.com/arc-mcp/adt-ls/blob/main/docs/setup.md)**:\nwhich platform build to download, CI vendoring, and connecting with auth.\n**Eclipse users:** Eclipse ADT and the headless runtime have separate versions.\nYour Eclipse installation does not supply this SDK's runtime; install/update\n`SAPSE.adt-vscode` as described above. [Current compatibility research and migration notes](docs/research/2026-09-11-current-adt-compatibility.md).\n\nThis release requires `adt-ls >= 1.1.2` and is verified against `1.1.2.202608131517`.\n\n## Quickstart\n\n```ts\nimport { createAdtLs, basic } from '@arc-mcp/adt-ls';\n\nconst adt = await createAdtLs({\n  connection: { systemUrl: 'https://my-s4:50001', selfSigned: true, client: '001' },\n  auth: basic('DEVELOPER', process.env.SAP_PW!), // or bearer(token) / interactive({ openUrl }) / clientCert({ cert, key })\n});\n\nconst hits = await adt.repository.search('CL_ABAP*', { types: ['CLAS/OC'] });\nconst src = await adt.source.read({ name: 'ZCL_FOO', objectType: 'CLAS/OC' });\n\nawait adt.lifecycle.create({ objectType: 'CLAS/OC', name: 'ZCL_BAR', packageName: '$TMP', description: 'demo' });\nawait adt.lifecycle.activate({ name: 'ZCL_BAR', objectType: 'CLAS/OC' });\n\nawait adt.dispose();\n```\n\n### Auth strategies\n\nThe on-the-wire logon is always a reentrance ticket; `auth` supplies the credential:\n\n- `basic(user, password)` — headless user/password (on-prem fixed user).\n- `bearer(token | getToken)` — headless OAuth bearer (BTP ABAP / Steampunk).\n- `interactive({ openUrl })` — the consumer opens the SSO URL; a human signs in (the lib\n  ships no browser/TTY).\n- `clientCert({ cert, key })` — **passwordless X.509 mutual TLS, no browser.** The reverse\n  proxy presents the client cert on every upstream hop, so the backend authenticates the TLS\n  connection itself and the reentrance handler runs with no credential. Requires\n  `connection.selfSigned`. Server-side this is the standard AS ABAP\n  [X.509 client-certificate logon](https://help.sap.com/docs/ABAP_PLATFORM_NEW/68bf513362174d54b58cddec28794093/bb5d22518bc72214e10000000a44176d.html)\n  + [rule-based mapping (CERTRULE)](https://help.sap.com/docs/ABAP_PLATFORM_NEW/e815bb97839a4d83be6c4fca48ee5777/c830fd902dc8473b9e59db1576cc784b.html);\n  it needs no KDC and no license (unlike Kerberos/SPNEGO). In an enterprise the cert is\n  typically issued by SAP Secure Login Service (often from a Kerberos/SAML logon) or a\n  corporate PKI. Consumers wire the cert source + server setup; arc-1-lsp ships a full guide.\n\n```ts\nimport { createAdtLs, clientCert } from '@arc-mcp/adt-ls';\nimport { readFileSync } from 'node:fs';\n\nconst adt = await createAdtLs({\n  connection: { systemUrl: 'https://my-s4:50001', selfSigned: true, client: '001' },\n  auth: clientCert({ cert: readFileSync('client.crt'), key: readFileSync('client.key') }),\n});\n```\n\n### Low-level building blocks\n\nConsumers that drive adt-ls themselves — e.g. **proxying its MCP endpoint** to external\nagents — can skip `createAdtLs()` and use the primitives directly (this is what\n`abapify/openadt` adopts):\n\n```ts\nimport { resolveAdtLsPath, AdtLsDriver, startMcpServer } from '@arc-mcp/adt-ls';\n\nconst driver = new AdtLsDriver(resolveAdtLsPath(), {\n  extraArgs: ['-consoleLog', `-Djco.middleware.snc_lib=${sncLib}`], // SNC/JCo JVM flags\n});\nawait driver.start(); // discovery + spawn + LSP initialize (short pipe; macOS-safe)\n// register your own logon handlers: driver.setRequestHandler('adtLs/destinations/requestBrowserBasedLogon', …)\nconst { port, token } = await startMcpServer(driver, { port: 2240, token: myToken });\n// → proxy http://localhost:${port}/mcp (Authorization: Bearer ${token}) however you like\nawait driver.dispose();\n```\n\n## Capabilities\n\nOne namespaced client over both adt-ls channels (LSP + its own MCP) — the split is hidden:\n\n- **`capabilities()`** — fresh LSP providers and all MCP tool contracts, including schemas and annotations.\n- **`repository`** — object search, file read/write/delete, inactive-object list, name→URI resolver.\n- **`source` / `lifecycle`** — read; create, update, **activate** (native — per-phase diagnostics, `forceActivation`), run unit tests, delete; RAP generators; creatable-type catalog + **creation-form** (legal values per field), type-specific creation fields + validation.\n- **`navigation`** — document symbols, definition/declaration, references, type hierarchy, hover, completion (with **resolve** → method signatures + ABAP-Doc), syntax check, **semantic tokens**, and **ABAP Pretty-Printer formatting**.\n- **`quality`** — ATC static analysis + ABAP Unit code coverage.\n- **`services`** — run a console app, service-binding details/publish, and live **OData service info** (URL + entity sets).\n- **`transport`** — find / create / assign / list, lock status, and the **transport decision oracle** (`check`), and paged **transport diffs** (`getDiff`, backend-dependent).\n- **`raw`** — escape hatches to any adt-ls MCP tool or LSP method.\n\nWhat maps to which adt-ls call: the **[capability matrix](https://github.com/arc-mcp/adt-ls/blob/main/docs/capability-matrix.md)**. What's reachable headless vs. not (with live evidence): the **[capability survey](https://github.com/arc-mcp/adt-ls/blob/main/docs/adt-ls-capabilities.md)**.\n\n## Documentation\n\n- **[Setup guide](https://github.com/arc-mcp/adt-ls/blob/main/docs/setup.md)** — **start here**: where to get the binary, which platform build, CI vendoring, and connecting with auth.\n- **[📖 API reference (hosted)](https://arc-mcp.github.io/adt-ls/)** — the full TypeDoc site, auto-published to GitHub Pages on every push to `main`.\n- **[Usage guide](https://github.com/arc-mcp/adt-ls/blob/main/docs/usage.md)** — connecting, auth, the full API with examples, resilience, logging.\n- **[Use cases](https://github.com/arc-mcp/adt-ls/blob/main/docs/use-cases.md)** — dev-tool & CI/CD recipes (ABAP Unit gate, ATC, syntax check, MCP server, scaffolding) with the API to use.\n- **[API reference (Markdown)](https://github.com/arc-mcp/adt-ls/blob/main/docs/api/README.md)** — the same reference rendered in-repo (`npm run docs:api`).\n- **[Capability matrix](https://github.com/arc-mcp/adt-ls/blob/main/docs/capability-matrix.md)** — the method surface + the object-type support boundary.\n- **[adt-ls capability survey](https://github.com/arc-mcp/adt-ls/blob/main/docs/adt-ls-capabilities.md)** — what the live binary offers vs. what's wrapped, and the known coverage gaps.\n- **[ADRs](https://github.com/arc-mcp/adt-ls/tree/main/docs/adr)** — the architecture decisions (0001–0013).\n\n---\n\n## Why this exists\n\nTwo first-party projects already drive headless adt-ls and **reimplement the same\nfragile, reverse-engineered plumbing**: `abapify/openadt` (its\n`@openadt/sap-adt-mcp-launcher`) and `arc-1-lsp` (`src/adt-ls/*`). Both encode the\nidentical landmines (the `userAgentInfos` NPE, HTTPS-only + hostname verification,\nsilent session death, the reentrance-ticket dance). The fragmentation that actually\nhurt here is **first-party duplication**, and the cure is one shared library.\n\nThe thesis: adt-ls is the *correct* path (SAP-maintained CSRF/locking/activation/XML),\nbut its setup is so much harder than calling ADT REST directly that people avoid it.\nThis library makes adt-ls **as easy to use as a plain API**, so the easy choice is\nalso the right one.\n\n## Scope — the hard line\n\n**adt-ls ONLY.** No direct ADT/SAP HTTP, no SAP ADT SDK sidecar, no MCP server, no\nCloud-Connector/BTP bridge *inside* the library. What adt-ls can't do headless is out\nof scope. See [ADR-0001](docs/adr/0001-scope-adt-ls-only.md).\n\n## Current verification (2026-09-11)\n\nTarget: adt-ls **1.1.2.202608131517**, bundled SAP Machine **21.12.0**, macOS arm64,\nA4H over HTTPS port 443. The library's minimum runtime is **1.1.2** because activation,\nABAP Unit, inactive-object listing and deletion contracts changed after the old baseline.\n\nThe test suite checks the real LSP handshake and presence of the MCP authoring tools;\nbackend tests cover create/update/read/activate/test/delete, code intelligence, creation\nforms, service info, dictionary source and ABAP Unit coverage. Failure-path tests cover\nstartup cleanup and MCP JSON/SSE, pagination, errors and timeouts.\n\nSee [research and validation](docs/research/2026-09-11-current-adt-compatibility.md) for\nmeasured results and the remaining platform/backend boundaries. This is not a claim of\nfull Eclipse feature parity.\n\n## Consumers\n\n- **arc-1-lsp** — replaces its `src/adt-ls/*` entirely; keeps its own MCP server, BTP/Cloud-Connector\n  bridge (via the `connection.forwardProxy` hook), authz, and write-safety as thin wrappers over the lib.\n- **openADT** — its TypeScript launcher core can converge onto this lib.\n","readmeFilename":"README.md"}