AppApptypeAn application you deploy and use, installed into a system or loaded into an application as a component, rather than a library whose functions you call.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

CPIOps

A web app deployed into your own BTP subaccount that commits a Cloud Integration tenant's artifacts to GitHub or GitLab as extracted source files, each commit tagged with the artifact's CPI version.

CPIOps runs inside your own SAP BTP subaccount, reads a CPI tenant through a BTP destination and commits each artifact to GitHub or GitLab as extracted source files instead of a zip, with every commit auto-tagged with its CPI version such as OrderToSAP_iFlow@1.4. The artifact list shows per artifact whether tenant and repository agree, as IN_SYNC, CPI_AHEAD or NOT_IN_GIT. Before each commit it runs Rune, a quality engine written in TypeScript that runs in the same CAP process and covers Groovy, XSLT, iFlow XML and ABAP BAdI source; error findings block the commit while warnings and info only surface. Git is used as plain file storage, so there are no webhooks to wire up, no runners to maintain and no pipeline config to write. Promoting artifacts across tenants is outside it; where a pipeline already does that, CPIOps sits alongside it.

Facts

Last pushLicenceApache-2.0

Where it sits

Lives in
Provides
Change promotionBTPChange promotioncapabilityMoving a change through the environments of a landscape, from development through test to production, and knowing which change has reached which environment. A [CI/CD pipeline](capability:ci-cd) builds and tests on each source change, [deployment](capability:deployment) puts a build onto its runtime, and getting source into git is [source control](capability:abap-source-control).
Requires
SAP Destination serviceSAP Destination serviceartifactThe destination holds the CPI tenant's API URL and its OAuth client credentials; a destination service instance has to be bound, locally through cds bind, for the app to start at all.SAP Integration SuiteSAP Integration SuiteartifactThe tenant whose packages and artifacts the app browses and commits. The destination's credentials come from a service key on a Process Integration Runtime instance, plan api, which has to be entitled on the subaccount before the instance can be created.SAP BTP, Cloud Foundry RuntimeSAP BTP, Cloud Foundry RuntimeartifactThe runtime the app is built for: the multi-target archive is deployed to Cloud Foundry in a subaccount that has it enabled, and the local setup still creates the destination service instance and key through cf.
Optional
SAP Authorization and Trust Management serviceSAP Authorization and Trust Management serviceartifactLogin and roles for the deployed app, entitled in the subaccount and provisioned as the cpiops-auth resource of the MTA.SAP HANA CloudSAP HANA CloudartifactThe production database, provisioned as an HDI container whose tables a one-time deployer module creates or updates on each deploy.@sap/approuter@sap/approuterartifactThe single entry point of the deployed app: it enforces login, routes to the CAP backend and serves the bundled UI itself.GitHubGitHuboutside the atlasThe repository the extracted source files and version tags are committed to. One repository per package, org/packageId, with each iFlow in its own folder, reached with a token carrying the repo scope.GitLabGitLaboutside the atlasThe repository the extracted source files and version tags are committed to. On GitLab each iFlow gets its own repository, named group/packageId/artifactId.

Who is behind it

asbrucon

Before choosing this

Conditions

PracticalFunctional boundary

A pipeline that already promotes artifacts across tenants stays where it is; what CPIOps replaces is the work of building a pipeline just to get CPI artifacts into Git with history. If SAP ships native Git integration for the tenant, the documented answer is to stop using CPIOps, because the repository already holds the full commit history and nothing has to be migrated.

What it declares

Every artifact

Type
App
Origin
Independently maintained

As an app

Where it runs
does not say
Distributed through
does not say

Connections12

