fix(cli): add --url flag to resource add for git resource type (#6322)
CI / benchmark-publish (pull_request) Has been skipped
CI / push-validation (pull_request) Successful in 19s
CI / build (pull_request) Successful in 22s
CI / helm (pull_request) Successful in 24s
CI / lint (pull_request) Failing after 28s
CI / quality (pull_request) Successful in 44s
CI / typecheck (pull_request) Successful in 51s
CI / security (pull_request) Successful in 1m32s
CI / coverage (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Has been skipped
CI / e2e_tests (pull_request) Successful in 3m13s
CI / integration_tests (pull_request) Successful in 4m11s
CI / unit_tests (pull_request) Successful in 7m7s
CI / docker (pull_request) Has been skipped
CI / status-check (pull_request) Failing after 1s

Ensure git resources accept a remote URL flag and persist the value via CLI validation and properties.

ISSUES CLOSED: #6322
This commit is contained in:
2026-04-09 22:20:49 +00:00
parent fc9c730670
commit 77aa12e1a4
3 changed files with 108 additions and 7 deletions
@@ -0,0 +1,14 @@
Feature: Git resource CLI supports URL flag
Background:
Given a fresh in-memory resource registry
And built-in types are bootstrapped
Scenario: Adding a git resource with only a URL
When I run resource add "git" "local/upstream" with url "git@github.com:org/upstream.git"
Then the resource command should succeed
And the resource registry resource "local/upstream" should have property "url" equal to "git@github.com:org/upstream.git"
Scenario: Using --url with a non-git resource type is rejected
When I run resource add type "fs-directory" name "local/data" path "/tmp/data" url "git@github.com:org/upstream.git"
Then the resource command should fail
And the resource output should contain "--url is only valid for git resources"
+69 -7
View File
@@ -254,7 +254,23 @@ def step_run_type_remove(context: Context, name: str) -> None:
# ---- Resource Add ----
def _do_resource_add(context: Context, type_name: str, name: str, path: str) -> None:
def _do_resource_add(
context: Context,
type_name: str,
name: str,
path: str | None,
*,
branch: str | None = None,
description: str | None = None,
image: str | None = None,
container_id: str | None = None,
mount: list[str] | None = None,
url: str | None = None,
clone_into: str | None = None,
read_only: bool = False,
update: bool = False,
fmt: str = "rich",
) -> None:
"""Run resource add command (shared impl)."""
from cleveragents.cli.commands.resource import resource_add
@@ -265,12 +281,16 @@ def _do_resource_add(context: Context, type_name: str, name: str, path: str) ->
type_name=type_name,
name=name,
path=path,
branch=None,
description=None,
read_only=False,
clone_into=None,
update=False,
fmt="rich",
branch=branch,
description=description,
image=image,
container_id=container_id,
mount=mount,
url=url,
clone_into=clone_into,
read_only=read_only,
update=update,
fmt=fmt,
)
context.resource_cli_output = output
context.resource_cli_failed = failed
@@ -294,6 +314,24 @@ def step_given_resource_add(
_do_resource_add(context, type_name, name, path)
@when('I run resource add "{type_name}" "{name}" with url "{url_value}"')
def step_run_resource_add_url(
context: Context, type_name: str, name: str, url_value: str
) -> None:
"""Run resource add for a resource using only --url."""
_do_resource_add(context, type_name, name, None, url=url_value)
@when(
'I run resource add type "{type_name}" name "{name}" path "{path}" url "{url_value}"'
)
def step_run_resource_add_path_url(
context: Context, type_name: str, name: str, path: str, url_value: str
) -> None:
"""Run resource add providing both path and url flags."""
_do_resource_add(context, type_name, name, path, url=url_value)
# ---- Resource List ----
@@ -401,12 +439,36 @@ def step_resource_output_contains(context: Context, text: str) -> None:
)
@then("the resource command should succeed")
def step_resource_command_succeeded(context: Context) -> None:
"""Ensure the resource CLI command completed successfully."""
failed = getattr(context, "resource_cli_failed", False)
assert not failed, "Expected command to succeed but it failed"
@then("the resource command should fail")
def step_resource_command_failed(context: Context) -> None:
"""Check that the command failed."""
assert context.resource_cli_failed, "Expected command to fail but it succeeded"
@then(
'the resource registry resource "{resource_name}" should have property '
'"{property_name}" equal to "{expected_value}"'
)
def step_resource_property_equals(
context: Context, resource_name: str, property_name: str, expected_value: str
) -> None:
"""Assert that the stored resource has the expected property value."""
service = _make_service(context)
resource = service.show_resource(resource_name)
properties = resource.properties or {}
actual_value = properties.get(property_name)
assert (
actual_value == expected_value
), f"Expected property '{property_name}' to be '{expected_value}', got '{actual_value}'"
@then("the resource output should be valid JSON")
def step_resource_output_valid_json(context: Context) -> None:
"""Check that the output is valid JSON."""
+25
View File
@@ -586,6 +586,13 @@ def resource_add(
str | None,
typer.Option("--branch", "-b", help="Branch for git-checkout resources"),
] = None,
url: Annotated[
str | None,
typer.Option(
"--url",
help="Remote URL for git resources (required for remote-only repositories)",
),
] = None,
description: Annotated[
str | None,
typer.Option("--description", "-d", help="Resource description"),
@@ -689,6 +696,22 @@ def resource_add(
)
raise typer.Abort()
if url is not None:
if type_name != "git":
console.print(
"[red]Validation error:[/red] --url is only valid for git resources."
)
raise typer.Abort()
url_value = url.strip()
if not url_value:
console.print(
"[red]Validation error:[/red] --url must not be empty."
)
raise typer.Abort()
else:
url_value = None
# Validate --container-id usage rules.
if container_id is not None and image is not None:
console.print(
@@ -747,6 +770,8 @@ def resource_add(
properties["path"] = path
if branch is not None:
properties["branch"] = branch
if url_value is not None:
properties["url"] = url_value
if image is not None:
properties["image"] = image
if container_id is not None: