{"ref":"artifact:asbrucon-cpiops","page":"/artifacts/asbrucon-cpiops","json":"/artifacts/asbrucon-cpiops.json","generated":"2026-11-09","drafted_with_ai":true,"entity":{"id":"asbrucon-cpiops","name":"CPIOps","artifact_type":"app","ecosystem":"btp","domain":"operations-and-runtime","secondary_domains":["integration-and-messaging","developer-experience"],"origin_ring":"independent","use_as":"dependency","description":{"one_line":"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.","short":"CPI artifacts committed to Git as source files, with a quality check","what_it_solves":"CPIOps runs inside your own SAP BTP subaccount, reads a CPI tenant through a BTP destination and commits each artifact to [GitHub](external:github) or [GitLab](external: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.","when_not_to_use":"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.","to_build_on_it":"The CAP backend, the React UI and Rune's rule list are in the repository under Apache-2.0, so a rule or a second Git layout can be added where the existing ones are defined. The README asks for an issue before a pull request and says an unsolicited one may sit unreviewed for a while on a young, mostly solo-maintained project. The optional AI review layer that adds advisory suggestions on top of Rune's findings is a separate closed add-on and not in this repository."},"links":{"repo":"https://github.com/asbrucon/CPIops"},"identity":{"author":"asbrucon"},"provides":[{"capability":"capability:change-promotion","what_it_does":"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.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Commit artifacts to Git as extracted source files, never as a zip."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Every commit is auto-tagged with its CPI version, like `OrderToSAP_iFlow@1.4`."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- See sync status at a glance: `IN_SYNC`, `CPI_AHEAD`, or `NOT_IN_GIT`."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Run a quality check before every commit and read the report right there."},{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/WHY.md","title":"Why CPIOps — asbrucon/CPIops, On pipelines and SAP's roadmap","checked":"2026-11-03","quote":"It replaces the need to *build* a pipeline just to get CPI artifacts into Git with history."},{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/WHY.md","title":"Why CPIOps — asbrucon/CPIops","checked":"2026-11-03","quote":"Your Git repo stays plain file storage in every case here: there are no webhooks to wire up, no runners to maintain, and no pipeline config to write."}]}],"requires":[{"ref":"artifact:btp-destination","requirement":"required","basis":"binding","role":"destination","for":"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.","sources":[{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md","title":"Creating the CPI Destination — asbrucon/CPIops","checked":"2026-11-03","quote":"CPIOps talks to your CPI tenant through a BTP Destination."},{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md","title":"Deployment details — asbrucon/CPIops, Resources","checked":"2026-11-03","quote":"Destination service: how CPIOps finds your CPI tenant at runtime."}]},{"ref":"artifact:btp-integration-suite","requirement":"required","basis":"binding","role":"cpi-tenant","for":"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.","sources":[{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md","title":"Creating the CPI Destination — asbrucon/CPIops, Prerequisite: entitle the API plan","checked":"2026-11-03","quote":"The destination's credentials come from a service key on a **Process Integration Runtime** instance, plan `api`. If that plan isn't entitled on your subaccount yet, it won't show up when you try to create the instance."},{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md","title":"Creating the CPI Destination — asbrucon/CPIops, Create the service instance","checked":"2026-11-03","quote":"Once created, Cockpit shows it as **Integration Suite - API** with technical name `it-rt`, plan `api`, service `SAP Process Integration Runtime`."}]},{"ref":"artifact:btp-cloud-foundry-runtime","requirement":"required","basis":"binding","role":"runtime","for":"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`.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Deploy to BTP","checked":"2026-11-03","quote":"The app is built to run on Cloud Foundry in your BTP subaccount."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Deploy to BTP","checked":"2026-11-03","quote":"- A BTP subaccount with Cloud Foundry enabled."}]},{"ref":"artifact:btp-authorization-and-trust-management","requirement":"conditional","condition":"The app is deployed to Cloud Foundry; on the local hybrid profile auth is basic auth.","basis":"binding","role":"authentication","for":"Login and roles for the deployed app, entitled in the subaccount and provisioned as the `cpiops-auth` resource of the MTA.","sources":[{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md","title":"Deployment details — asbrucon/CPIops, Resources","checked":"2026-11-03","quote":"XSUAA: handles login and roles."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Deploy to BTP","checked":"2026-11-03","quote":"- Entitlements for XSUAA and Destination."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Run locally","checked":"2026-11-03","quote":"In `hybrid` mode, auth is basic auth; log in with the `admin` or `developer` user you set up in `.cdsrc-private.json`."}]},{"ref":"artifact:btp-hana-cloud","requirement":"conditional","condition":"The app is deployed to Cloud Foundry; local development runs on a SQLite database.","basis":"binding","role":"database","for":"The production database, provisioned as an HDI container whose tables a one-time deployer module creates or updates on each deploy.","sources":[{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md","title":"Deployment details — asbrucon/CPIops, Resources","checked":"2026-11-03","quote":"HANA HDI container: the production database."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Run locally","checked":"2026-11-03","quote":"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."}]},{"ref":"artifact:sap-approuter","requirement":"conditional","condition":"The app is deployed to Cloud Foundry; local development starts the CAP server and the Vite dev server directly.","basis":"binding","role":"entry-point","for":"The single entry point of the deployed app: it enforces login, routes to the CAP backend and serves the bundled UI itself.","sources":[{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DEPLOYMENT.md","title":"Deployment details — asbrucon/CPIops, Modules","checked":"2026-11-03","quote":"The approuter, the single entry point users hit; routes to the backend and enforces login."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Deploy to BTP","checked":"2026-11-03","quote":"(the UI is bundled into and served by the approuter itself, not through HTML5 Application Repository)"}]},{"ref":"external:github","requirement":"conditional","condition":"GitHub is set as the Git provider in Settings.","basis":"binding","role":"git-storage","for":"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.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- 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."}]},{"ref":"external:gitlab","requirement":"conditional","condition":"GitLab is set as the Git provider in Settings.","basis":"binding","role":"git-storage","for":"The repository the extracted source files and version tags are committed to. On GitLab each iFlow gets its own repository, named `group/packageId/artifactId`.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- 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."}]}],"connects":[{"ref":"artifact:btp-cloud-integration","kind":"data","direction":"outbound","style":"sync","via":"artifact:btp-destination","for":"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.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Browse your CPI packages and artifacts live, straight from the tenant."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Run locally","checked":"2026-11-03","quote":"npm run build:api    # pulls the Integration Content OData metadata into CDS models"},{"url":"https://raw.githubusercontent.com/asbrucon/CPIops/main/docs/DESTINATION_SETUP.md","title":"Creating the CPI Destination — asbrucon/CPIops","checked":"2026-11-03","quote":"CPIOps talks to your CPI tenant through a BTP Destination."}]},{"ref":"external:github","kind":"data","direction":"outbound","condition":"GitHub is set as the Git provider in Settings.","for":"Committing each artifact's extracted source files and tagging the commit with the artifact's CPI version.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Commit artifacts to Git as extracted source files, never as a zip."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Every commit is auto-tagged with its CPI version, like `OrderToSAP_iFlow@1.4`."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- 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."}]},{"ref":"external:gitlab","kind":"data","direction":"outbound","condition":"GitLab is set as the Git provider in Settings.","for":"Committing each artifact's extracted source files and tagging the commit with the artifact's CPI version, one repository per iFlow.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- 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."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Features","checked":"2026-11-03","quote":"- Commit artifacts to Git as extracted source files, never as a zip."}]}],"interfaces":[{"key":"web-ui","kind":"ui","direction":"in","for":"The screen a person works in: browsing a tenant's packages and artifacts, reading the quality report, committing, and the Settings for the CPI connection, the Git connection, the branch model and the quality thresholds. Opened at the approuter URL of the deployed app.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README","checked":"2026-11-03","quote":"CPIOps is a web app that runs inside your own SAP BTP subaccount."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Deploy to BTP","checked":"2026-11-03","quote":"Open the app at its approuter URL"},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README","checked":"2026-11-03","quote":"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."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Settings","checked":"2026-11-03","quote":"- **Quality thresholds**: tune which Rune findings you care about."}]},{"key":"odata-rest-api","kind":"api","direction":"in","for":"The API the app's own React UI calls: the CAP backend serves it at `/api` and `/odata`, and in local development the Vite dev server proxies both to it.","sources":[{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Run locally","checked":"2026-11-03","quote":"This port serves the OData/REST API only; there is no UI here."},{"url":"https://github.com/asbrucon/cpiops","title":"asbrucon/CPIops — README, Run locally","checked":"2026-11-03","quote":"The UI proxies `/api` and `/odata` calls to the backend, so both need to be running."}]}],"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-11-03"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"0 contributors, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-07, not archived"}],"compatibility":[{"label":"Declared for","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Survived majors","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"9 test files"},{"label":"Docs","tier":"good","evidence":"docs/ with 5 pages, README 8 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":6,"unit":"watching"}]},"signals":{"crawled_at":"2026-11-08","npm":"not published under this name","stars":6,"forks":1,"open_issues":1,"archived":false,"pushed_at":"2026-07-28","language":"TypeScript","license_spdx":"Apache-2.0","org_owned":true,"default_branch":"main","created_at":"2026-07-12T15:29:12Z","open_prs":0,"tree_truncated":false,"test_files":9,"workflows":0,"other_ci":false,"readme_bytes":8519,"docs_files":5,"changelog":false,"license_file":true,"dts_files":1,"first_commit":"2026-05-05","last_commit":"2026-07-28","commits":46,"contributors":0,"readme_path":"README.md","readme_sha":"0e838dd4028101d6934cc06a22a90f09bad9a9af","repo_read":"2026-11-08"},"edges":{"maintainers":[],"contributors":[],"explained_by":[{"ref":"content:cpiops-quality-checks-and-git-integration-for-all-your-iflows","name":"CPIOps: Quality Checks and Git Integration for All Your iFlows","json":"/content/cpiops-quality-checks-and-git-integration-for-all-your-iflows.json"}],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}