Feature: Project CLI coverage boost for uncovered error paths As a developer I want to exercise the uncovered error-handling branches in project.py So that line and branch coverage improves for cli/commands/project.py Background: Given the project CLI coverage mocks are prepared # ── _get_resource_link_repo / _get_resource_registry_service helpers ── Scenario: _get_resource_link_repo returns a link repo from the container When I call the real _get_resource_link_repo helper Then the coverage link repo helper should return successfully Scenario: _get_resource_registry_service returns a registry service from the container When I call the real _get_resource_registry_service helper Then the coverage registry service helper should return successfully # ── create command: resource linking raises NotFoundError ── Scenario: create command warns when resource linking raises NotFoundError Given the project repo mock is configured for successful create And the link repo mock raises NotFoundError on create_link When I invoke the CLI create command with name "notfound-proj" and resource "bad-res" Then the coverage CLI result should contain "Warning" And the coverage CLI exit code should be 0 # ── create command: resource linking raises DatabaseError ── Scenario: create command warns when resource linking raises DatabaseError Given the project repo mock is configured for successful create And the link repo mock raises DatabaseError on create_link When I invoke the CLI create command with name "dblink-proj" and resource "fail-res" Then the coverage CLI result should contain "Warning" And the coverage CLI exit code should be 0 # ── create command: re-fetch project raises generic Exception ── Scenario: create command falls back when re-fetching project raises Exception Given the project repo mock is configured for create but get raises Exception When I invoke the CLI create command with name "refetch-proj" without resources Then the coverage CLI result should contain "created" And the coverage CLI exit code should be 0 # ── link-resource command: create_link raises DatabaseError ── Scenario: link-resource command fails when create_link raises DatabaseError Given the project repo mock returns a valid project for get And the registry mock returns a valid resource And the link repo mock raises DatabaseError on create_link for link-resource When I invoke the CLI link-resource command for project "local/linkdb-proj" resource "some-res" Then the coverage CLI result should contain "Error linking resource" And the coverage CLI exit code should be 1 # ── unlink-resource command: user declines confirmation ── Scenario: unlink-resource command aborts when user declines confirmation Given the project repo mock returns a valid project for get And the registry mock returns a valid resource And the link repo mock returns a matching link for unlink When I invoke the CLI unlink-resource command without yes and user declines Then the coverage CLI exit code should be 1 # ── unlink-resource command: remove_link raises DatabaseError ── Scenario: unlink-resource command fails when remove_link raises DatabaseError Given the project repo mock returns a valid project for get And the registry mock returns a valid resource And the link repo mock returns a matching link for unlink And the link repo mock raises DatabaseError on remove_link When I invoke the CLI unlink-resource command with yes Then the coverage CLI result should contain "Error unlinking resource" And the coverage CLI exit code should be 1 # ── list command: list_projects raises DatabaseError ── Scenario: list command fails when list_projects raises DatabaseError Given the project repo mock raises DatabaseError on list_projects When I invoke the CLI list command Then the coverage CLI result should contain "Error listing projects" And the coverage CLI exit code should be 1 # ── delete command: user declines confirmation ── Scenario: delete command aborts when user declines confirmation Given the project repo mock returns a project with no linked resources When I invoke the CLI delete command without yes and user declines Then the coverage CLI exit code should be 1 # ── delete command: repo.delete raises DatabaseError ── Scenario: delete command fails when repo.delete raises DatabaseError Given the project repo mock returns a project with no linked resources And the project repo mock raises DatabaseError on delete When I invoke the CLI delete command with yes Then the coverage CLI result should contain "Error deleting project" And the coverage CLI exit code should be 1 # ── delete command: repo.delete returns False ── Scenario: delete command fails when repo.delete returns False Given the project repo mock returns a project with no linked resources And the project repo mock returns False on delete When I invoke the CLI delete command with yes Then the coverage CLI result should contain "could not be deleted" And the coverage CLI exit code should be 1