Prism uses a provider-neutral change-request workflow with GitHub, GitLab, and Forgejo adapters. Codeberg is a built-in Forgejo host profile, not a separate protocol. Provider-specific terms such as pull request and merge request are used only where they clarify the hosting service's UI.
| Host or server | Transport | Compatibility statement |
|---|---|---|
| GitHub.com | gh |
Built in and covered by contract fixtures. |
| GitHub Enterprise Server | gh |
Requires an explicit host mapping. Support is conditional on the configured /api/v3 API and is not in the pinned local-server matrix. |
| GitLab.com | glab and GitLab API v4 |
Built in and covered by contract fixtures plus read-only public drift probes. |
| GitLab Self-Managed | glab and GitLab API v4 |
Requires an explicit host mapping. The scheduled local suite pins GitLab CE 18.2.0-ce.0; other API v4 server versions are handled from observed API behavior rather than guaranteed by a version range. |
| Forgejo | HTTPS API v1 | Requires an explicit host mapping. Read operations discover server capabilities. Create and guarded merge are qualified only for Forgejo majors 9 through 16 and fail closed outside that range. The local suite pins 11.0.1; fixtures cover majors 9 and 11. |
| Codeberg | HTTPS API v1 | Built-in Forgejo profile. Version and enabled features are discovered at runtime; the fixture set currently includes Codeberg's observed 16 development version, and a weekly credential-free repository smoke test checks the live read path. |
An unknown hostname is never guessed or probed. Map self-hosted servers under
[remote_hosts."hostname"]; see Configuration.
GitHub delegates credentials and requests to gh:
gh auth login --hostname github.comGitLab delegates credentials and requests to glab:
glab auth login --hostname gitlab.comRun the corresponding command with a mapped self-hosted hostname when needed. Prism never copies either CLI's token into its configuration or database.
Forgejo and Codeberg use direct HTTPS. Configuration names the environment variable containing the token; it never contains the token value:
[remote_hosts."codeberg.org"]
provider = "forgejo"
credential_env = "CODEBERG_TOKEN"Export that variable only in the environment that launches Prism. Public repositories may be readable without a token, but create, merge, private repository access, and some policy endpoints require authorization.
Supported means the adapter implements the operation. Conditional means the
server, repository configuration, product tier, or token permissions determine
availability. Unknown and incomplete observations never authorize mutation.
| Capability | GitHub | GitLab | Forgejo / Codeberg |
|---|---|---|---|
| List and inspect change requests | Supported | Supported | Supported |
| Review threads | Supported | Supported | Conditional |
| Resolve review conversations | Supported | Supported | Unsupported |
| Check/status rollup | Supported | Supported | Supported |
| CI logs | Supported | Conditional | Conditional |
| Repository policy | Conditional | Conditional | Conditional |
| Fetch and create | Supported | Supported | Fetch supported; create version-conditional |
| Exact-head guarded merge | Supported | Conditional | Version- and policy-conditional |
| Merge queue or train | Unknown | Conditional | Unsupported |
Important provider-specific gaps:
- GitHub policy evidence can be incomplete when pagination or rulesets are not observed. Prism reports unknown evidence instead of assuming no policy.
- GitLab traces, approval policy, external checks, and merge trains depend on permissions and product tier. GitLab merge-request rebase is not exposed as a Prism merge method.
- Forgejo has no supported review-conversation resolution operation or merge queue. Prism does not simulate either behavior.
- Codeberg Actions availability is repository-specific and hosted Actions are intentionally limited. External status checks, including Woodpecker status, do not grant Prism access to CI logs. Woodpecker log retrieval is not part of the hosting adapter.
Run diagnostics from the affected repository:
prism --repo /path/to/repo doctor
prism --repo /path/to/repo debug info
prism --repo /path/to/repo debug logs
prism --repo /path/to/repo debug pathsprism doctor reports the resolved provider, canonical host and project,
transport, authentication availability, declared capabilities, and a Forgejo
server version when reachable. It reports missing gh, glab, or a configured
credential environment variable without printing credential values.
Use debug info for effective runtime/configuration facts and debug logs for
classified provider failures. Start Prism with --print-logs --log-level debug
when reproducing a problem. Use prism debug record for a bounded TUI flight
recording. Diagnostics redact known credential forms and do not include HTTP
response bodies, but review any artifact before sharing it because repository
and local path metadata may still be private.
Common failures:
remote: unavailablefor an unknown self-host means the host needs an explicit mapping; Prism has not probed it.authenticationunavailable means the matching CLI login is missing, the Forgejo token variable is unset, or the token lacks access.policy,ci_logs, orqueueshown as conditional/unknown is a capability result, not an empty successful observation. Automatic merge remains blocked.- A Forgejo version outside majors 9 through 16 remains readable where safe, but create and merge are disabled.
.github/workflows/remote-compatibility.yml is separate from normal CI. It runs
weekly or by manual dispatch and can select GitLab, Forgejo, public drift probes,
or all suites.
- Local compatibility jobs start fixed GitLab CE and Forgejo image versions on runner-local ports, make only disposable local requests, and run the matching adapter fixture tests. They never mutate a public service.
- The drift job sends unauthenticated GET requests only to fixed GitHub.com, GitLab.com, and Codeberg endpoints. The Codeberg smoke test reads identity for a stable public Forgejo repository, one page containing at most one pull request, and, when one is available, at most one review plus at most one combined status for its exact head commit. Empty pull-request, review, and status lists are valid observations. It never sends credentials or a mutating HTTP method.
- The drift artifact contains only fixed host/provider identity, API version, schema/capability metadata, classified HTTP outcome, aggregate latency, bounded byte and item counts, and observation time. Response bodies, headers, repository or user content, dynamic identifiers, and URLs are not retained.
- A missing tool, Docker daemon, or pinned image produces an explicit
SKIP. Once a local image starts, readiness or schema failure fails that compatibility job. Public network unavailability is recorded asunavailable; it also fails the scheduled drift job, while a manual probe may retain the classified observation without failing. Reachable HTTP errors or schema drift always fail the drift job.
Run the same scaffolding locally with:
scripts/remote-compatibility.sh forgejo
scripts/remote-compatibility.sh gitlab
scripts/remote-drift-probe.sh self-test
scripts/remote-drift-probe.sh all