mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
feat(forge): Phase 4 — GitLab + Gitea repo-provisioning parity (#581)
GitLab's create_org_repo (services/forge/gitlab.py) replaces the Phase-3
synthetic 501 with a real implementation: resolves org (a group's full
path, subgroups included) to a numeric namespace id via GET
/groups/{path}, falling back to the token's own namespace on a 404
(personal-namespace projects); POSTs /projects with the
name/path/description/visibility/initialize_with_readme payload
(visibility mapped private->"private"/"internal"); reshapes the 201
onto the GitHub fields callers read (full_name/clone_url/html_url) and
GitLab's duplicate-path 400 "has already been taken" onto GitHub's 422
shape, text preserved. Gitea's create_org_repo was already real but
untested — added transport-level coverage.
GitHubProvisioningService (services/github_provisioning.py) is now
provider-aware: ROBOCO_PROVISIONING_PROVIDER (github default / gitlab /
gitea) and ROBOCO_PROVISIONING_HOST (self-hosted instance, required for
gitlab/gitea or the service stays disabled exactly like a missing
token/org) pick the target forge; the class/factory names stay
GitHub-flavored for backward compatibility (pitch.py and existing
imports untouched). A shared _is_already_exists() helper recognizes
GitHub's "already exists" (422), Gitea's (409/422 "already exists"),
and GitLab's reshaped "has already been taken" (422). The existing-repo
re-fetch now builds a provider-aware RepoRef (GitLab packs org/name
into the owner field; GitHub/Gitea keep the owner,repo pair). Default
behavior (no new env set) is byte-for-byte the Phase-1 GitHub path,
pinned by a regression test.
Gates: ruff format/check clean, mypy roboco/+tests/ clean (1235 files),
xenon A/A/B clean, targeted suite (forge + provisioning + pitch) 79/79
green.
Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
@@ -163,6 +163,11 @@ select = [
|
||||
# by the release/spotlight/on-demand callers — same "bundling would just
|
||||
# relocate the same named fields behind one hop" rationale as prompter.py.
|
||||
"roboco/services/video_engine.py" = ["PLR0913"]
|
||||
# GitHubProvisioningService.__init__ is a provider-selection constructor
|
||||
# (token/org/base_url/timeout/client plus Phase-4's provider_name/host) —
|
||||
# every kwarg is independently override-able by callers/tests, same
|
||||
# bundling-adds-no-clarity rationale as prompter.py above.
|
||||
"roboco/services/github_provisioning.py" = ["PLR0913"]
|
||||
# Gateway methods are typed verb surfaces — agent-facing kwargs reflect the
|
||||
# verb contract (task title, description, acceptance criteria, assignee, etc.). Bundling
|
||||
# into a dataclass hides the field-by-field schema the LLM needs at the
|
||||
|
||||
Reference in New Issue
Block a user