CPIOps connectionsCPIOpsPROVIDES→ provides1provides stated Takes each artifact out of a CPI tenant as extracted source files, commits them to GitHub or GitLab and tags every commit with the artifact's CPI version, so the repository carries the version history the tenant does not. The list shows per artifact whether the tenant and the repository agree — `IN_SYNC`, `CPI_AHEAD` or `NOT_IN_GIT` — and a quality check runs before every commit, with `error` findings stopping it. Git holds plain files, so no runner, webhook or pipeline config sits between the tenant and the repository. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops Why CPIOps — asbrucon/CPIops, On pipelines and SAP's roadmap: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/WHY.md Why CPIOps — asbrucon/CPIops: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/WHY.mdChange promotionNEEDS→ connects to3connects to stated Listing the tenant's packages and artifacts live and reading their source to check and commit; the build step pulls the Integration Content OData metadata into the app's CDS models. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Run locally: https://github.com/asbrucon/cpiops Creating the CPI Destination — asbrucon/CPIops: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.mdCloud Integrationconnects to stated If: GitHub is set as the Git provider in Settings. Committing each artifact's extracted source files and tagging the commit with the artifact's CPI version. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiopsGitHubifconnects to stated If: GitLab is set as the Git provider in Settings. Committing each artifact's extracted source files and tagging the commit with the artifact's CPI version, one repository per iFlow. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiopsGitLabif→ needs3needs stated The runtime the app is built for: the multi-target archive is deployed to Cloud Foundry in a subaccount that has it enabled, and the local setup still creates the destination service instance and key through `cf`. asbrucon/CPIops — README, Deploy to BTP: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Deploy to BTP: https://github.com/asbrucon/cpiopsSAP BTP, Cloud Foundry Runtimeneeds stated The destination holds the CPI tenant's API URL and its OAuth client credentials; a destination service instance has to be bound, locally through `cds bind`, for the app to start at all. Creating the CPI Destination — asbrucon/CPIops: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md Deployment details — asbrucon/CPIops, Resources: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.mdSAP Destination serviceneeds stated The tenant whose packages and artifacts the app browses and commits. The destination's credentials come from a service key on a Process Integration Runtime instance, plan `api`, which has to be entitled on the subaccount before the instance can be created. Creating the CPI Destination — asbrucon/CPIops, Prerequisite: entitle the API plan: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md Creating the CPI Destination — asbrucon/CPIops, Create the service instance: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.mdSAP Integration Suite→ optionally needs5optionally needs stated If: The app is deployed to Cloud Foundry; local development starts the CAP server and the Vite dev server directly. The single entry point of the deployed app: it enforces login, routes to the CAP backend and serves the bundled UI itself. Deployment details — asbrucon/CPIops, Modules: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md asbrucon/CPIops — README, Deploy to BTP: https://github.com/asbrucon/cpiops@sap/approuterifoptionally needs stated If: GitHub is set as the Git provider in Settings. The repository the extracted source files and version tags are committed to. One repository per package, `org/packageId`, with each iFlow in its own folder, reached with a token carrying the `repo` scope. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiopsGitHubifoptionally needs stated If: GitLab is set as the Git provider in Settings. The repository the extracted source files and version tags are committed to. On GitLab each iFlow gets its own repository, named `group/packageId/artifactId`. asbrucon/CPIops — README, Features: https://github.com/asbrucon/cpiopsGitLabifoptionally needs stated If: The app is deployed to Cloud Foundry; on the local hybrid profile auth is basic auth. Login and roles for the deployed app, entitled in the subaccount and provisioned as the `cpiops-auth` resource of the MTA. Deployment details — asbrucon/CPIops, Resources: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md asbrucon/CPIops — README, Deploy to BTP: https://github.com/asbrucon/cpiops asbrucon/CPIops — README, Run locally: https://github.com/asbrucon/cpiopsSAP Authorization and Trust Managementserviceifoptionally needs stated If: The app is deployed to Cloud Foundry; local development runs on a SQLite database. The production database, provisioned as an HDI container whose tables a one-time deployer module creates or updates on each deploy. Deployment details — asbrucon/CPIops, Resources: https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md asbrucon/CPIops — README, Run locally: https://github.com/asbrucon/cpiopsSAP HANA Cloudif

Learn more1

Readings
  1. CPIOps: Quality Checks and Git Integration for All Your iFlowsPavan_SJ, SAP Community

README

quoted from asbrucon/CPIops under Apache-2.0, read
asbrucon/CPIops/README.mdOn GitHub

License Issues

CPIOps: Bringing Git to SAP Integration Suite

CPIOps is a web app that runs inside your own SAP BTP subaccount. It connects to a CPI tenant and a Git repository, and lets you browse artifacts, run a quality check, and commit clean source files to Git from one screen, with no pipeline, CLI, or Docker required.

For the reasoning behind these design choices, see Why CPIOps.

Features

  • Browse your CPI packages and artifacts live, straight from the tenant.
  • See sync status at a glance: IN_SYNC, CPI_AHEAD, or NOT_IN_GIT.
  • Run a quality check before every commit and read the report right there.
  • Commit artifacts to Git as extracted source files, never as a zip.
  • Every commit is auto-tagged with its CPI version, like OrderToSAP_iFlow@1.4.
  • Works with GitHub or GitLab. On GitLab each iFlow is its own repo (group/packageId/artifactId); on GitHub, which has no subgroups, each package is one repo (org/packageId) and every iFlow lives in its own folder. For GitHub set the Git Organization URL to your org (the owner must be an org or the token's own user) and use a token with the repo scope.

Architecture

Everything runs inside your BTP subaccount. Git is used as plain file storage, so there is nothing to set up on the Git side.

Architecture

How it works

Connect CPI and Git in Settings, browse a package, run the quality check, and commit; the version tag gets applied automatically. See the full step-by-step walkthrough with video and gifs in docs/WALKTHROUGH.md.

Rune: the quality engine

Rune checks code before it reaches Git. It is written in pure TypeScript and runs inside the same CAP process as the rest of the app, so there is nothing extra to install or patch on the tenant side, with no JVM and no CodeNarc ruleset to sync. error findings block the commit; warnings and info surface without getting in your way. It covers Groovy, XSLT, iFlow XML, and ABAP BAdI source.

See the full rule list, grouped by file type, in docs/RUNE.md.

Optional: AI review add-on

CPIOps can optionally connect to an AI review layer that reads iFlows, scripts, and mappings and adds advisory suggestions on top of Rune's findings. It never blocks a commit, it only advises. This layer is experimental, a separate closed add-on, and not part of this repository. Reach out if you'd like a demo.

Run locally

The app is two separate processes in local dev: the CAP backend (API + auth + DB) and the React UI (Vite). The UI proxies /api and /odata calls to the backend, so both need to be running.

Prerequisites:

  • Node.js and npm.
  • Optionally, @sap/cds-dk installed globally (npm i -g @sap/cds-dk) for convenience running cds commands directly.
  • A BTP destination service instance, bound locally via cds bind (see step 1 below) — this is required for the app to start at all. Whether that destination actually points at a real CPI tenant is up to you: without one, the app still starts but there is nothing to browse or commit. See Creating the CPI Destination for the full walkthrough.

1. Start the backend (from cpiops/):

npm install

# Copy the example config files and fill in your own values
cp .env.example .env
cp .cdsrc-private.json.example .cdsrc-private.json

.env only needs LOG_LEVEL (optional) — the CPI destination name, Git provider, and Git group URL aren't set from files at all; you configure them from the app's own Settings screen once it's running, and they're stored in the app's database from then on.

In .cdsrc-private.json, fill in auth.users by hand (its IntegrationContent.credentials.destination value doesn't matter — CPIOps always overrides it at runtime with whatever destination name you set in Settings). For the destinations service, don't hand-edit the binding block — generate it instead with cds bind (already available via the @sap/cds-dk devDependency, no global install needed):

cf login                                              # if not already logged in and targeted at your space
cf create-service destination lite cpiops-destination-dev    # skip if you already have a destination service instance
cf create-service-key cpiops-destination-dev local            # skip if you already have a key for it

npx cds bind destinations -2 cpiops-destination-dev:local

cpiops-destination-dev / local are just suggested names for a first run — the dev suffix keeps this local-only instance from colliding with the cpiops-destination instance the mta.yaml deploy later creates in the same space. Use your own names if you already have an instance and key.

This reads your current cf target and the service key, then writes the resolved destinations.binding block straight into .cdsrc-private.json under the [hybrid] profile, so there's no CF org/space/API-endpoint JSON to copy by hand.

npm run build:api    # pulls the Integration Content OData metadata into CDS models
                      # (only needed once, or again if the SAP API definition changes)
npm run build:db     # deploys the local SQLite schema
npm run start:dev     # starts the CAP server on the `hybrid` profile

The server listens on http://localhost:4004 by default. In hybrid mode, auth is basic auth; log in with the admin or developer user you set up in .cdsrc-private.json. The hybrid profile is what lets the app run on a local SQLite database while still reaching your real CPI tenant through a BTP destination. This port serves the OData/REST API only; there is no UI here.

2. Start the UI (from cpiops/app/cpiops-ui/, in a second terminal):

cd cpiops/app/cpiops-ui/
npm install
npm run dev

Vite serves the React app at http://localhost:5173 and proxies /api and /odata requests to the backend on :4004 (see vite.config.ts). Open http://localhost:5173 in the browser; this is the actual app UI for local development, not :4004.

Deploy to BTP

The app is built to run on Cloud Foundry in your BTP subaccount.

Before you start, you need:

  • A BTP subaccount with Cloud Foundry enabled.
  • Entitlements for XSUAA and Destination.
  • The cf CLI, logged in to your org and space.
  • The mbt build tool installed.

Build and deploy:

npm run build:cf    # builds the multi-target archive with mbt
npm run deploy:cf   # deploys the archive to Cloud Foundry

After the deploy:

  1. Open the app at its approuter URL — find it with cf app cpiops, or in the BTP cockpit under Cloud Foundry → your space → Applications → cpiops (the UI is bundled into and served by the approuter itself, not through HTML5 Application Repository).
  2. Create a Destination that points to your CPI tenant — see Creating the CPI Destination for the full walkthrough (entitling the API plan, creating the service instance and key, and filling in the destination fields).
  3. Open Settings in the app and finish the CPI and Git connection.

For what each module and resource in mta.yaml does, see Deployment details.

Settings

Once the app is open, set up:

  • CPI connection: base URL and OAuth credentials for your tenant.
  • Git: provider, repository, and access token.
  • Branch model: a single main branch, or an optional develop → main flow.
  • Quality thresholds: tune which Rune findings you care about.

Contributing

Bug reports and feature requests are welcome. Please open an issue in the repo first.

If you'd like to contribute code, please open an issue first to discuss the change before submitting a pull request. This is a young, mostly solo-maintained project, so an unsolicited PR may sit unreviewed for a while; talking it through first means your effort isn't spent on a direction the project isn't ready for.

License

Apache-2.0, see LICENSE.

Roadmap / Status

The full flow, browse, quality check, and commit, has been tested end-to-end against a real test CPI tenant.

Planned next: wiring up the optional AI review add-on (see Optional: AI review add-on) as a connectable layer instead of a separate demo.

Apache-2.0, read
Change promotion
  1. HammerNative macOS code editor for ABAP and CDSfrom ABAP
  2. SAP Cloud Transport ManagementMoves MTA archives and content between SAP BTP accountsfrom BTP/BAIP
  3. Cloud ALM Link for ADTEclipse plugin linking ABAP transports to SAP Cloud ALM featuresfrom ABAP
  4. EPOD ADT MCP ServerMCP server for ABAP on the ADT session, in Eclipse or standalonefrom ABAP
  5. abapGit Transport GeneratorCofile and data file generated from an abapGit repositoryfrom ABAP
  6. furkancosgun/Transport-Management-ToolUploads, downloads and imports ABAP transport requests as filesfrom ABAP
  7. furkancosgun/ZWARPAdds a program's dependent objects to a transport requestfrom ABAP
  8. abapToCSAP GUI transaction for one-click transports of copiesfrom ABAP
  9. ABAP remote filesystemVS Code extension editing ABAP systems over ADT as a filesystemfrom ABAP
  10. ActiveControl Transport form creatorVS Code extension automating ActiveControl transport formsfrom ABAP
  11. ZCTS_BROWSERReport creating transports of copies without a new versionfrom ABAP
  12. git-env-branchesShows which feature branches reached which environment branchfrom General
  13. qttTool mapping BEx queries to the transport requests carrying themfrom ABAP
  14. ABAP Development Tools for VS CodeSAP's ABAP tools in VS Code, over RFC to on-premise or HTTP to cloudfrom ABAP
  15. abap-adt-cliCLI that pulls and pushes ABAP packages as local files over ADTfrom ABAP
  16. KlystronMCP server in ABAP inside the application server, with agent skillsfrom ABAP
  17. ZTCTA transport checking tool that analyses ABAP transports at object level before they move to production, determining a safe order and flagging risks.from ABAP

Details

Sources3
GitHub APIdiscovered herechecked
github.com/asbrucon/CPIopstree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
discovered viaGitHub API
first seen in the atlas
ecosystem and domainbtp, operations-and-runtime
History in the atlas1
  1. First seen.
For your agent
Ref
artifact:asbrucon-cpiops
JSON
/artifacts/asbrucon-cpiops.json
MCP
Connecting an agent